/ Hex Artifact Content
Login

Artifact 78ff6c355ccc2d211350f507bccfcd95118169e8:


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 35 39 20 32  eaux.c,v 1.459 2
02c0: 30 30 39 2f 30 36 2f 30 35 20 31 34 3a 31 37 3a  009/06/05 14:17:
02d0: 32 35 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  25 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 30 3b 0a 20 20 20 20    return 0;.    
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 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20  f( nOp>0 ){.    
2620: 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f  int i;.    VdbeO
2630: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e  pList const *pIn
2640: 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28   = aOp;.    for(
2650: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c  i=0; i<nOp; i++,
2660: 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69   pIn++){.      i
2670: 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b  nt p2 = pIn->p2;
2680: 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70  .      VdbeOp *p
2690: 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b  Out = &p->aOp[i+
26a0: 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75  addr];.      pOu
26b0: 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d  t->opcode = pIn-
26c0: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70  >opcode;.      p
26d0: 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70  Out->p1 = pIn->p
26e0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c  1;.      if( p2<
26f0: 30 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65  0 && sqlite3Vdbe
2700: 4f 70 63 6f 64 65 48 61 73 50 72 6f 70 65 72 74  OpcodeHasPropert
2710: 79 28 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 2c 20  y(pOut->opcode, 
2720: 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 29 7b 0a 20  OPFLG_JUMP) ){. 
2730: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
2740: 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32  = addr + ADDR(p2
2750: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2760: 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32          pOut->p2
2770: 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20   = p2;.      }. 
2780: 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20       pOut->p3 = 
2790: 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70  pIn->p3;.      p
27a0: 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  Out->p4type = P4
27b0: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20  _NOTUSED;.      
27c0: 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a  pOut->p4.p = 0;.
27d0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d        pOut->p5 =
27e0: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
27f0: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f  E_DEBUG.      pO
2800: 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30  ut->zComment = 0
2810: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
2820: 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63  te3VdbeAddopTrac
2830: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
2840: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
2850: 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61  0, i+addr, &p->a
2860: 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20  Op[i+addr]);.   
2870: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2880: 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20  }.    p->nOp += 
2890: 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nOp;.  }.  retur
28a0: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
28b0: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
28c0: 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72  e of the P1 oper
28d0: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
28e0: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
28f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2900: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
2910: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
2920: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
2930: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
2940: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
2950: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
2960: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
2970: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
2980: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
2990: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
29a0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
29b0: 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  1(Vdbe *p, int a
29c0: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
29d0: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
29e0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
29f0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
2a00: 69 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30  if( p && addr>=0
2a10: 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20   && p->nOp>addr 
2a20: 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  && p->aOp ){.   
2a30: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31   p->aOp[addr].p1
2a40: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
2a50: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2a60: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20  value of the P2 
2a70: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
2a80: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
2a90: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
2aa0: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f  ine is useful fo
2ab0: 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70  r setting a jump
2ac0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f   destination..*/
2ad0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2ae0: 65 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a  eChangeP2(Vdbe *
2af0: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
2b00: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
2b10: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69   p==0 || p->magi
2b20: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
2b30: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  IT );.  if( p &&
2b40: 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e   addr>=0 && p->n
2b50: 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f  Op>addr && p->aO
2b60: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  p ){.    p->aOp[
2b70: 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a  addr].p2 = val;.
2b80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
2b90: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
2ba0: 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   the P3 operand 
2bb0: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
2bc0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
2bd0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
2be0: 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c  hangeP3(Vdbe *p,
2bf0: 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76   int addr, int v
2c00: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
2c10: 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  ==0 || p->magic=
2c20: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2c30: 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61   );.  if( p && a
2c40: 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70  ddr>=0 && p->nOp
2c50: 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20  >addr && p->aOp 
2c60: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
2c70: 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20  dr].p3 = val;.  
2c80: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
2c90: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2ca0: 68 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f  he P5 operand fo
2cb0: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
2cc0: 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65  tly.** added ope
2cd0: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ration..*/.void 
2ce0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2cf0: 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20  eP5(Vdbe *p, u8 
2d00: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
2d10: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  p==0 || p->magic
2d20: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
2d30: 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  T );.  if( p && 
2d40: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61 73  p->aOp ){.    as
2d50: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
2d60: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ;.    p->aOp[p->
2d70: 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b  nOp-1].p5 = val;
2d80: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
2d90: 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72  ange the P2 oper
2da0: 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69  and of instructi
2db0: 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20  on addr so that 
2dc0: 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  it points to.** 
2dd0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
2de0: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
2df0: 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e  ion to be coded.
2e00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2e10: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62  VdbeJumpHere(Vdb
2e20: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
2e30: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
2e40: 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20  angeP2(p, addr, 
2e50: 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  p->nOp);.}.../*.
2e60: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
2e70: 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
2e80: 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20  e is ephemeral, 
2e90: 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49  then free it.  I
2ea0: 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66  f.** the FuncDef
2eb0: 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c   is not ephermal
2ec0: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e  , then do nothin
2ed0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
2ee0: 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46  d freeEphemeralF
2ef0: 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  unction(sqlite3 
2f00: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44  *db, FuncDef *pD
2f10: 65 66 29 7b 0a 20 20 69 66 28 20 70 44 65 66 20  ef){.  if( pDef 
2f20: 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  && (pDef->flags 
2f30: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50  & SQLITE_FUNC_EP
2f40: 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  HEM)!=0 ){.    s
2f50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2f60: 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pDef);.  }.}../
2f70: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34  *.** Delete a P4
2f80: 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73   value if necess
2f90: 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
2fa0: 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74  oid freeP4(sqlit
2fb0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79  e3 *db, int p4ty
2fc0: 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20  pe, void *p4){. 
2fd0: 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 73   if( p4 ){.    s
2fe0: 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b  witch( p4type ){
2ff0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52  .      case P4_R
3000: 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EAL:.      case 
3010: 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20  P4_INT64:.      
3020: 63 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a  case P4_MPRINTF:
3030: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 44  .      case P4_D
3040: 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61  YNAMIC:.      ca
3050: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20  se P4_KEYINFO:. 
3060: 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54       case P4_INT
3070: 41 52 52 41 59 3a 0a 20 20 20 20 20 20 63 61 73  ARRAY:.      cas
3080: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  e P4_KEYINFO_HAN
3090: 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20  DOFF: {.        
30a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
30b0: 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  , p4);.        b
30c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
30d0: 20 20 20 20 63 61 73 65 20 50 34 5f 56 44 42 45      case P4_VDBE
30e0: 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20  FUNC: {.        
30f0: 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46  VdbeFunc *pVdbeF
3100: 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20  unc = (VdbeFunc 
3110: 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20 66 72  *)p4;.        fr
3120: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
3130: 69 6f 6e 28 64 62 2c 20 70 56 64 62 65 46 75 6e  ion(db, pVdbeFun
3140: 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20  c->pFunc);.     
3150: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
3160: 6c 65 74 65 41 75 78 44 61 74 61 28 70 56 64 62  leteAuxData(pVdb
3170: 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  eFunc, 0);.     
3180: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3190: 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63 29 3b  (db, pVdbeFunc);
31a0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
31b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
31c0: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
31d0: 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68  .        freeEph
31e0: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64  emeralFunction(d
31f0: 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29  b, (FuncDef*)p4)
3200: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3210: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
3220: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
3230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
3240: 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f  ueFree((sqlite3_
3250: 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20  value*)p4);.    
3260: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3270: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
3280: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20  ./*.** Change N 
3290: 6f 70 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67  opcodes starting
32a0: 20 61 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f   at addr to No-o
32b0: 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ps..*/.void sqli
32c0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
32d0: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
32e0: 20 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20   addr, int N){. 
32f0: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61 4f 70   if( p && p->aOp
3300: 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   ){.    VdbeOp *
3310: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
3320: 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr];.    sqlite3
3330: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
3340: 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a    while( N-- ){.
3350: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
3360: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
3370: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 20 20  p->p4.p);.      
3380: 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73  memset(pOp, 0, s
3390: 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a  izeof(pOp[0]));.
33a0: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
33b0: 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  e = OP_Noop;.   
33c0: 20 20 20 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a     pOp++;.    }.
33d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
33e0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
33f0: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
3400: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
3410: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
3420: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
3430: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
3440: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
3450: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
3460: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
3470: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
3480: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
3490: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
34a0: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
34b0: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
34c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
34d0: 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72  then the P4 oper
34e0: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
34f0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
3500: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
3510: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
3520: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
3530: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
3540: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
3550: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
3560: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
3570: 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP4 up to and in
3580: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
3590: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
35a0: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
35b0: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
35c0: 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d  P4..**.** If n==
35d0: 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65  P4_KEYINFO it me
35e0: 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73 20  ans that zP4 is 
35f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  a pointer to a K
3600: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
3610: 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d  ..** A copy is m
3620: 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49 6e  ade of the KeyIn
3630: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 74  fo structure int
3640: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
3650: 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
3660: 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20  3_malloc, to be 
3670: 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56  freed when the V
3680: 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  dbe is finalized
3690: 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e  ..** n==P4_KEYIN
36a0: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63  FO_HANDOFF indic
36b0: 61 74 65 73 20 74 68 61 74 20 7a 50 34 20 70 6f  ates that zP4 po
36c0: 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66  ints to a KeyInf
36d0: 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73  o structure.** s
36e0: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
36f0: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
3700: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  has obtained fro
3710: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
3720: 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  . The .** caller
3730: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65   should not free
3740: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c   the allocation,
3750: 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
3760: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
3770: 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e  is.** finalized.
3780: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
3790: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
37a0: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
37b0: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
37c0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
37d0: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
37e0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
37f0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
3800: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
3810: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
3820: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
3830: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
3840: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
3850: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
3860: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
3870: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
3880: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
3890: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
38a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
38b0: 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65  dbeChangeP4(Vdbe
38c0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63   *p, int addr, c
38d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
38e0: 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f  int n){.  Op *pO
38f0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
3900: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ;.  assert( p!=0
3910: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
3920: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
3930: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
3940: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
3950: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->aOp==0 || db->
3960: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
3970: 20 20 20 20 69 66 20 28 6e 20 21 3d 20 50 34 5f      if (n != P4_
3980: 4b 45 59 49 4e 46 4f 29 20 7b 0a 20 20 20 20 20  KEYINFO) {.     
3990: 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28   freeP4(db, n, (
39a0: 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26  void*)*(char**)&
39b0: 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zP4);.    }.    
39c0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
39d0: 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f  sert( addr<p->nO
39e0: 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  p );.  if( addr<
39f0: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
3a00: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20  p->nOp - 1;.    
3a10: 69 66 28 20 61 64 64 72 3c 30 20 29 20 72 65 74  if( addr<0 ) ret
3a20: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d  urn;.  }.  pOp =
3a30: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
3a40: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70    freeP4(db, pOp
3a50: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
3a60: 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  4.p);.  pOp->p4.
3a70: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d  p = 0;.  if( n==
3a80: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
3a90: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
3aa0: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
3ab0: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
3ac0: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
3ad0: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
3ae0: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
3af0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
3b00: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
3b10: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
3b20: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
3b30: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
3b40: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
3b50: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
3b60: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
3b70: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3b80: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d   P4_NOTUSED;.  }
3b90: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b  else if( n==P4_K
3ba0: 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65  EYINFO ){.    Ke
3bb0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
3bc0: 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c  .    int nField,
3bd0: 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69   nByte;..    nFi
3be0: 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a  eld = ((KeyInfo*
3bf0: 29 7a 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20  )zP4)->nField;. 
3c00: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
3c10: 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28  f(*pKeyInfo) + (
3c20: 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66  nField-1)*sizeof
3c30: 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  (pKeyInfo->aColl
3c40: 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20  [0]) + nField;. 
3c50: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
3c60: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 42 79  lite3Malloc( nBy
3c70: 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  te );.    pOp->p
3c80: 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  4.pKeyInfo = pKe
3c90: 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70  yInfo;.    if( p
3ca0: 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
3cb0: 20 75 38 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b   u8 *aSortOrder;
3cc0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b  .      memcpy(pK
3cd0: 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79  eyInfo, zP4, nBy
3ce0: 74 65 29 3b 0a 20 20 20 20 20 20 61 53 6f 72 74  te);.      aSort
3cf0: 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f  Order = pKeyInfo
3d00: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  ->aSortOrder;.  
3d10: 20 20 20 20 69 66 28 20 61 53 6f 72 74 4f 72 64      if( aSortOrd
3d20: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b  er ){.        pK
3d30: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
3d40: 65 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  er = (unsigned c
3d50: 68 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e  har*)&pKeyInfo->
3d60: 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20  aColl[nField];. 
3d70: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b         memcpy(pK
3d80: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
3d90: 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c 20  er, aSortOrder, 
3da0: 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d  nField);.      }
3db0: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
3dc0: 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b  pe = P4_KEYINFO;
3dd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3de0: 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46    p->db->mallocF
3df0: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
3e00: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
3e10: 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d  4_NOTUSED;.    }
3e20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
3e30: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
3e40: 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  FF ){.    pOp->p
3e50: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
3e60: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
3e70: 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a  e = P4_KEYINFO;.
3e80: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20    }else if( n<0 
3e90: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
3ea0: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
3eb0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3ec0: 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b   (signed char)n;
3ed0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
3ee0: 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c  ( n==0 ) n = sql
3ef0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34  ite3Strlen30(zP4
3f00: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  );.    pOp->p4.z
3f10: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
3f20: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20  Dup(p->db, zP4, 
3f30: 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  n);.    pOp->p4t
3f40: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
3f50: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
3f60: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68   NDEBUG./*.** Ch
3f70: 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ange the comment
3f80: 20 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f 73 74   on the the most
3f90: 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20   recently coded 
3fa0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72  instruction.  Or
3fb0: 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d  .** insert a No-
3fc0: 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63  op and add the c
3fd0: 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e  omment to that n
3fe0: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ew instruction. 
3ff0: 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74   This.** makes t
4000: 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74  he code easier t
4010: 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65  o read during de
4020: 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f  bugging.  None o
4030: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a  f this happens.*
4040: 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f  * in a productio
4050: 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  n build..*/.void
4060: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
4070: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
4080: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
4090: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
40a0: 74 20 61 70 3b 0a 20 20 61 73 73 65 72 74 28 20  t ap;.  assert( 
40b0: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
40c0: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
40d0: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
40e0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
40f0: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
4100: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
4110: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
4120: 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20  nOp ){.    char 
4130: 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70  **pz = &p->aOp[p
4140: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
4150: 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  t;.    va_start(
4160: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
4170: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4180: 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20  p->db, *pz);.   
4190: 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d   *pz = sqlite3VM
41a0: 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46  Printf(p->db, zF
41b0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
41c0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a  va_end(ap);.  }.
41d0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
41e0: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64  beNoopComment(Vd
41f0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
4200: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
4210: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
4220: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4230: 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(p, OP_Noop);
4240: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
4250: 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  p>0 || p->aOp==0
4260: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
4270: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
4280: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
4290: 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ment==0 || p->db
42a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
42b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29  ;.  if( p->nOp )
42c0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20  {.    char **pz 
42d0: 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  = &p->aOp[p->nOp
42e0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20  -1].zComment;.  
42f0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
4300: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c  Format);.    sql
4310: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
4320: 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20  , *pz);.    *pz 
4330: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
4340: 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  f(p->db, zFormat
4350: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
4360: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  d(ap);.  }.}.#en
4370: 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a  dif  /* NDEBUG *
4380: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
4390: 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  the opcode for a
43a0: 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20   given address. 
43b0: 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73 20   If the address 
43c0: 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72  is -1, then.** r
43d0: 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72  eturn the most r
43e0: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
43f0: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49   opcode..**.** I
4400: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
4410: 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20  ation error has 
4420: 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 74  occurred prior t
4430: 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66  o the calling of
4440: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
4450: 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72  , then a pointer
4460: 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65   to a dummy Vdbe
4470: 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  Op will be retur
4480: 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64  ned.  That opcod
4490: 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65  e.** is readable
44a0: 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2c 20 62   and writable, b
44b0: 75 74 20 69 74 20 68 61 73 20 6e 6f 20 65 66 66  ut it has no eff
44c0: 65 63 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ect.  The return
44d0: 20 6f 66 20 61 20 64 75 6d 6d 79 0a 2a 2a 20 6f   of a dummy.** o
44e0: 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65  pcode allows the
44f0: 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75   call to continu
4500: 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 20 61 66  e functioning af
4510: 74 65 72 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20  ter a OOM fault 
4520: 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e  without.** havin
4530: 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65  g to check to se
4540: 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20  e if the return 
4550: 66 72 6f 6d 20 74 68 69 73 20 72 6f 75 74 69 6e  from this routin
4560: 65 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69  e is a valid poi
4570: 6e 74 65 72 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  nter..*/.VdbeOp 
4580: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
4590: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
45a0: 64 64 72 29 7b 0a 20 20 73 74 61 74 69 63 20 56  ddr){.  static V
45b0: 64 62 65 4f 70 20 64 75 6d 6d 79 3b 0a 20 20 61  dbeOp dummy;.  a
45c0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
45d0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
45e0: 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30   );.  if( addr<0
45f0: 20 29 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70   ) addr = p->nOp
4600: 20 2d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   - 1;.  assert( 
4610: 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72  (addr>=0 && addr
4620: 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64  <p->nOp) || p->d
4630: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4640: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
4650: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
4660: 20 20 20 20 72 65 74 75 72 6e 20 26 64 75 6d 6d      return &dumm
4670: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
4680: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
4690: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
46a0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
46b0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c  _OMIT_EXPLAIN) |
46c0: 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  | !defined(NDEBU
46d0: 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66  G) \.     || def
46e0: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
46f0: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
4700: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
4710: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
4720: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
4730: 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74  s the P4 paramet
4740: 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65  er for an opcode
4750: 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66  ..** Use zTemp f
4760: 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  or any required 
4770: 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
4780: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
4790: 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50  c char *displayP
47a0: 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20  4(Op *pOp, char 
47b0: 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d  *zTemp, int nTem
47c0: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20  p){.  char *zP4 
47d0: 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72  = zTemp;.  asser
47e0: 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a  t( nTemp>=20 );.
47f0: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
4800: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  4type ){.    cas
4810: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41  e P4_KEYINFO_STA
4820: 54 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34  TIC:.    case P4
4830: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
4840: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
4850: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
4860: 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
4870: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71  eyInfo;.      sq
4880: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
4890: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65  Temp, zTemp, "ke
48a0: 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79 49  yinfo(%d", pKeyI
48b0: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20  nfo->nField);.  
48c0: 20 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53      i = sqlite3S
48d0: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a  trlen30(zTemp);.
48e0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
48f0: 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  <pKeyInfo->nFiel
4900: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
4910: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
4920: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  = pKeyInfo->aCol
4930: 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
4940: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
4950: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
4960: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f  ite3Strlen30(pCo
4970: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
4980: 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54        if( i+n>nT
4990: 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20  emp-6 ){.       
49a0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65       memcpy(&zTe
49b0: 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b  mp[i],",...",4);
49c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
49d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
49e0: 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b            zTemp[
49f0: 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  i++] = ',';.    
4a00: 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
4a10: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26  fo->aSortOrder &
4a20: 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  & pKeyInfo->aSor
4a30: 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20  tOrder[j] ){.   
4a40: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
4a50: 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20  ++] = '-';.     
4a60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4a70: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
4a80: 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  ], pColl->zName,
4a90: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n+1);.          
4aa0: 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  i += n;.        
4ab0: 7d 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54  }else if( i+4<nT
4ac0: 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20  emp-6 ){.       
4ad0: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70     memcpy(&zTemp
4ae0: 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20  [i],",nil",4);. 
4af0: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b           i += 4;
4b00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4b10: 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69   }.      zTemp[i
4b20: 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20  ++] = ')';.     
4b30: 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20   zTemp[i] = 0;. 
4b40: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e       assert( i<n
4b50: 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72  Temp );.      br
4b60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4b70: 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20  ase P4_COLLSEQ: 
4b80: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
4b90: 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34  *pColl = pOp->p4
4ba0: 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71  .pColl;.      sq
4bb0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
4bc0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f  Temp, zTemp, "co
4bd0: 6c 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20 70  llseq(%.20s)", p
4be0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
4bf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4c00: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e  .    case P4_FUN
4c10: 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75  CDEF: {.      Fu
4c20: 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f  ncDef *pDef = pO
4c30: 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20  p->p4.pFunc;.   
4c40: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
4c50: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4c60: 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66  , "%s(%d)", pDef
4c70: 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e  ->zName, pDef->n
4c80: 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Arg);.      brea
4c90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4ca0: 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20  e P4_INT64: {.  
4cb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4cc0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4cd0: 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d  p, "%lld", *pOp-
4ce0: 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20  >p4.pI64);.     
4cf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4d00: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a    case P4_INT32:
4d10: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
4d20: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
4d30: 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f   zTemp, "%d", pO
4d40: 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20  p->p4.i);.      
4d50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4d60: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b   case P4_REAL: {
4d70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
4d80: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
4d90: 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a  Temp, "%.16g", *
4da0: 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a  pOp->p4.pReal);.
4db0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4dc0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d   }.    case P4_M
4dd0: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20  EM: {.      Mem 
4de0: 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pMem = pOp->p4.
4df0: 70 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  pMem;.      asse
4e00: 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73  rt( (pMem->flags
4e10: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20   & MEM_Null)==0 
4e20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  );.      if( pMe
4e30: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  m->flags & MEM_S
4e40: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  tr ){.        zP
4e50: 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  4 = pMem->z;.   
4e60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
4e70: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  m->flags & MEM_I
4e80: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
4e90: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
4ea0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c  Temp, zTemp, "%l
4eb0: 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b  ld", pMem->u.i);
4ec0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
4ed0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
4ee0: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
4ef0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
4f00: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4f10: 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d  , "%.16g", pMem-
4f20: 3e 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >r);.      }.   
4f30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4f40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4f50: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
4f60: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41  .    case P4_VTA
4f70: 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B: {.      sqlit
4f80: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  e3_vtab *pVtab =
4f90: 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a   pOp->p4.pVtab;.
4fa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4fb0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
4fc0: 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70  emp, "vtab:%p:%p
4fd0: 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d  ", pVtab, pVtab-
4fe0: 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20  >pModule);.     
4ff0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
5000: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
5010: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
5020: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
5030: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
5040: 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20  , "intarray");. 
5050: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5060: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
5070: 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70  .      zP4 = pOp
5080: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66  ->p4.z;.      if
5090: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
50a0: 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b      zP4 = zTemp;
50b0: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30  .        zTemp[0
50c0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
50d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
50e0: 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72  t( zP4!=0 );.  r
50f0: 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e  eturn zP4;.}.#en
5100: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61  dif../*.** Decla
5110: 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74  re to the Vdbe t
5120: 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62  hat the BTree ob
5130: 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b  ject at db->aDb[
5140: 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a  i] is used..**.*
5150: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5160: 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65  beUsesBtree(Vdbe
5170: 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69   *p, int i){.  i
5180: 6e 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65 72  nt mask;.  asser
5190: 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e  t( i>=0 && i<p->
51a0: 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 73 69 7a  db->nDb && i<siz
51b0: 65 6f 66 28 75 33 32 29 2a 38 20 29 3b 0a 20 20  eof(u32)*8 );.  
51c0: 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73  assert( i<(int)s
51d0: 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61  izeof(p->btreeMa
51e0: 73 6b 29 2a 38 20 29 3b 0a 20 20 6d 61 73 6b 20  sk)*8 );.  mask 
51f0: 3d 20 28 28 75 33 32 29 31 29 3c 3c 69 3b 0a 20  = ((u32)1)<<i;. 
5200: 20 69 66 28 20 28 70 2d 3e 62 74 72 65 65 4d 61   if( (p->btreeMa
5210: 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  sk & mask)==0 ){
5220: 0a 20 20 20 20 70 2d 3e 62 74 72 65 65 4d 61 73  .    p->btreeMas
5230: 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 73  k |= mask;.    s
5240: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
5250: 41 72 72 61 79 49 6e 73 65 72 74 28 26 70 2d 3e  ArrayInsert(&p->
5260: 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d 3e 61  aMutex, p->db->a
5270: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a  Db[i].pBt);.  }.
5280: 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  }...#if defined(
5290: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
52a0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
52b0: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69  DEBUG)./*.** Pri
52c0: 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  nt a single opco
52d0: 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  de.  This routin
52e0: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65  e is used for de
52f0: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
5300: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5310: 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70  ePrintOp(FILE *p
5320: 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20  Out, int pc, Op 
5330: 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *pOp){.  char *z
5340: 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b  P4;.  char zPtr[
5350: 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  50];.  static co
5360: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
5370: 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20  t1 = "%4d %-13s 
5380: 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 34 73  %4d %4d %4d %-4s
5390: 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69   %.2X %s\n";.  i
53a0: 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75  f( pOut==0 ) pOu
53b0: 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50  t = stdout;.  zP
53c0: 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f  4 = displayP4(pO
53d0: 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28  p, zPtr, sizeof(
53e0: 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74  zPtr));.  fprint
53f0: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
5400: 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c  , pc, .      sql
5410: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
5420: 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70  Op->opcode), pOp
5430: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  ->p1, pOp->p2, p
5440: 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70  Op->p3, zP4, pOp
5450: 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20 53 51 4c  ->p5,.#ifdef SQL
5460: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
5470: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20  pOp->zComment ? 
5480: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20  pOp->zComment : 
5490: 22 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22  "".#else.      "
54a0: 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20  ".#endif.  );.  
54b0: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
54c0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
54d0: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
54e0: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
54f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5500: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
5510: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
5520: 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a    if( p && N ){.
5530: 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20      Mem *pEnd;. 
5540: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
5550: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d   p->db;.    u8 m
5560: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64  alloc_failed = d
5570: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
5580: 0a 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70  .    for(pEnd=&p
5590: 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b  [N]; p<pEnd; p++
55a0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
55b0: 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c   (&p[1])==pEnd |
55c0: 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e  | p[0].db==p[1].
55d0: 64 62 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  db );..      /* 
55e0: 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65  This block is re
55f0: 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20  ally an inlined 
5600: 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
5610: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
5620: 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ().      ** that
5630: 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65   takes advantage
5640: 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61   of the fact tha
5650: 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  t the memory cel
5660: 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20  l value is .    
5670: 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74    ** being set t
5680: 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c  o NULL after rel
5690: 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d  easing any dynam
56a0: 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20  ic resources..  
56b0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
56c0: 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f  The justificatio
56d0: 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e  n for duplicatin
56e0: 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61  g code is that a
56f0: 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20  ccording to .   
5700: 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c     ** callgrind,
5710: 20 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63   this causes a c
5720: 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65  ertain test case
5730: 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20   to hit the CPU 
5740: 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65  4.7 .      ** pe
5750: 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20  rcent less (x86 
5760: 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69  linux, gcc versi
5770: 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74  on 4.1.2, -O6) t
5780: 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a  han if .      **
5790: 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61   sqlite3MemRelea
57a0: 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64  se() were called
57b0: 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68   from here. With
57c0: 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73   -O2, this jumps
57d0: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36  .      ** to 6.6
57e0: 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65   percent. The te
57f0: 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72  st case is inser
5800: 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69  ting 1000 rows i
5810: 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20  nto a table .   
5820: 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e     ** with no in
5830: 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69  dexes using a si
5840: 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e  ngle prepared IN
5850: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  SERT statement, 
5860: 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a  bind() .      **
5870: 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e   and reset(). In
5880: 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65  serts are groupe
5890: 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63  d into a transac
58a0: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
58b0: 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67       if( p->flag
58c0: 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44  s&(MEM_Agg|MEM_D
58d0: 79 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  yn) ){.        s
58e0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
58f0: 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d  ease(p);.      }
5900: 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c  else if( p->zMal
5910: 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  loc ){.        s
5920: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5930: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
5940: 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63        p->zMalloc
5950: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
5960: 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20       p->flags = 
5970: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a  MEM_Null;.    }.
5980: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
5990: 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61  iled = malloc_fa
59a0: 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  iled;.  }.}..#if
59b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
59c0: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
59d0: 45 4e 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ENT.int sqlite3V
59e0: 64 62 65 52 65 6c 65 61 73 65 42 75 66 66 65 72  dbeReleaseBuffer
59f0: 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  s(Vdbe *p){.  in
5a00: 74 20 69 69 3b 0a 20 20 69 6e 74 20 6e 46 72 65  t ii;.  int nFre
5a10: 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  e = 0;.  assert(
5a20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
5a30: 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
5a40: 29 20 29 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b  ) );.  for(ii=1;
5a50: 20 69 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 69   ii<=p->nMem; ii
5a60: 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  ++){.    Mem *pM
5a70: 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 69  em = &p->aMem[ii
5a80: 5d 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d  ];.    if( pMem-
5a90: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77  >flags & MEM_Row
5aa0: 53 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Set ){.      sql
5ab0: 69 74 65 33 52 6f 77 53 65 74 43 6c 65 61 72 28  ite3RowSetClear(
5ac0: 70 4d 65 6d 2d 3e 75 2e 70 52 6f 77 53 65 74 29  pMem->u.pRowSet)
5ad0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5ae0: 70 4d 65 6d 2d 3e 7a 20 26 26 20 70 4d 65 6d 2d  pMem->z && pMem-
5af0: 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 20 29  >flags&MEM_Dyn )
5b00: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5b10: 21 70 4d 65 6d 2d 3e 78 44 65 6c 20 29 3b 0a 20  !pMem->xDel );. 
5b20: 20 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 71       nFree += sq
5b30: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
5b40: 65 28 70 4d 65 6d 2d 3e 64 62 2c 20 70 4d 65 6d  e(pMem->db, pMem
5b50: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ->z);.      sqli
5b60: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
5b70: 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  e(pMem);.    }. 
5b80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 46 72 65   }.  return nFre
5b90: 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  e;.}.#endif..#if
5ba0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5bb0: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47  _EXPLAIN./*.** G
5bc0: 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66  ive a listing of
5bd0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20   the program in 
5be0: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
5bf0: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ine..**.** The i
5c00: 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20  nterface is the 
5c10: 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56  same as sqlite3V
5c20: 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20  dbeExec().  But 
5c30: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75  instead of.** ru
5c40: 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20  nning the code, 
5c50: 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63  it invokes the c
5c60: 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72  allback once for
5c70: 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f   each instructio
5c80: 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75  n..** This featu
5c90: 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  re is used to im
5ca0: 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e  plement "EXPLAIN
5cb0: 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d  "..**.** When p-
5cc0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63  >explain==1, eac
5cd0: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  h instruction is
5ce0: 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a   listed.  When.*
5cf0: 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c  * p->explain==2,
5d00: 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e   only OP_Explain
5d10: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72   instructions ar
5d20: 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65  e listed and the
5d30: 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20  se.** are shown 
5d40: 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66  in a different f
5d50: 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61  ormat.  p->expla
5d60: 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f  in==2 is used to
5d70: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58   implement.** EX
5d80: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
5d90: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5da0: 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65  VdbeList(.  Vdbe
5db0: 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
5dc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
5dd0: 45 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  E */.){.  sqlite
5de0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
5df0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
5e00: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
5e10: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 70  Mem *pMem = p->p
5e20: 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e  ResultSet = &p->
5e30: 61 4d 65 6d 5b 31 5d 3b 0a 0a 20 20 61 73 73 65  aMem[1];..  asse
5e40: 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29  rt( p->explain )
5e50: 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
5e60: 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
5e70: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5e80: 5f 4d 49 53 55 53 45 3b 0a 20 20 61 73 73 65 72  _MISUSE;.  asser
5e90: 74 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51  t( db->magic==SQ
5ea0: 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 20  LITE_MAGIC_BUSY 
5eb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
5ec0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
5ed0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42   p->rc==SQLITE_B
5ee0: 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  USY || p->rc==SQ
5ef0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20  LITE_NOMEM );.. 
5f00: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
5f10: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  this opcode does
5f20: 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63   not use dynamic
5f30: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a   strings for.  *
5f40: 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65  * the result, re
5f50: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79  sult columns may
5f60: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
5f70: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
5f80: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
5f90: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
5fa0: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
5fb0: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
5fc0: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
5fd0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
5fe0: 28 70 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b  (pMem, p->nMem);
5ff0: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
6000: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
6010: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
6020: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ns if a malloc()
6030: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74   inside a call t
6040: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  o sqlite3_column
6050: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a  _text() or.    *
6060: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
6070: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64  _text16() failed
6080: 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61  .  */.    db->ma
6090: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
60a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
60b0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
60c0: 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70  do{.    i = p->p
60d0: 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  c++;.  }while( i
60e0: 3c 70 2d 3e 6e 4f 70 20 26 26 20 70 2d 3e 65 78  <p->nOp && p->ex
60f0: 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61  plain==2 && p->a
6100: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50  Op[i].opcode!=OP
6110: 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  _Explain );.  if
6120: 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20  ( i>=p->nOp ){. 
6130: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
6140: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  E_OK;.    rc = S
6150: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
6160: 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69  lse if( db->u1.i
6170: 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a  sInterrupted ){.
6180: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
6190: 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20  TE_INTERRUPT;.  
61a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
61b0: 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
61c0: 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
61d0: 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c  rrMsg, db, "%s",
61e0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70   sqlite3ErrStr(p
61f0: 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  ->rc));.  }else{
6200: 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  .    char *z;.  
6210: 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e    Op *pOp = &p->
6220: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aOp[i];.    if( 
6230: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
6240: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
6250: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
6260: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
6270: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
6280: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
6290: 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20   = i;           
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62b0: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20       /* Program 
62c0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
62d0: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20   pMem++;.  .    
62e0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
62f0: 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53  MEM_Static|MEM_S
6300: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
6310: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
6320: 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64  ar*)sqlite3Opcod
6330: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
6340: 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a  e);  /* Opcode *
6350: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
6360: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
6370: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
6380: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
6390: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
63a0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
63b0: 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d  E_TEXT;.      pM
63c0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
63d0: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65  _UTF8;.      pMe
63e0: 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  m++;.    }..    
63f0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
6400: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
6410: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20  >u.i = pOp->p1; 
6420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6430: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a           /* P1 *
6440: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  /.    pMem->type
6450: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
6460: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  R;.    pMem++;..
6470: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
6480: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
6490: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
64a0: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
64c0: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P2 */.    pMem->
64d0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
64e0: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
64f0: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  +;..    if( p->e
6500: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
6510: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
6520: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
6530: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
6540: 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p3;            
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6560: 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   P3 */.      pMe
6570: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
6580: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
6590: 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  pMem++;.    }.. 
65a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
65b0: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20  beMemGrow(pMem, 
65c0: 33 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20  32, 0) ){       
65d0: 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20       /* P4 */.  
65e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
65f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6600: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6610: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
6620: 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c    }.    pMem->fl
6630: 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45  ags = MEM_Dyn|ME
6640: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
6650: 20 20 20 20 7a 20 3d 20 64 69 73 70 6c 61 79 50      z = displayP
6660: 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  4(pOp, pMem->z, 
6670: 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d  32);.    if( z!=
6680: 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  pMem->z ){.     
6690: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
66a0: 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d  etStr(pMem, z, -
66b0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
66c0: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
66d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
66e0: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
66f0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
6700: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
6710: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
6720: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
6730: 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  F8;.    }.    pM
6740: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
6750: 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d  E_TEXT;.    pMem
6760: 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++;..    if( p->
6770: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
6780: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
6790: 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c  dbeMemGrow(pMem,
67a0: 20 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   4, 0) ){.      
67b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
67c0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
67d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
67e0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
67f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
6800: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79  ->flags = MEM_Dy
6810: 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  n|MEM_Str|MEM_Te
6820: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
6830: 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  n = 2;.      sql
6840: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c  ite3_snprintf(3,
6850: 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22   pMem->z, "%.2x"
6860: 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a  , pOp->p5);   /*
6870: 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   P5 */.      pMe
6880: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
6890: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65  _TEXT;.      pMe
68a0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
68b0: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  UTF8;.      pMem
68c0: 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51  ++;.  .#ifdef SQ
68d0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
68e0: 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65   if( pOp->zComme
68f0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  nt ){.        pM
6900: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
6910: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
6920: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
6930: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20  pOp->zComment;. 
6940: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d         pMem->n =
6950: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6960: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
6970: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
6980: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
6990: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
69a0: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
69b0: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
69c0: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
69d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
69e0: 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  EM_Null;        
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6a00: 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20  * Comment */.   
6a10: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
6a20: 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20  = SQLITE_NULL;. 
6a30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
6a40: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
6a50: 3d 20 38 20 2d 20 35 2a 28 70 2d 3e 65 78 70 6c  = 8 - 5*(p->expl
6a60: 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72  ain-1);.    p->r
6a70: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6a80: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
6a90: 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OW;.  }.  return
6aa0: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
6ab0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
6ac0: 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  LAIN */..#ifdef 
6ad0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
6ae0: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c  ** Print the SQL
6af0: 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74   that was used t
6b00: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42  o generate a VDB
6b10: 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  E program..*/.vo
6b20: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
6b30: 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  intSql(Vdbe *p){
6b40: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
6b50: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
6b60: 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  Op;.  if( nOp<1 
6b70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
6b80: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
6b90: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
6ba0: 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70  =OP_Trace && pOp
6bb0: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
6bc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
6bd0: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
6be0: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
6bf0: 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b  space(*z) ) z++;
6c00: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c  .    printf("SQL
6c10: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20  : [%s]\n", z);. 
6c20: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
6c30: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6c40: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
6c50: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
6c60: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f  NABLE_IOTRACE)./
6c70: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f  *.** Print an IO
6c80: 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68  TRACE message sh
6c90: 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e  owing SQL conten
6ca0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
6cb0: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
6cc0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
6cd0: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
6ce0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
6cf0: 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61  if( sqlite3IoTra
6d00: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
6d10: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
6d20: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
6d30: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20  ->aOp[0];.  if( 
6d40: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
6d50: 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34  Trace && pOp->p4
6d60: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  .z!=0 ){.    int
6d70: 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20   i, j;.    char 
6d80: 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c  z[1000];.    sql
6d90: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
6da0: 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22  zeof(z), z, "%s"
6db0: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
6dc0: 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74    for(i=0; sqlit
6dd0: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b  e3Isspace(z[i]);
6de0: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28   i++){}.    for(
6df0: 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  j=0; z[i]; i++){
6e00: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
6e10: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20  e3Isspace(z[i]) 
6e20: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
6e30: 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20  [i-1]!=' ' ){.  
6e40: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
6e50: 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   ' ';.        }.
6e60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6e70: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b       z[j++] = z[
6e80: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
6e90: 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a  }.    z[j] = 0;.
6ea0: 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
6eb0: 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a  ce("SQL %s\n", z
6ec0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
6ed0: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
6ee0: 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f  TRACE && SQLITE_
6ef0: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a  ENABLE_IOTRACE *
6f00: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  /../*.** Allocat
6f10: 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66  e space from a f
6f20: 69 78 65 64 20 73 69 7a 65 20 62 75 66 66 65 72  ixed size buffer
6f30: 2e 20 20 4d 61 6b 65 20 2a 70 70 20 70 6f 69 6e  .  Make *pp poin
6f40: 74 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f  t to the.** allo
6f50: 63 61 74 65 64 20 73 70 61 63 65 2e 20 20 28 4e  cated space.  (N
6f60: 6f 74 65 3a 20 20 70 70 20 69 73 20 61 20 63 68  ote:  pp is a ch
6f70: 61 72 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  ar* rather than 
6f80: 61 20 76 6f 69 64 2a 2a 20 74 6f 0a 2a 2a 20 77  a void** to.** w
6f90: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70  ork around the p
6fa0: 6f 69 6e 74 65 72 20 61 6c 69 61 73 69 6e 67 20  ointer aliasing 
6fb0: 72 75 6c 65 73 20 6f 66 20 43 2e 29 20 20 2a 70  rules of C.)  *p
6fc0: 70 20 73 68 6f 75 6c 64 20 69 6e 69 74 69 61 6c  p should initial
6fd0: 6c 79 0a 2a 2a 20 62 65 20 7a 65 72 6f 2e 20 20  ly.** be zero.  
6fe0: 49 66 20 2a 70 70 20 69 73 20 6e 6f 74 20 7a 65  If *pp is not ze
6ff0: 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ro, that means t
7000: 68 61 74 20 74 68 65 20 73 70 61 63 65 20 68 61  hat the space ha
7010: 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  s already.** bee
7020: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
7030: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
7040: 61 20 6e 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 6e 42  a noop..**.** nB
7050: 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  yte is the numbe
7060: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
7070: 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a  ace needed..**.*
7080: 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74 20  * *ppFrom point 
7090: 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61  to available spa
70a0: 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e  ce and pEnd poin
70b0: 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ts to the end of
70c0: 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c   the.** availabl
70d0: 65 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a  e space..**.** *
70e0: 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e  pnByte is a coun
70f0: 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ter of the numbe
7100: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
7110: 61 63 65 20 74 68 61 74 20 68 61 76 65 20 66 61  ace that have fa
7120: 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63  iled.** to alloc
7130: 61 74 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  ate.  If there i
7140: 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73  s insufficient s
7150: 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20  pace in *ppFrom 
7160: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a  to satisfy the.*
7170: 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20  * request, then 
7180: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74  increment *pnByt
7190: 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20  e by the amount 
71a0: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  of the request..
71b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
71c0: 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 63 68 61  llocSpace(.  cha
71d0: 72 20 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20  r *pp,          
71e0: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 65 74    /* IN/OUT: Set
71f0: 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f   *pp to point to
7200: 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
7210: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
7220: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
7230: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
7240: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
7250: 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20  u8 **ppFrom,    
7260: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
7270: 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70  Allocate from *p
7280: 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70  pFrom */.  u8 *p
7290: 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  End,            
72a0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20  /* Pointer to 1 
72b0: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  byte past the en
72c0: 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66  d of *ppFrom buf
72d0: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  fer */.  int *pn
72e0: 42 79 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Byte          /*
72f0: 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63   If allocation c
7300: 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69  annot be made, i
7310: 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65  ncrement *pnByte
7320: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
7330: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
7340: 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29  NMENT(*ppFrom) )
7350: 3b 0a 20 20 69 66 28 20 28 2a 28 76 6f 69 64 2a  ;.  if( (*(void*
7360: 2a 29 70 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20  *)pp)==0 ){.    
7370: 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e  nByte = ROUND8(n
7380: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 28  Byte);.    if( (
7390: 70 45 6e 64 20 2d 20 2a 70 70 46 72 6f 6d 29 3e  pEnd - *ppFrom)>
73a0: 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  =nByte ){.      
73b0: 2a 28 76 6f 69 64 2a 2a 29 70 70 20 3d 20 28 76  *(void**)pp = (v
73c0: 6f 69 64 20 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20  oid *)*ppFrom;. 
73d0: 20 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20       *ppFrom += 
73e0: 6e 42 79 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65  nByte;.    }else
73f0: 7b 0a 20 20 20 20 20 20 2a 70 6e 42 79 74 65 20  {.      *pnByte 
7400: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a  += nByte;.    }.
7410: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65    }.}../*.** Pre
7420: 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  pare a virtual m
7430: 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75  achine for execu
7440: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f  tion.  This invo
7450: 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68  lves things such
7460: 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e  .** as allocatin
7470: 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e  g stack space an
7480: 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  d initializing t
7490: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
74a0: 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  er..** After the
74b0: 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65   VDBE has be pre
74c0: 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20  pped, it can be 
74d0: 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20  executed by one 
74e0: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73  or more.** calls
74f0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
7500: 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  xec().  .**.** T
7510: 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
7520: 77 61 79 20 74 6f 20 6d 6f 76 65 20 61 20 56 44  way to move a VD
7530: 42 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  BE from VDBE_MAG
7540: 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44  IC_INIT to.** VD
7550: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2a  BE_MAGIC_RUN..**
7560: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
7570: 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
7580: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 6f  more than once o
7590: 6e 20 61 20 73 69 6e 67 6c 65 20 76 69 72 74 75  n a single virtu
75a0: 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 54  al machine..** T
75b0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 69 73  he first call is
75c0: 20 6d 61 64 65 20 77 68 69 6c 65 20 63 6f 6d 70   made while comp
75d0: 69 6c 69 6e 67 20 74 68 65 20 53 51 4c 20 73 74  iling the SQL st
75e0: 61 74 65 6d 65 6e 74 2e 20 53 75 62 73 65 71 75  atement. Subsequ
75f0: 65 6e 74 0a 2a 2a 20 63 61 6c 6c 73 20 61 72 65  ent.** calls are
7600: 20 6d 61 64 65 20 61 73 20 70 61 72 74 20 6f 66   made as part of
7610: 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
7620: 72 65 73 65 74 74 69 6e 67 20 61 20 73 74 61 74  resetting a stat
7630: 65 6d 65 6e 74 20 74 6f 20 62 65 0a 2a 2a 20 72  ement to be.** r
7640: 65 2d 65 78 65 63 75 74 65 64 20 28 66 72 6f 6d  e-executed (from
7650: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
7660: 65 33 5f 72 65 73 65 74 28 29 29 2e 20 54 68 65  e3_reset()). The
7670: 20 6e 56 61 72 2c 20 6e 4d 65 6d 2c 20 6e 43 75   nVar, nMem, nCu
7680: 72 73 6f 72 20 0a 2a 2a 20 61 6e 64 20 69 73 45  rsor .** and isE
7690: 78 70 6c 61 69 6e 20 70 61 72 61 6d 65 74 65 72  xplain parameter
76a0: 73 20 61 72 65 20 6f 6e 6c 79 20 70 61 73 73 65  s are only passe
76b0: 64 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 73  d correct values
76c0: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a   the first time.
76d0: 2a 2a 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ** the function 
76e0: 69 73 20 63 61 6c 6c 65 64 2e 20 4f 6e 20 73 75  is called. On su
76f0: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 2c 20  bsequent calls, 
7700: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65 73  from sqlite3_res
7710: 65 74 28 29 2c 20 6e 56 61 72 0a 2a 2a 20 69 73  et(), nVar.** is
7720: 20 70 61 73 73 65 64 20 2d 31 20 61 6e 64 20 6e   passed -1 and n
7730: 4d 65 6d 2c 20 6e 43 75 72 73 6f 72 20 61 6e 64  Mem, nCursor and
7740: 20 69 73 45 78 70 6c 61 69 6e 20 61 72 65 20 61   isExplain are a
7750: 6c 6c 20 70 61 73 73 65 64 20 7a 65 72 6f 2e 0a  ll passed zero..
7760: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
7770: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20  dbeMakeReady(.  
7780: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
77a0: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20  * The VDBE */.  
77b0: 69 6e 74 20 6e 56 61 72 2c 20 20 20 20 20 20 20  int nVar,       
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
77d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27 20  * Number of '?' 
77e0: 73 65 65 20 69 6e 20 74 68 65 20 53 51 4c 20 73  see in the SQL s
77f0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
7800: 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20 20  t nMem,         
7810: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7820: 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79  Number of memory
7830: 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63 61   cells to alloca
7840: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72  te */.  int nCur
7850: 73 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  sor,            
7860: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7870: 20 6f 66 20 63 75 72 73 6f 72 73 20 74 6f 20 61   of cursors to a
7880: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74  llocate */.  int
7890: 20 69 73 45 78 70 6c 61 69 6e 20 20 20 20 20 20   isExplain      
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
78b0: 72 75 65 20 69 66 20 74 68 65 20 45 58 50 4c 41  rue if the EXPLA
78c0: 49 4e 20 6b 65 79 77 6f 72 64 73 20 69 73 20 70  IN keywords is p
78d0: 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  resent */.){.  i
78e0: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
78f0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
7900: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
7910: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
7920: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
7930: 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  NIT );..  /* The
7940: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20  re should be at 
7950: 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65  least one opcode
7960: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
7970: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20   p->nOp>0 );..  
7980: 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63  /* Set the magic
7990: 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   to VDBE_MAGIC_R
79a0: 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  UN sooner rather
79b0: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a   than later. */.
79c0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
79d0: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20  E_MAGIC_RUN;..  
79e0: 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73  /* For each curs
79f0: 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73  or required, als
7a00: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d  o allocate a mem
7a10: 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79  ory cell. Memory
7a20: 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65  .  ** cells (nMe
7a30: 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d  m+1-nCursor)..nM
7a40: 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77  em, inclusive, w
7a50: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
7a60: 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64  d by.  ** the vd
7a70: 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74  be program. Inst
7a80: 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65  ead they are use
7a90: 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70  d to allocate sp
7aa0: 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62  ace for.  ** Vdb
7ab0: 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72  eCursor/BtCursor
7ac0: 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65   structures. The
7ad0: 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
7ae0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7af0: 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69  .  ** cursor 0 i
7b00: 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f  s stored in memo
7b10: 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65  ry cell nMem. Me
7b20: 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d  mory cell (nMem-
7b30: 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74  1).  ** stores t
7b40: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72  he blob of memor
7b50: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
7b60: 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e  h cursor 1, etc.
7b70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61  .  **.  ** See a
7b80: 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72  lso: allocateCur
7b90: 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d  sor()..  */.  nM
7ba0: 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a  em += nCursor;..
7bb0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
7bc0: 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72  ace for memory r
7bd0: 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76 61  egisters, SQL va
7be0: 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63 75  riables, VDBE cu
7bf0: 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20  rsors and .  ** 
7c00: 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72 73  an array to mars
7c10: 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  hal SQL function
7c20: 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 20 54   arguments in. T
7c30: 68 69 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e 65  his is only done
7c40: 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
7c50: 74 69 6d 65 20 74 68 69 73 20 66 75 6e 63 74 69  time this functi
7c60: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  on is called for
7c70: 20 61 20 67 69 76 65 6e 20 56 44 42 45 2c 20 6e   a given VDBE, n
7c80: 6f 74 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20  ot when it is.  
7c90: 2a 2a 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  ** being called 
7ca0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65 73  from sqlite3_res
7cb0: 65 74 28 29 20 74 6f 20 72 65 73 65 74 20 74 68  et() to reset th
7cc0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
7cd0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 56  e..  */.  if( nV
7ce0: 61 72 3e 3d 30 20 26 26 20 21 64 62 2d 3e 6d 61  ar>=0 && !db->ma
7cf0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
7d00: 20 20 75 38 20 2a 7a 43 73 72 20 3d 20 28 75 38    u8 *zCsr = (u8
7d10: 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   *)&p->aOp[p->nO
7d20: 70 5d 3b 0a 20 20 20 20 75 38 20 2a 7a 45 6e 64  p];.    u8 *zEnd
7d30: 20 3d 20 28 75 38 20 2a 29 26 70 2d 3e 61 4f 70   = (u8 *)&p->aOp
7d40: 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 0a 20  [p->nOpAlloc];. 
7d50: 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20     int nByte;.  
7d60: 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
7d70: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
7d80: 62 65 72 20 6f 66 20 61 72 67 73 20 70 61 73 73  ber of args pass
7d90: 65 64 20 74 6f 20 61 20 75 73 65 72 20 66 75 6e  ed to a user fun
7da0: 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 72 65  ction. */.    re
7db0: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
7dc0: 20 26 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28   &nArg);.    if(
7dd0: 20 69 73 45 78 70 6c 61 69 6e 20 26 26 20 6e 4d   isExplain && nM
7de0: 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 20 20 6e  em<10 ){.      n
7df0: 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a  Mem = 10;.    }.
7e00: 20 20 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73      zCsr += (zCs
7e10: 72 20 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20  r - (u8*)0)&7;. 
7e20: 20 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54     assert( EIGHT
7e30: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
7e40: 7a 43 73 72 29 20 29 3b 0a 20 20 20 20 69 66 28  zCsr) );.    if(
7e50: 20 7a 45 6e 64 3c 7a 43 73 72 20 29 20 7a 45 6e   zEnd<zCsr ) zEn
7e60: 64 20 3d 20 7a 43 73 72 3b 0a 0a 20 20 20 20 64  d = zCsr;..    d
7e70: 6f 20 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  o {.      memset
7e80: 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a  (zCsr, 0, zEnd-z
7e90: 43 73 72 29 3b 0a 20 20 20 20 20 20 6e 42 79 74  Csr);.      nByt
7ea0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 6c 6c  e = 0;.      all
7eb0: 6f 63 53 70 61 63 65 28 28 63 68 61 72 2a 29 26  ocSpace((char*)&
7ec0: 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69  p->aMem, nMem*si
7ed0: 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72  zeof(Mem), &zCsr
7ee0: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
7ef0: 0a 20 20 20 20 20 20 61 6c 6c 6f 63 53 70 61 63  .      allocSpac
7f00: 65 28 28 63 68 61 72 2a 29 26 70 2d 3e 61 56 61  e((char*)&p->aVa
7f10: 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d  r, nVar*sizeof(M
7f20: 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  em), &zCsr, zEnd
7f30: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  , &nByte);.     
7f40: 20 61 6c 6c 6f 63 53 70 61 63 65 28 28 63 68 61   allocSpace((cha
7f50: 72 2a 29 26 70 2d 3e 61 70 41 72 67 2c 20 6e 41  r*)&p->apArg, nA
7f60: 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c  rg*sizeof(Mem*),
7f70: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
7f80: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 61 6c 6c  Byte);.      all
7f90: 6f 63 53 70 61 63 65 28 28 63 68 61 72 2a 29 26  ocSpace((char*)&
7fa0: 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73  p->azVar, nVar*s
7fb0: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a  izeof(char*), &z
7fc0: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
7fd0: 65 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 53  e);.      allocS
7fe0: 70 61 63 65 28 28 63 68 61 72 2a 29 26 70 2d 3e  pace((char*)&p->
7ff0: 61 70 43 73 72 2c 20 0a 20 20 20 20 20 20 20 20  apCsr, .        
8000: 20 20 20 20 20 20 20 20 20 6e 43 75 72 73 6f 72           nCursor
8010: 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73  *sizeof(VdbeCurs
8020: 6f 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  or*), &zCsr, zEn
8030: 64 2c 20 26 6e 42 79 74 65 0a 20 20 20 20 20 20  d, &nByte.      
8040: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 42 79  );.      if( nBy
8050: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  te ){.        p-
8060: 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33  >pFree = sqlite3
8070: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
8080: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nByte);.      }.
8090: 20 20 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e        zCsr = p->
80a0: 70 46 72 65 65 3b 0a 20 20 20 20 20 20 7a 45 6e  pFree;.      zEn
80b0: 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d  d = &zCsr[nByte]
80c0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 42  ;.    }while( nB
80d0: 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  yte && !db->mall
80e0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20  ocFailed );..   
80f0: 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43   p->nCursor = nC
8100: 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  ursor;.    if( p
8110: 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ->aVar ){.      
8120: 70 2d 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a  p->nVar = nVar;.
8130: 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e        for(n=0; n
8140: 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20  <nVar; n++){.   
8150: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
8160: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
8170: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61  ;.        p->aVa
8180: 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  r[n].db = db;.  
8190: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
81a0: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
81b0: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20       p->aMem--; 
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81d0: 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67       /* aMem[] g
81e0: 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d  oes from 1..nMem
81f0: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65   */.      p->nMe
8200: 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20  m = nMem;       
8210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20            /*    
8220: 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e     not from 0..n
8230: 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 20 20 66  Mem-1 */.      f
8240: 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b  or(n=1; n<=nMem;
8250: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   n++){.        p
8260: 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20  ->aMem[n].flags 
8270: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
8280: 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64      p->aMem[n].d
8290: 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a  b = db;.      }.
82a0: 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
82b0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
82c0: 66 6f 72 28 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e 4d  for(n=1; n<p->nM
82d0: 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 61 73  em; n++){.    as
82e0: 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 6e 5d  sert( p->aMem[n]
82f0: 2e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 7d 0a 23  .db==db );.  }.#
8300: 65 6e 64 69 66 0a 0a 20 20 70 2d 3e 70 63 20 3d  endif..  p->pc =
8310: 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53   -1;.  p->rc = S
8320: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65  QLITE_OK;.  p->e
8330: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
8340: 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c  Abort;.  p->expl
8350: 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e  ain |= isExplain
8360: 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
8370: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20  DBE_MAGIC_RUN;. 
8380: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
8390: 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d  .  p->cacheCtr =
83a0: 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74   1;.  p->minWrit
83b0: 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35  eFileFormat = 25
83c0: 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  5;.  p->iStateme
83d0: 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56  nt = 0;.#ifdef V
83e0: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
83f0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
8400: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
8410: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; i++){.      p-
8420: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b  >aOp[i].cnt = 0;
8430: 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  .      p->aOp[i]
8440: 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20  .cycles = 0;.   
8450: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a   }.  }.#endif.}.
8460: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56  ./*.** Close a V
8470: 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72  DBE cursor and r
8480: 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72  elease all the r
8490: 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75  esources that cu
84a0: 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73  rsor .** happens
84b0: 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69   to hold..*/.voi
84c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65  d sqlite3VdbeFre
84d0: 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c  eCursor(Vdbe *p,
84e0: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78   VdbeCursor *pCx
84f0: 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20  ){.  if( pCx==0 
8500: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
8510: 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42   }.  if( pCx->pB
8520: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
8530: 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e  BtreeClose(pCx->
8540: 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  pBt);.    /* The
8550: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69   pCx->pCursor wi
8560: 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f  ll be close auto
8570: 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74  matically, if it
8580: 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20   exists, by.    
8590: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  ** the call abov
85a0: 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  e. */.  }else if
85b0: 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29  ( pCx->pCursor )
85c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
85d0: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43  eeCloseCursor(pC
85e0: 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d  x->pCursor);.  }
85f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8600: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
8610: 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74  E.  if( pCx->pVt
8620: 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  abCursor ){.    
8630: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
8640: 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
8650: 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72   = pCx->pVtabCur
8660: 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73  sor;.    const s
8670: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
8680: 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d  Module = pCx->pM
8690: 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e  odule;.    p->in
86a0: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a  VtabMethod = 1;.
86b0: 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
86c0: 33 53 61 66 65 74 79 4f 66 66 28 70 2d 3e 64 62  3SafetyOff(p->db
86d0: 29 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e  );.    pModule->
86e0: 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73  xClose(pVtabCurs
86f0: 6f 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73  or);.    (void)s
8700: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70  qlite3SafetyOn(p
8710: 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  ->db);.    p->in
8720: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a  VtabMethod = 0;.
8730: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
8740: 20 21 70 43 78 2d 3e 65 70 68 65 6d 50 73 65 75   !pCx->ephemPseu
8750: 64 6f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73  doTable ){.    s
8760: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
8770: 64 62 2c 20 70 43 78 2d 3e 70 44 61 74 61 29 3b  db, pCx->pData);
8780: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
8790: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
87a0: 65 78 63 65 70 74 20 66 6f 72 20 56 54 61 62 20  except for VTab 
87b0: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
87c0: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 69 6e   currently.** in
87d0: 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
87e0: 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72  void closeAllCur
87f0: 73 6f 72 73 45 78 63 65 70 74 41 63 74 69 76 65  sorsExceptActive
8800: 56 74 61 62 73 28 56 64 62 65 20 2a 70 29 7b 0a  Vtabs(Vdbe *p){.
8810: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
8820: 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20 72 65 74  ->apCsr==0 ) ret
8830: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
8840: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
8850: 2b 29 7b 0a 20 20 20 20 56 64 62 65 43 75 72 73  +){.    VdbeCurs
8860: 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
8870: 72 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43  r[i];.    if( pC
8880: 20 26 26 20 28 21 70 2d 3e 69 6e 56 74 61 62 4d   && (!p->inVtabM
8890: 65 74 68 6f 64 20 7c 7c 20 21 70 43 2d 3e 70 56  ethod || !pC->pV
88a0: 74 61 62 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  tabCursor) ){.  
88b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
88c0: 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29  reeCursor(p, pC)
88d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72  ;.      p->apCsr
88e0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
88f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61   }.}../*.** Clea
8900: 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65  n up the VM afte
8910: 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a  r execution..**.
8920: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8930: 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
8940: 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72  ly close any cur
8950: 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64  sors, lists, and
8960: 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74  /or.** sorters t
8970: 68 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70  hat were left op
8980: 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c  en.  It also del
8990: 65 74 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  etes the values 
89a0: 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  of.** variables 
89b0: 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72  in the aVar[] ar
89c0: 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ray..*/.static v
89d0: 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65  oid Cleanup(Vdbe
89e0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
89f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8a00: 2d 3e 64 62 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  ->db;.  Mem *pMe
8a10: 6d 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72  m;.  closeAllCur
8a20: 73 6f 72 73 45 78 63 65 70 74 41 63 74 69 76 65  sorsExceptActive
8a30: 56 74 61 62 73 28 70 29 3b 0a 20 20 66 6f 72 28  Vtabs(p);.  for(
8a40: 70 4d 65 6d 3d 26 70 2d 3e 61 4d 65 6d 5b 31 5d  pMem=&p->aMem[1]
8a50: 2c 20 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65  , i=1; i<=p->nMe
8a60: 6d 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b  m; i++, pMem++){
8a70: 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66  .    if( pMem->f
8a80: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
8a90: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
8aa0: 65 33 52 6f 77 53 65 74 43 6c 65 61 72 28 70 4d  e3RowSetClear(pM
8ab0: 65 6d 2d 3e 75 2e 70 52 6f 77 53 65 74 29 3b 0a  em->u.pRowSet);.
8ac0: 20 20 20 20 7d 0a 20 20 20 20 4d 65 6d 53 65 74      }.    MemSet
8ad0: 54 79 70 65 46 6c 61 67 28 70 4d 65 6d 2c 20 4d  TypeFlag(pMem, M
8ae0: 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  EM_Null);.  }.  
8af0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
8b00: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e  &p->aMem[1], p->
8b10: 6e 4d 65 6d 29 3b 0a 20 20 69 66 28 20 70 2d 3e  nMem);.  if( p->
8b20: 63 6f 6e 74 65 78 74 53 74 61 63 6b 20 29 7b 0a  contextStack ){.
8b30: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8b40: 65 28 64 62 2c 20 70 2d 3e 63 6f 6e 74 65 78 74  e(db, p->context
8b50: 53 74 61 63 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d  Stack);.  }.  p-
8b60: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 20 3d 20  >contextStack = 
8b70: 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53  0;.  p->contextS
8b80: 74 61 63 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20  tackDepth = 0;. 
8b90: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
8ba0: 54 6f 70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Top = 0;.  sqlit
8bb0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
8bc0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
8bd0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d  ErrMsg = 0;.  p-
8be0: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
8bf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
8c00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
8c10: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
8c20: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
8c30: 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
8c40: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
8c50: 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
8c60: 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
8c70: 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
8c80: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
8c90: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
8ca0: 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
8cb0: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
8cc0: 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
8cd0: 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
8ce0: 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
8cf0: 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
8d00: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
8d10: 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
8d20: 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
8d30: 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  ){.  Mem *pColNa
8d40: 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  me;.  int n;.  s
8d50: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
8d60: 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65  db;..  releaseMe
8d70: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
8d80: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
8d90: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
8da0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8db0: 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
8dc0: 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
8dd0: 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d  *COLNAME_N;.  p-
8de0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52  >nResColumn = nR
8df0: 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61  esColumn;.  p->a
8e00: 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61  ColName = pColNa
8e10: 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74  me = (Mem*)sqlit
8e20: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
8e30: 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e  b, sizeof(Mem)*n
8e40: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f   );.  if( p->aCo
8e50: 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  lName==0 ) retur
8e60: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  n;.  while( n-- 
8e70: 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e  > 0 ){.    pColN
8e80: 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  ame->flags = MEM
8e90: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e  _Null;.    pColN
8ea0: 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  ame->db = p->db;
8eb0: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b  .    pColName++;
8ec0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
8ed0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
8ee0: 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20  e idx'th column 
8ef0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
8f00: 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  y the SQL statem
8f10: 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75  ent..** zName mu
8f20: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
8f30: 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61  to a nul termina
8f40: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ted string..**.*
8f50: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  * This call must
8f60: 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61   be made after a
8f70: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8f80: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29  VdbeSetNumCols()
8f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61  ..**.** The fina
8fa0: 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65  l parameter, xDe
8fb0: 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  l, must be one o
8fc0: 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  f SQLITE_DYNAMIC
8fd0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a  , SQLITE_STATIC.
8fe0: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41  ** or SQLITE_TRA
8ff0: 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73  NSIENT. If it is
9000: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
9010: 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72   then the buffer
9020: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
9030: 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20  y zName will be 
9040: 66 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33  freed by sqlite3
9050: 44 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68  DbFree() when th
9060: 65 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f  e vdbe is destro
9070: 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  yed..*/.int sqli
9080: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
9090: 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  e(.  Vdbe *p,   
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90b0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65        /* Vdbe be
90c0: 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a  ing configured *
90d0: 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20  /.  int idx,    
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90f0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
9100: 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70   column zName ap
9110: 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  plies to */.  in
9120: 74 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20  t var,          
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9140: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c  * One of the COL
9150: 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73  NAME_* constants
9160: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
9170: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
9180: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
9190: 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
91a0: 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20  aining name */. 
91b0: 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
91c0: 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  id*)            
91d0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61    /* Memory mana
91e0: 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20  gement strategy 
91f0: 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  for zName */.){.
9200: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20    int rc;.  Mem 
9210: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73  *pColName;.  ass
9220: 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73  ert( idx<p->nRes
9230: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65  Column );.  asse
9240: 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f  rt( var<COLNAME_
9250: 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  N );.  if( p->db
9260: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9270: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a  {.    assert( !z
9280: 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51  Name || xDel!=SQ
9290: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a  LITE_DYNAMIC );.
92a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
92b0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61  E_NOMEM;.  }.  a
92c0: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61  ssert( p->aColNa
92d0: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e  me!=0 );.  pColN
92e0: 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e  ame = &(p->aColN
92f0: 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e  ame[idx+var*p->n
9300: 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72  ResColumn]);.  r
9310: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
9320: 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d  emSetStr(pColNam
9330: 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  e, zName, -1, SQ
9340: 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29  LITE_UTF8, xDel)
9350: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
9360: 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28  0 || !zName || (
9370: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26  pColName->flags&
9380: 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a  MEM_Term)!=0 );.
9390: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
93a0: 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20  /*.** A read or 
93b0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
93c0: 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  n may or may not
93d0: 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61   be active on da
93e0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
93f0: 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61   db. If a transa
9400: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c  ction is active,
9410: 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74   commit it. If t
9420: 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69  here is a.** wri
9430: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  te-transaction s
9440: 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61  panning more tha
9450: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
9460: 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ile, this routin
9470: 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20  e.** takes care 
9480: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
9490: 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a  urnal trickery..
94a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
94b0: 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33  beCommit(sqlite3
94c0: 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
94d0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
94e0: 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e  Trans = 0;  /* N
94f0: 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73  umber of databas
9500: 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76  es with an activ
9510: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
9520: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ion */.  int rc 
9530: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
9540: 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d  nt needXcommit =
9550: 20 30 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65   0;..  /* Before
9560: 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
9570: 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78  else, call the x
9580: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
9590: 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72  for any.  ** vir
95a0: 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c  tual module tabl
95b0: 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  es written in th
95c0: 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
95d0: 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a  This has to.  **
95e0: 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
95f0: 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74  determining whet
9600: 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  her a master jou
9610: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20  rnal file is .  
9620: 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20  ** required, as 
9630: 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  an xSync() callb
9640: 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61  ack may add an a
9650: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
9660: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61  .  ** to the tra
9670: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
9680: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
9690: 62 53 79 6e 63 28 64 62 2c 20 26 70 2d 3e 7a 45  bSync(db, &p->zE
96a0: 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63  rrMsg);.  if( rc
96b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
96c0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
96d0: 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  }..  /* This loo
96e0: 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29  p determines (a)
96f0: 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68   if the commit h
9700: 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ook should be in
9710: 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28  voked and.  ** (
9720: 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61  b) how many data
9730: 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20  base files have 
9740: 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
9750: 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20  actions, not .  
9760: 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
9770: 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20   temp database. 
9780: 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  (b) is important
9790: 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65   because if more
97a0: 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20   than .  ** one 
97b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
97c0: 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  s an open write 
97d0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d  transaction, a m
97e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20  aster journal.  
97f0: 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69  ** file is requi
9800: 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69  red for an atomi
9810: 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a  c commit..  */ .
9820: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
9830: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
9840: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
9850: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
9860: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
9870: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
9880: 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63   ){.      needXc
9890: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
98a0: 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61   if( i!=1 ) nTra
98b0: 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ns++;.    }.  }.
98c0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
98d0: 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61  re any write-tra
98e0: 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c  nsactions at all
98f0: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d  , invoke the com
9900: 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66  mit hook */.  if
9910: 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26  ( needXcommit &&
9920: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
9930: 62 61 63 6b 20 29 7b 0a 20 20 20 20 61 73 73 65  back ){.    asse
9940: 72 74 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  rt( (db->flags &
9950: 20 53 51 4c 49 54 45 5f 43 6f 6d 6d 69 74 42 75   SQLITE_CommitBu
9960: 73 79 29 3d 3d 30 20 29 3b 0a 20 20 20 20 64 62  sy)==0 );.    db
9970: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
9980: 45 5f 43 6f 6d 6d 69 74 42 75 73 79 3b 0a 20 20  E_CommitBusy;.  
9990: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
99a0: 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20  afetyOff(db);.  
99b0: 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
99c0: 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
99d0: 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
99e0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
99f0: 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20 20 64  etyOn(db);.    d
9a00: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
9a10: 49 54 45 5f 43 6f 6d 6d 69 74 42 75 73 79 3b 0a  ITE_CommitBusy;.
9a20: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
9a30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9a40: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
9a50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
9a60: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20  e simple case - 
9a70: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
9a80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
9a90: 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
9aa0: 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  .  ** TEMP datab
9ab0: 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73  ase) has a trans
9ac0: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20  action active.  
9ad0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
9ae0: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  d for the.  ** m
9af0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  aster-journal.. 
9b00: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
9b10: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
9b20: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
9b30: 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a  ilename() is a z
9b40: 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20  ero length.  ** 
9b50: 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73  string, it means
9b60: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
9b70: 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f  se is :memory: o
9b80: 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20  r a temp file.  
9b90: 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61  In .  ** that ca
9ba0: 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  se we do not sup
9bb0: 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74  port atomic mult
9bc0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20  i-file commits, 
9bd0: 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  so use the .  **
9be0: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65   simple case the
9bf0: 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  n too..  */.  if
9c00: 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  ( 0==sqlite3Strl
9c10: 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65  en30(sqlite3Btre
9c20: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
9c30: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20  >aDb[0].pBt)).  
9c40: 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20   || nTrans<=1.  
9c50: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
9c60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
9c70: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
9c80: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
9c90: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
9ca0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
9cb0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
9cc0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
9cd0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
9ce0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
9cf0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
9d00: 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20  the commit only 
9d10: 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  if all databases
9d20: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
9d30: 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20  mplete phase 1. 
9d40: 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f  .    ** If one o
9d50: 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69  f the BtreeCommi
9d60: 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
9d70: 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e  s fails, this in
9d80: 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a  dicates an.    *
9d90: 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65  * IO error while
9da0: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
9db0: 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61  ncating a journa
9dc0: 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e  l file. It is un
9dd0: 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62  likely,.    ** b
9de0: 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e  ut could happen.
9df0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62   In this case ab
9e00: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
9e10: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
9e20: 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
9e30: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
9e40: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
9e50: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
9e60: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
9e70: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
9e80: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
9e90: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
9ea0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
9eb0: 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20  PhaseTwo(pBt);. 
9ec0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9ed0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9ee0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
9ef0: 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
9f00: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
9f10: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63  /* The complex c
9f20: 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61  ase - There is a
9f30: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74   multi-file writ
9f40: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  e-transaction ac
9f50: 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tive..  ** This 
9f60: 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65  requires a maste
9f70: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
9f80: 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61  o ensure the tra
9f90: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
9fa0: 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69   committed atomi
9fb0: 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  cly..  */.#ifnde
9fc0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  f SQLITE_OMIT_DI
9fd0: 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20  SKIO.  else{.   
9fe0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
9ff0: 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
a000: 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
a010: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  = 0;.    char *z
a020: 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a  Master = 0;   /*
a030: 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74   File-name for t
a040: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a050: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f  l */.    char co
a060: 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d  nst *zMainFile =
a070: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
a080: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
a090: 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71  [0].pBt);.    sq
a0a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
a0b0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34  ter = 0;.    i64
a0c0: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
a0d0: 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f   int res;..    /
a0e0: 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65  * Select a maste
a0f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
a100: 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a  ame */.    do {.
a110: 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f        u32 iRando
a120: 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
a130: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
a140: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
a150: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
a160: 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26  zeof(iRandom), &
a170: 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20  iRandom);.      
a180: 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  zMaster = sqlite
a190: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
a1a0: 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46  -mj%08X", zMainF
a1b0: 69 6c 65 2c 20 69 52 61 6e 64 6f 6d 26 30 78 37  ile, iRandom&0x7
a1c0: 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20  fffffff);.      
a1d0: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a  if( !zMaster ){.
a1e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
a1f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
a200: 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
a210: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
a220: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
a230: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
a240: 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  STS, &res);.    
a250: 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
a260: 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a  TE_OK && res );.
a270: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
a280: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
a290: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
a2a0: 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
a2b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a2c0: 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66  OsOpenMalloc(pVf
a2d0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61  s, zMaster, &pMa
a2e0: 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20  ster, .         
a2f0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
a300: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
a310: 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
a320: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
a330: 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54  _EXCLUSIVE|SQLIT
a340: 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
a350: 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29  URNAL, 0.      )
a360: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a370: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
a380: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
a390: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
a3a0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
a3b0: 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  rc;.    }. .    
a3c0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  /* Write the nam
a3d0: 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61  e of each databa
a3e0: 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74  se file in the t
a3f0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20  ransaction into 
a400: 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d  the new.    ** m
a410: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
a420: 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
a430: 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70  occurs at this p
a440: 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a  oint close.    *
a450: 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  * and delete the
a460: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a470: 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e  file. All the in
a480: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
a490: 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74   files.    ** st
a4a0: 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20  ill have 'null' 
a4b0: 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  as the master jo
a4c0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73  urnal pointer, s
a4d0: 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c  o they will roll
a4e0: 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64  .    ** back ind
a4f0: 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20  ependently if a 
a500: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
a510: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
a520: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
a530: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
a540: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
a550: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
a560: 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75  ( i==1 ) continu
a570: 65 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74  e;   /* Ignore t
a580: 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  he TEMP database
a590: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
a5a0: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
a5b0: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
a5c0: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
a5d0: 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  zFile = sqlite3B
a5e0: 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
a5f0: 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  me(pBt);.       
a600: 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30   if( zFile[0]==0
a610: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a   ) continue;  /*
a620: 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a   Ignore :memory:
a630: 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
a640: 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53        if( !needS
a650: 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42  ync && !sqlite3B
a660: 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
a670: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
a680: 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
a690: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a6a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
a6b0: 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20  sWrite(pMaster, 
a6c0: 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74  zFile, sqlite3St
a6d0: 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c  rlen30(zFile)+1,
a6e0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
a6f0: 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69    offset += sqli
a700: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
a710: 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66  e)+1;.        if
a720: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a730: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
a740: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
a750: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
a760: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
a770: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
a780: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
a790: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a7a0: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
a7b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
a7c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a7d0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
a7e0: 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65  * Sync the maste
a7f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
a800: 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51  If the IOCAP_SEQ
a810: 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20  UENTIAL device. 
a820: 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65     ** flag is se
a830: 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65  t this is not re
a840: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
a850: 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
a860: 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c  .     && 0==(sql
a870: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
a880: 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73  acteristics(pMas
a890: 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  ter)&SQLITE_IOCA
a8a0: 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20  P_SEQUENTIAL).  
a8b0: 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21     && SQLITE_OK!
a8c0: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
a8d0: 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
a8e0: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
a8f0: 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
a900: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
a910: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
a920: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
a930: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
a940: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
a950: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
a960: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
a970: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
a980: 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
a990: 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
a9a0: 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
a9b0: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
a9c0: 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
a9d0: 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
a9e0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
a9f0: 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
aa00: 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
aa10: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
aa20: 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
aa30: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
aa40: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
aa50: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
aa60: 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
aa70: 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
aa80: 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
aa90: 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
aaa0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
aab0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
aac0: 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
aad0: 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
aae0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
aaf0: 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
ab00: 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
ab10: 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
ab20: 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
ab30: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
ab40: 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
ab50: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
ab60: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
ab70: 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
ab80: 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f  occurred..    */
ab90: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
aba0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
abb0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
abc0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
abd0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
abe0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
abf0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
ac00: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
ac10: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
ac20: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
ac30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
ac40: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
ac50: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69  (pMaster);.    i
ac60: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ac70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ac80: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
ac90: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
aca0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
acb0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
acc0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
acd0: 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
ace0: 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
acf0: 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
ad00: 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
ad10: 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
ad20: 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
ad30: 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
ad40: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
ad50: 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
ad60: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
ad70: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
ad80: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
ad90: 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
ada0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
adb0: 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
adc0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
add0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
ade0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
adf0: 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
ae00: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
ae10: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
ae20: 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
ae30: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
ae40: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
ae50: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
ae60: 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
ae70: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
ae80: 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
ae90: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
aea0: 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
aeb0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
aec0: 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
aed0: 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
aee0: 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
aef0: 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
af00: 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
af10: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
af20: 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
af30: 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
af40: 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
af50: 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
af60: 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
af70: 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
af80: 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
af90: 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
afa0: 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
afb0: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
afc0: 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
afd0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
afe0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
aff0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
b000: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
b010: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
b020: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
b030: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
b040: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
b050: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
b060: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
b070: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  }.    sqlite3End
b080: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
b090: 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c      enable_simul
b0a0: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
b0b0: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  ;..    sqlite3Vt
b0c0: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
b0d0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
b0e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
b0f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
b100: 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71  ecks that the sq
b110: 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65  lite3.activeVdbe
b120: 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62  Cnt count variab
b130: 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
b140: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
b150: 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
b160: 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
b170: 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
b180: 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
b190: 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
b1a0: 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
b1b0: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
b1c0: 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
b1d0: 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
b1e0: 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
b1f0: 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
b200: 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
b210: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
b220: 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
b230: 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
b240: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
b250: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
b260: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
b270: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
b280: 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
b290: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72  t = 0;.  int nWr
b2a0: 69 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  ite = 0;.  p = d
b2b0: 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
b2c0: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
b2d0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
b2e0: 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70  AGIC_RUN && p->p
b2f0: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e  c>=0 ){.      cn
b300: 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t++;.      if( p
b310: 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20  ->readOnly==0 ) 
b320: 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a  nWrite++;.    }.
b330: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
b340: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
b350: 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56  cnt==db->activeV
b360: 64 62 65 43 6e 74 20 29 3b 0a 20 20 61 73 73 65  dbeCnt );.  asse
b370: 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e  rt( nWrite==db->
b380: 77 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b 0a  writeVdbeCnt );.
b390: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
b3a0: 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
b3b0: 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  nt(x).#endif../*
b3c0: 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74  .** For every Bt
b3d0: 72 65 65 20 74 68 61 74 20 69 6e 20 64 61 74 61  ree that in data
b3e0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
b3f0: 64 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  db which .** has
b400: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20   been modified, 
b410: 22 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69  "trip" or invali
b420: 64 61 74 65 20 65 61 63 68 20 63 75 72 73 6f 72  date each cursor
b430: 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65   in.** that Btre
b440: 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  e might have bee
b450: 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68  n modified so th
b460: 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  at the cursor.**
b470: 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73   can never be us
b480: 65 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20  ed again.  This 
b490: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72  happens when a r
b4a0: 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75  ollback.*** occu
b4b0: 72 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  rs.  We have to 
b4c0: 74 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68  trip all the oth
b4d0: 65 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e  er cursors, even
b4e0: 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20  .** cursor from 
b4f0: 6f 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66  other VMs in dif
b500: 66 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  ferent database 
b510: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20  connections,.** 
b520: 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20  so that none of 
b530: 74 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20  them try to use 
b540: 74 68 65 20 64 61 74 61 20 61 74 20 77 68 69 63  the data at whic
b550: 68 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70  h they.** were p
b560: 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63  ointing and whic
b570: 68 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62  h now may have b
b580: 65 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a  een changed due.
b590: 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61  ** to the rollba
b5a0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62  ck..**.** Rememb
b5b0: 65 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61  er that a rollba
b5c0: 63 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61  ck can delete ta
b5d0: 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e  bles complete an
b5e0: 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f  d.** reorder roo
b5f0: 74 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69  tpages.  So it i
b600: 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74  s not sufficient
b610: 20 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a   just to save.**
b620: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
b630: 65 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61  e cursor.  We ha
b640: 76 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ve to invalidate
b650: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73   the cursor.** s
b660: 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76  o that it is nev
b670: 65 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a  er used again..*
b680: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
b690: 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
b6a0: 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
b6b0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
b6c0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
b6d0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
b6e0: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20  ){.    Btree *p 
b6f0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
b700: 3b 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 73  ;.    if( p && s
b710: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
b720: 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20  rans(p) ){.     
b730: 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
b740: 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53  pAllCursors(p, S
b750: 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20  QLITE_ABORT);.  
b760: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
b770: 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73   If the Vdbe pas
b780: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
b790: 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64   argument opened
b7a0: 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61   a statement-tra
b7b0: 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f  nsaction,.** clo
b7c0: 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d  se it now. Argum
b7d0: 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20  ent eOp must be 
b7e0: 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54  either SAVEPOINT
b7f0: 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20  _ROLLBACK or.** 
b800: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
b810: 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45  E. If it is SAVE
b820: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
b830: 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65  then the stateme
b840: 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
b850: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
b860: 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45  . If eOp is SAVE
b870: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74  POINT_RELEASE, t
b880: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74  hen the .** stat
b890: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
b8a0: 6e 20 69 73 20 63 6f 6d 6d 74 74 65 64 2e 0a 2a  n is commtted..*
b8b0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
b8c0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
b8d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
b8e0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
b8f0: 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
b900: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
b910: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
b920: 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
b930: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65  t(Vdbe *p, int e
b940: 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Op){.  sqlite3 *
b950: 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62  const db = p->db
b960: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
b970: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
b980: 3e 69 53 74 61 74 65 6d 65 6e 74 20 26 26 20 64  >iStatement && d
b990: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 29 7b  b->nStatement ){
b9a0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
b9b0: 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70  const int iSavep
b9c0: 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65  oint = p->iState
b9d0: 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73  ment-1;..    ass
b9e0: 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f  ert( eOp==SAVEPO
b9f0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20  INT_ROLLBACK || 
ba00: 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
ba10: 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73  ELEASE);.    ass
ba20: 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d  ert( db->nStatem
ba30: 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ent>0 );.    ass
ba40: 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65  ert( p->iStateme
ba50: 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d  nt==(db->nStatem
ba60: 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69  ent+db->nSavepoi
ba70: 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nt) );..    for(
ba80: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
ba90: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74  i++){ .      int
baa0: 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
bab0: 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  ;.      Btree *p
bac0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
bad0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
bae0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  Bt ){.        if
baf0: 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
bb00: 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
bb10: 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
bb20: 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
bb30: 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
bb40: 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76  T_ROLLBACK, iSav
bb50: 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
bb60: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
bb70: 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2==SQLITE_OK ){
bb80: 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d  .          rc2 =
bb90: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
bba0: 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
bbb0: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
bbc0: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
bbd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
bbe0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
bbf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
bc00: 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d  = rc2;.        }
bc10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bc20: 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
bc30: 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61  t--;.    p->iSta
bc40: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 7d 0a  tement = 0;.  }.
bc50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
bc60: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  /*.** If SQLite 
bc70: 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73  is compiled to s
bc80: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
bc90: 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20  che mode and to 
bca0: 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a  be threadsafe,.*
bcb0: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  * this routine o
bcc0: 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78  btains the mutex
bcd0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
bce0: 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20 73   each BtShared s
bcf0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74  tructure.** that
bd00: 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64   may be accessed
bd10: 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65   by the VM passe
bd20: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
bd30: 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74  . In doing so it
bd40: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53  .** sets the BtS
bd50: 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20  hared.db member 
bd60: 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42  of each of the B
bd70: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
bd80: 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20  es, ensuring.** 
bd90: 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  that the correct
bda0: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
bdb0: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65  llback is invoke
bdc0: 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a  d if required..*
bdd0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
bde0: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
bdf0: 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72   but does suppor
be00: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
be10: 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c  ode, then.** sql
be20: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
be30: 6c 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  l() is invoked t
be40: 6f 20 73 65 74 20 74 68 65 20 42 74 53 68 61 72  o set the BtShar
be50: 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a  ed.db variables.
be60: 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53  ** of all of BtS
be70: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73  hared structures
be80: 20 61 63 63 65 73 73 69 62 6c 65 20 76 69 61 20   accessible via 
be90: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
bea0: 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74  dle .** associat
beb0: 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e 20  ed with the VM. 
bec0: 4f 66 20 63 6f 75 72 73 65 20 6f 6e 6c 79 20 61  Of course only a
bed0: 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 73 65   subset of these
bee0: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 77   structures.** w
bef0: 69 6c 6c 20 62 65 20 61 63 63 65 73 73 65 64 20  ill be accessed 
bf00: 62 79 20 74 68 65 20 56 4d 2c 20 61 6e 64 20 77  by the VM, and w
bf10: 65 20 63 6f 75 6c 64 20 75 73 65 20 56 64 62 65  e could use Vdbe
bf20: 2e 62 74 72 65 65 4d 61 73 6b 20 74 6f 20 66 69  .btreeMask to fi
bf30: 67 75 72 65 0a 2a 2a 20 74 68 61 74 20 73 75 62  gure.** that sub
bf40: 73 65 74 20 6f 75 74 2c 20 62 75 74 20 74 68 65  set out, but the
bf50: 72 65 20 69 73 20 6e 6f 20 61 64 76 61 6e 74 61  re is no advanta
bf60: 67 65 20 74 6f 20 64 6f 69 6e 67 20 73 6f 2e 0a  ge to doing so..
bf70: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  **.** If SQLite 
bf80: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
bf90: 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73  e and does not s
bfa0: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
bfb0: 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a  che mode, this.*
bfc0: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
bfd0: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65  no-op..*/.#ifnde
bfe0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
bff0: 41 52 45 44 5f 43 41 43 48 45 0a 76 6f 69 64 20  ARED_CACHE.void 
c000: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 74 65 78  sqlite3VdbeMutex
c010: 41 72 72 61 79 45 6e 74 65 72 28 56 64 62 65 20  ArrayEnter(Vdbe 
c020: 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  *p){.#if SQLITE_
c030: 54 48 52 45 41 44 53 41 46 45 0a 20 20 73 71 6c  THREADSAFE.  sql
c040: 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72  ite3BtreeMutexAr
c050: 72 61 79 45 6e 74 65 72 28 26 70 2d 3e 61 4d 75  rayEnter(&p->aMu
c060: 74 65 78 29 3b 0a 23 65 6c 73 65 0a 20 20 73 71  tex);.#else.  sq
c070: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
c080: 6c 6c 28 70 2d 3e 64 62 29 3b 0a 23 65 6e 64 69  ll(p->db);.#endi
c090: 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  f.}.#endif../*.*
c0a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
c0b0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
c0c0: 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
c0d0: 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
c0e0: 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
c0f0: 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
c100: 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
c110: 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
c120: 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
c130: 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
c140: 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
c150: 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
c160: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
c170: 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
c180: 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
c190: 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
c1a0: 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
c1b0: 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
c1c0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49  E_MAGIC_HALT.  I
c1d0: 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f  t is harmless to
c1e0: 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e  .** call this on
c1f0: 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e   a VM that is in
c200: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49   the SQLITE_MAGI
c210: 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a  C_HALT state..**
c220: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
c230: 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
c240: 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
c250: 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
c260: 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
c270: 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
c280: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
c290: 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
c2a0: 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
c2b0: 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
c2c0: 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
c2d0: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
c2e0: 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
c2f0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
c300: 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  t(Vdbe *p){.  in
c310: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
c320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c330: 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   Used to store t
c340: 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20  ransient return 
c350: 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  codes */.  sqlit
c360: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
c370: 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
c380: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
c390: 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
c3a0: 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
c3b0: 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
c3c0: 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
c3d0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
c3e0: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
c3f0: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
c400: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
c410: 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
c420: 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
c430: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
c440: 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20  ollowing errors 
c450: 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  occur:.  **.  **
c460: 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45       SQLITE_NOME
c470: 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  M.  **     SQLIT
c480: 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20  E_IOERR.  **    
c490: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a   SQLITE_FULL.  *
c4a0: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54  *     SQLITE_INT
c4b0: 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  ERRUPT.  **.  **
c4c0: 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e   Then the intern
c4d0: 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68  al cache might h
c4e0: 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e  ave been left in
c4f0: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
c500: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65  .  ** state.  We
c510: 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
c520: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
c530: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
c540: 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e  there is.  ** on
c550: 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  e, or the comple
c560: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
c570: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
c580: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
c590: 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28  ion..  */..  if(
c5a0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
c5b0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
c5c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
c5d0: 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c  ;.  }.  closeAll
c5e0: 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63 74  CursorsExceptAct
c5f0: 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20 20 69  iveVtabs(p);.  i
c600: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
c610: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20  E_MAGIC_RUN ){. 
c620: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c630: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b  _OK;.  }.  check
c640: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
c650: 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
c660: 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
c670: 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
c680: 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
c690: 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  ed */.  if( p->p
c6a0: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  c>=0 ){.    int 
c6b0: 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72  mrc;   /* Primar
c6c0: 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  y error code fro
c6d0: 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69  m p->rc */.    i
c6e0: 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  nt eStatementOp 
c6f0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53  = 0;.    int isS
c700: 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20  pecialError;    
c710: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
c720: 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65  o true if a 'spe
c730: 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a  cial' error */..
c740: 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20      /* Lock all 
c750: 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74  btrees used by t
c760: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
c770: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
c780: 75 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 70  utexArrayEnter(p
c790: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
c7a0: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
c7b0: 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a  special errors *
c7c0: 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72  /.    mrc = p->r
c7d0: 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73  c & 0xff;.    is
c7e0: 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d  SpecialError = m
c7f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
c800: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
c810: 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
c820: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72             || mr
c830: 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c==SQLITE_INTERR
c840: 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  UPT || mrc==SQLI
c850: 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28  TE_FULL;.    if(
c860: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
c870: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
c880: 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61  he query was rea
c890: 64 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65 65 64 20  d-only, we need 
c8a0: 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  do no rollback a
c8b0: 74 20 61 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65  t all. Otherwise
c8c0: 2c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65  ,.      ** proce
c8d0: 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ed with the spec
c8e0: 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  ial handling..  
c8f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
c900: 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c   !p->readOnly ||
c910: 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc!=SQLITE_INT
c920: 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20  ERRUPT ){.      
c930: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
c940: 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
c950: 44 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  D && p->usesStmt
c960: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
c970: 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
c980: 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
c990: 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
c9a0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
c9b0: 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
c9c0: 65 6c 73 65 20 69 66 28 20 28 6d 72 63 3d 3d 53  else if( (mrc==S
c9d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
c9e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29  rc==SQLITE_FULL)
c9f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ca00: 20 20 20 20 26 26 20 70 2d 3e 75 73 65 73 53 74      && p->usesSt
ca10: 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  mtJournal ){.   
ca20: 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
ca30: 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
ca40: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
ca50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ca60: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72     /* We are for
ca70: 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ced to roll back
ca80: 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e   the active tran
ca90: 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20  saction. Before 
caa0: 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  doing.          
cab0: 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79  ** so, abort any
cac0: 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
cad0: 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75  s this handle cu
cae0: 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69  rrently has acti
caf0: 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
cb00: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 76 61 6c  .          inval
cb10: 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
cb20: 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29  difiedBtrees(db)
cb30: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
cb40: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
cb50: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  b);.          sq
cb60: 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
cb70: 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
cb80: 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
cb90: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
cba0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
cbb0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
cbc0: 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
cbd0: 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
cbe0: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
cbf0: 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20  tive writer .   
cc00: 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20   ** VM, then we 
cc10: 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
cc20: 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
cc30: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
cc40: 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
cc50: 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
cc60: 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
cc70: 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
cc80: 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
cc90: 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
cca0: 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
ccb0: 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rred. .    */.  
ccc0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74    if( !sqlite3Vt
ccd0: 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20  abInSync(db) .  
cce0: 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f     && db->autoCo
ccf0: 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62  mmit .     && db
cd00: 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 3d 3d  ->writeVdbeCnt==
cd10: 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29  (p->readOnly==0)
cd20: 20 0a 20 20 20 20 20 26 26 20 28 64 62 2d 3e 66   .     && (db->f
cd30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f  lags & SQLITE_Co
cd40: 6d 6d 69 74 42 75 73 79 29 3d 3d 30 0a 20 20 20  mmitBusy)==0.   
cd50: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
cd60: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
cd70: 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  | (p->errorActio
cd80: 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69  n==OE_Fail && !i
cd90: 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29  sSpecialError) )
cda0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
cdb0: 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
cdc0: 67 20 69 73 20 74 72 75 65 2c 20 61 6e 64 20 74  g is true, and t
cdd0: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
cde0: 77 61 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  was .        ** 
cdf0: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 68 69  successful or hi
ce00: 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63  t an 'OR FAIL' c
ce10: 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68 69 73 20  onstraint. This 
ce20: 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a  means a commit .
ce30: 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65          ** is re
ce40: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 20 20  quired..        
ce50: 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
ce60: 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70  vdbeCommit(db, p
ce70: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
ce80: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
ce90: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
cea0: 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72  te3BtreeMutexArr
ceb0: 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74  ayLeave(&p->aMut
cec0: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ex);.          r
ced0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
cee0: 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
cef0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
cf00: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
cf10: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
cf20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
cf30: 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
cf40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cf50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
cf60: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
cf70: 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ges(db);.       
cf80: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
cf90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
cfa0: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
cfb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62        }.      db
cfc0: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
cfd0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
cfe0: 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20  eStatementOp==0 
cff0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
d000: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
d010: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
d020: 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20  =OE_Fail ){.    
d030: 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
d040: 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c   = SAVEPOINT_REL
d050: 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EASE;.      }els
d060: 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63  e if( p->errorAc
d070: 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  tion==OE_Abort )
d080: 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  {.        eState
d090: 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
d0a0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
d0b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d0c0: 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73    invalidateCurs
d0d0: 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72  orsOnModifiedBtr
d0e0: 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ees(db);.       
d0f0: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
d100: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
d110: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
d120: 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
d130: 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
d140: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  mit = 1;.      }
d150: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
d160: 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70   If eStatementOp
d170: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
d180: 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  en a statement t
d190: 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73  ransaction needs
d1a0: 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f   to.    ** be co
d1b0: 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
d1c0: 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c  d back. Call sql
d1d0: 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
d1e0: 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20  tement() to.    
d1f0: 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69  ** do so. If thi
d200: 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75  s operation retu
d210: 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e  rns an error, an
d220: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  d the current st
d230: 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65  atement.    ** e
d240: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
d250: 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45  ITE_OK or SQLITE
d260: 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65  _CONSTRAINT, the
d270: 6e 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 0a  n set the error.
d280: 20 20 20 20 2a 2a 20 63 6f 64 65 20 74 6f 20 74      ** code to t
d290: 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 20  he new value..  
d2a0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74    */.    if( eSt
d2b0: 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20  atementOp ){.   
d2c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
d2d0: 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
d2e0: 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f  t(p, eStatementO
d2f0: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  p);.      if( rc
d300: 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49   && (p->rc==SQLI
d310: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
d320: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
d330: 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  T) ){.        p-
d340: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
d350: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d360: 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
d370: 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  .        p->zErr
d380: 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Msg = 0;.      }
d390: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
d3a0: 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20   If this was an 
d3b0: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
d3c0: 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20  r DELETE and no 
d3d0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
d3e0: 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73  ction.    ** has
d3f0: 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
d400: 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64 61  k, update the da
d410: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
d420: 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  n change-counter
d430: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
d440: 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e  ( p->changeCntOn
d450: 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && p->pc>=0 ){.
d460: 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65        if( eState
d470: 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e  mentOp!=SAVEPOIN
d480: 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
d490: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d4a0: 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
d4b0: 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
d4c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d4d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d4e0: 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a  Changes(db, 0);.
d4f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
d500: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
d510: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f    }.  .    /* Ro
d520: 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74  llback or commit
d530: 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e   any schema chan
d540: 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 72 65  ges that occurre
d550: 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  d. */.    if( p-
d560: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc!=SQLITE_OK &
d570: 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  & db->flags&SQLI
d580: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
d590: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d5a0: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
d5b0: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20  hema(db, 0);.   
d5c0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28     db->flags = (
d5d0: 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49  db->flags | SQLI
d5e0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
d5f0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
d600: 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
d610: 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ks */.    sqlite
d620: 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79  3BtreeMutexArray
d630: 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78  Leave(&p->aMutex
d640: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20  );.  }..  /* We 
d650: 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c  have successfull
d660: 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f  y halted and clo
d670: 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63  sed the VM.  Rec
d680: 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ord this fact. *
d690: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
d6a0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69   ){.    db->acti
d6b0: 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20  veVdbeCnt--;.   
d6c0: 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
d6d0: 79 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 77  y ){.      db->w
d6e0: 72 69 74 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20  riteVdbeCnt--;. 
d6f0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
d700: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
d710: 6e 74 3e 3d 64 62 2d 3e 77 72 69 74 65 56 64 62  nt>=db->writeVdb
d720: 65 43 6e 74 20 29 3b 0a 20 20 7d 0a 20 20 70 2d  eCnt );.  }.  p-
d730: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
d740: 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63  GIC_HALT;.  chec
d750: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
d760: 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  b);.  if( p->db-
d770: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
d780: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
d790: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
d7a0: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
d7b0: 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
d7c0: 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65  set to true, the
d7d0: 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74  n any locks that
d7e0: 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20   were held.  ** 
d7f0: 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  by connection db
d800: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
d810: 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71  eleased. Call sq
d820: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
d830: 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20  nlocked() .  ** 
d840: 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65  to invoke any re
d850: 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f  quired unlock-no
d860: 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
d870: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61    */.  if( db->a
d880: 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
d890: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
d8a0: 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a  onUnlocked(db);.
d8b0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64    }..  assert( d
d8c0: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
d8d0: 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f  >0 || db->autoCo
d8e0: 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e  mmit==0 || db->n
d8f0: 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a  Statement==0 );.
d900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d910: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61  OK;.}.../*.** Ea
d920: 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68  ch VDBE holds th
d930: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
d940: 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
d950: 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a  te3_step() call.
d960: 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68  ** in p->rc.  Th
d970: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
d980: 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b  that result back
d990: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a   to SQLITE_OK..*
d9a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
d9b0: 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c  beResetStepResul
d9c0: 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  t(Vdbe *p){.  p-
d9d0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
d9e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
d9f0: 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20  up a VDBE after 
da00: 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f  execution but do
da10: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
da20: 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a  VDBE just yet..*
da30: 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f  * Write any erro
da40: 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20  r messages into 
da50: 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75  *pzErrMsg.  Retu
da60: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  rn the result co
da70: 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  de..**.** After 
da80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
da90: 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68  run, the VDBE sh
daa0: 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f  ould be ready to
dab0: 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   be executed.** 
dac0: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  again..**.** To 
dad0: 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68  look at it anoth
dae0: 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75  er way, this rou
daf0: 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20  tine resets the 
db00: 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  state of the.** 
db10: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
db20: 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f  from VDBE_MAGIC_
db30: 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49  RUN or VDBE_MAGI
db40: 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a  C_HALT back to.*
db50: 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  * VDBE_MAGIC_INI
db60: 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
db70: 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20  3VdbeReset(Vdbe 
db80: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
db90: 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  db;.  db = p->db
dba0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
dbb0: 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f  M did not run to
dbc0: 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69   completion or i
dbd0: 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64  f it encountered
dbe0: 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20   an.  ** error, 
dbf0: 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f  then it might no
dc00: 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74  t have been halt
dc10: 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f  ed properly.  So
dc20: 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f   halt.  ** it no
dc30: 77 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29  w..  */.  (void)
dc40: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
dc50: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  db);.  sqlite3Vd
dc60: 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 28 76 6f  beHalt(p);.  (vo
dc70: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
dc80: 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49  Off(db);..  /* I
dc90: 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  f the VDBE has b
dca0: 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69  e run even parti
dcb0: 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73  ally, then trans
dcc0: 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f  fer the error co
dcd0: 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f  de.  ** and erro
dce0: 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74  r message from t
dcf0: 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65  he VDBE into the
dd00: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
dd10: 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20  tructure.  But. 
dd20: 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20   ** if the VDBE 
dd30: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65  has just been se
dd40: 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73  t to run but has
dd50: 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78   not actually ex
dd60: 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20  ecuted any.  ** 
dd70: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74  instructions yet
dd80: 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e  , leave the main
dd90: 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
dda0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68  information unch
ddb0: 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  anged..  */.  if
ddc0: 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
ddd0: 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67    if( p->zErrMsg
dde0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ddf0: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
de00: 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oc();.      sqli
de10: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
de20: 62 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45  b->pErr,-1,p->zE
de30: 72 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46  rrMsg,SQLITE_UTF
de40: 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  8,SQLITE_TRANSIE
de50: 4e 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  NT);.      sqlit
de60: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
de70: 63 28 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65  c();.      db->e
de80: 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a  rrCode = p->rc;.
de90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
dea0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
deb0: 73 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45  sg);.      p->zE
dec0: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d  rrMsg = 0;.    }
ded0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29  else if( p->rc )
dee0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
def0: 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20  rror(db, p->rc, 
df00: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
df10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
df20: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  r(db, SQLITE_OK,
df30: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
df40: 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20  se if( p->rc && 
df50: 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20  p->expired ){.  
df60: 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64    /* The expired
df70: 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e   flag was set on
df80: 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65   the VDBE before
df90: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a   the first call.
dfa0: 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
dfb0: 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f  3_step(). For co
dfc0: 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65  nsistency (since
dfd0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
dfe0: 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65  was.    ** calle
dff0: 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  d), set the data
e000: 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68  base error in th
e010: 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e  is case as well.
e020: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
e030: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e  te3Error(db, p->
e040: 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rc, 0);.    sqli
e050: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
e060: 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e  b->pErr, -1, p->
e070: 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f  zErrMsg, SQLITE_
e080: 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41  UTF8, SQLITE_TRA
e090: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
e0a0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
e0b0: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
e0c0: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
e0d0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69    }..  /* Reclai
e0e0: 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65  m all memory use
e0f0: 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20  d by the VDBE.  
e100: 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  */.  Cleanup(p);
e110: 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66  ..  /* Save prof
e120: 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iling informatio
e130: 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45  n from this VDBE
e140: 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65   run..  */.#ifde
e150: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
e160: 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
e170: 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
e180: 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
e190: 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
e1a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
e1b0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
e1c0: 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
e1d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
e1e0: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
e1f0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
e200: 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
e210: 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
e220: 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
e230: 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
e240: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
e250: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
e260: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
e270: 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c   "%6d %10lld %8l
e280: 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ld ",.          
e290: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
e2a0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
e2b0: 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
e2c0: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
e2d0: 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
e2e0: 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
e2f0: 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
e300: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
e310: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
e320: 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
e330: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
e340: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
e350: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
e360: 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  dif.  p->magic =
e370: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
e380: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
e390: 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
e3a0: 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
e3b0: 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
e3c0: 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
e3d0: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
e3e0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
e3f0: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
e400: 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
e410: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
e420: 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
e430: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
e440: 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
e450: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
e460: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
e470: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
e480: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
e490: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
e4a0: 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
e4b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
e4c0: 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  beReset(p);.    
e4d0: 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
e4e0: 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
e4f0: 63 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  c );.  }else if(
e500: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
e510: 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20  MAGIC_INIT ){.  
e520: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e530: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71  MISUSE;.  }.  sq
e540: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
e550: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
e560: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74  .}../*.** Call t
e570: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
e580: 72 20 65 61 63 68 20 61 75 78 64 61 74 61 20 65  r each auxdata e
e590: 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e  ntry in pVdbeFun
e5a0: 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74  c for which.** t
e5b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
e5c0: 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20   bit in mask is 
e5d0: 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 20  clear.  Auxdata 
e5e0: 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33  entries beyond 3
e5f0: 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20  1.** are always 
e600: 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64  destroyed.  To d
e610: 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61  estroy all auxda
e620: 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c  ta entries, call
e630: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
e640: 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a   with mask==0..*
e650: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
e660: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
e670: 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46  VdbeFunc *pVdbeF
e680: 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  unc, int mask){.
e690: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
e6a0: 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d  =0; i<pVdbeFunc-
e6b0: 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAux; i++){.   
e6c0: 20 73 74 72 75 63 74 20 41 75 78 44 61 74 61 20   struct AuxData 
e6d0: 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 75  *pAux = &pVdbeFu
e6e0: 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20  nc->apAux[i];.  
e6f0: 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21    if( (i>31 || !
e700: 28 6d 61 73 6b 26 28 28 28 75 33 32 29 31 29 3c  (mask&(((u32)1)<
e710: 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70  <i))) && pAux->p
e720: 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Aux ){.      if(
e730: 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29   pAux->xDelete )
e740: 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e  {.        pAux->
e750: 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41  xDelete(pAux->pA
e760: 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ux);.      }.   
e770: 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20     pAux->pAux = 
e780: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
e790: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
e7a0: 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a  entire VDBE..*/.
e7b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
e7c0: 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b  Delete(Vdbe *p){
e7d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
e7e0: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
e7f0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
e800: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69   db = p->db;.  i
e810: 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
e820: 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
e830: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
e840: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
e850: 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
e860: 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
e870: 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
e880: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
e890: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
e8a0: 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
e8b0: 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ev;.  }.  if( p-
e8c0: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a  >aOp ){.    Op *
e8d0: 70 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20  pOp = p->aOp;.  
e8e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
e8f0: 6e 4f 70 3b 20 69 2b 2b 2c 20 70 4f 70 2b 2b 29  nOp; i++, pOp++)
e900: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64  {.      freeP4(d
e910: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
e920: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64  pOp->p4.p);.#ifd
e930: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
e940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
e950: 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f  ree(db, pOp->zCo
e960: 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20  mment);.#endif  
e970: 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20     .    }.  }.  
e980: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
e990: 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
e9a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
e9b0: 65 65 28 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c  ee(db, p->aLabel
e9c0: 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
e9d0: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
e9e0: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
e9f0: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
ea00: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
ea10: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
ea20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
ea30: 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d  , p->zSql);.  p-
ea40: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
ea50: 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69  GIC_DEAD;.  sqli
ea60: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
ea70: 3e 61 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  >aOp);.  sqlite3
ea80: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46  DbFree(db, p->pF
ea90: 72 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ree);.  sqlite3D
eaa0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
eab0: 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65  ./*.** If a Move
eac0: 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  To operation is 
ead0: 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67  pending on the g
eae0: 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65  iven cursor, the
eaf0: 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76  n do that.** Mov
eb00: 65 54 6f 20 6e 6f 77 2e 20 20 52 65 74 75 72 6e  eTo now.  Return
eb10: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
eb20: 20 49 66 20 6e 6f 20 4d 6f 76 65 54 6f 20 69 73   If no MoveTo is
eb30: 20 70 65 6e 64 69 6e 67 2c 20 74 68 69 73 0a 2a   pending, this.*
eb40: 2a 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  * routine does n
eb50: 6f 74 68 69 6e 67 20 61 6e 64 20 72 65 74 75 72  othing and retur
eb60: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ns SQLITE_OK..*/
eb70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
eb80: 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62  CursorMoveto(Vdb
eb90: 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
eba0: 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  f( p->deferredMo
ebb0: 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20  veto ){.    int 
ebc0: 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20  res, rc;.#ifdef 
ebd0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
ebe0: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
ebf0: 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
ec00: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
ec10: 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29  rt( p->isTable )
ec20: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
ec30: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
ec40: 61 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  acked(p->pCursor
ec50: 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  , 0, p->movetoTa
ec60: 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a  rget, 0, &res);.
ec70: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
ec80: 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c  urn rc;.    p->l
ec90: 61 73 74 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f  astRowid = keyTo
eca0: 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72  Int(p->movetoTar
ecb0: 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77  get);.    p->row
ecc0: 69 64 49 73 56 61 6c 69 64 20 3d 20 41 4c 57 41  idIsValid = ALWA
ecd0: 59 53 28 72 65 73 3d 3d 30 29 20 3f 31 3a 30 3b  YS(res==0) ?1:0;
ece0: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 72  .    if( NEVER(r
ecf0: 65 73 3c 30 29 20 29 7b 0a 20 20 20 20 20 20 72  es<0) ){.      r
ed00: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
ed10: 4e 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c  Next(p->pCursor,
ed20: 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66   &res);.      if
ed30: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
ed40: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
ed50: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73  QLITE_TEST.    s
ed60: 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
ed70: 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
ed80: 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
ed90: 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  eto = 0;.    p->
eda0: 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
edb0: 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c  CHE_STALE;.  }el
edc0: 73 65 20 69 66 28 20 70 2d 3e 70 43 75 72 73 6f  se if( p->pCurso
edd0: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61 73  r ){.    int has
ede0: 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74 20 72  Moved;.    int r
edf0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
ee00: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
ee10: 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68 61 73 4d  ->pCursor, &hasM
ee20: 6f 76 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  oved);.    if( r
ee30: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
ee40: 20 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64 20     if( hasMoved 
ee50: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61 63 68  ){.      p->cach
ee60: 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
ee70: 53 54 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d 3e  STALE;.      p->
ee80: 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20  nullRow = 1;.   
ee90: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
eea0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
eeb0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
eec0: 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a  g functions:.**.
eed0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
eee0: 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71  rialType().** sq
eef0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
ef00: 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ypeLen().** sqli
ef10: 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e  te3VdbeSerialLen
ef20: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
ef30: 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20  eSerialPut().** 
ef40: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
ef50: 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63  lGet().**.** enc
ef60: 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64  apsulate the cod
ef70: 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65  e that serialize
ef80: 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f  s values for sto
ef90: 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a  rage in SQLite.*
efa0: 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78  * data and index
efb0: 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73   records. Each s
efc0: 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20  erialized value 
efd0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
efe0: 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61   'serial-type' a
eff0: 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  nd a blob of dat
f000: 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  a. The serial ty
f010: 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20  pe is an 8-byte 
f020: 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65  unsigned.** inte
f030: 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ger, stored as a
f040: 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   varint..**.** I
f050: 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65  n an SQLite inde
f060: 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65  x record, the se
f070: 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f  rial type is sto
f080: 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66  red directly bef
f090: 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20  ore.** the blob 
f0a0: 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20  of data that it 
f0b0: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20  corresponds to. 
f0c0: 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72  In a table recor
f0d0: 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a  d, all serial.**
f0e0: 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65   types are store
f0f0: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
f100: 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e  f the record, an
f110: 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64  d the blobs of d
f120: 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ata at.** the en
f130: 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66  d. Hence these f
f140: 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74  unctions allow t
f150: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e  he caller to han
f160: 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61  dle the.** seria
f170: 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20  l-type and data 
f180: 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e  blob seperately.
f190: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
f1a0: 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
f1b0: 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73  ibes the various
f1c0: 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73   storage classes
f1d0: 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a   for data:.**.**
f1e0: 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20     serial type  
f1f0: 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64        bytes of d
f200: 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a  ata      type.**
f210: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
f220: 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
f230: 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
f240: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
f250: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
f260: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
f270: 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20      NULL.**     
f280: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
f290: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
f2a0: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
f2b0: 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20  er.**      2    
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2d0: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69   2            si
f2e0: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
f2f0: 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
f300: 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20             3    
f310: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
f320: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34  nteger.**      4
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f340: 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
f350: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
f360: 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20  .**      5      
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36                 6
f380: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
f390: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
f3a0: 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
f3b0: 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
f3c0: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
f3d0: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20  eger.**      7  
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3f0: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
f400: 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20  IEEE float.**   
f410: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
f420: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
f430: 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
f440: 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20  nstant 0.**     
f450: 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20   9              
f460: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
f470: 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
f480: 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30  tant 1.**     10
f490: 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20  ,11             
f4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4b0: 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65    reserved for e
f4c0: 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e  xpansion.**    N
f4d0: 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20  >=12 and even   
f4e0: 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20      (N-12)/2    
f4f0: 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e      BLOB.**    N
f500: 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20  >=13 and odd    
f510: 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20      (N-13)/2    
f520: 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54      text.**.** T
f530: 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73  he 8 and 9 types
f540: 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33   were added in 3
f550: 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61  .3.0, file forma
f560: 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73  t 4.  Prior vers
f570: 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
f580: 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72  e will not under
f590: 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69  stand those seri
f5a0: 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a  al types..*/../*
f5b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
f5c0: 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
f5d0: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
f5e0: 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20  in pMem..*/.u32 
f5f0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
f600: 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c  lType(Mem *pMem,
f610: 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
f620: 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
f630: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20   pMem->flags;.  
f640: 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c  int n;..  if( fl
f650: 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
f660: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
f670: 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
f680: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  M_Int ){.    /* 
f690: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
f6a0: 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20  er to use 1, 2, 
f6b0: 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e  4, 6 or 8 bytes.
f6c0: 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
f6d0: 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34  AX_6BYTE ((((i64
f6e0: 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32  )0x00008000)<<32
f6f0: 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d  )-1).    i64 i =
f700: 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
f710: 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 66  u64 u;.    if( f
f720: 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26  ile_format>=4 &&
f730: 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a 20 20 20   (i&1)==i ){.   
f740: 20 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32     return 8+(u32
f750: 29 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 20  )i;.    }.    u 
f760: 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a  = i<0 ? -i : i;.
f770: 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29      if( u<=127 )
f780: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
f790: 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65  f( u<=32767 ) re
f7a0: 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
f7b0: 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74  u<=8388607 ) ret
f7c0: 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75  urn 3;.    if( u
f7d0: 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72  <=2147483647 ) r
f7e0: 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28  eturn 4;.    if(
f7f0: 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20   u<=MAX_6BYTE ) 
f800: 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65  return 5;.    re
f810: 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
f820: 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
f830: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37   ){.    return 7
f840: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
f850: 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  pMem->db->malloc
f860: 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26  Failed || flags&
f870: 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
f880: 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d  b) );.  n = pMem
f890: 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ->n;.  if( flags
f8a0: 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
f8b0: 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e     n += pMem->u.
f8c0: 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 61 73 73  nZero;.  }.  ass
f8d0: 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72  ert( n>=0 );.  r
f8e0: 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31  eturn ((n*2) + 1
f8f0: 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f  2 + ((flags&MEM_
f900: 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a  Str)!=0));.}../*
f910: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c  .** Return the l
f920: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74  ength of the dat
f930: 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  a corresponding 
f940: 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
f950: 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a  serial-type..*/.
f960: 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
f970: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32  erialTypeLen(u32
f980: 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
f990: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
f9a0: 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75  >=12 ){.    retu
f9b0: 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d  rn (serial_type-
f9c0: 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  12)/2;.  }else{.
f9d0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
f9e0: 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20   u8 aSize[] = { 
f9f0: 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36  0, 1, 2, 3, 4, 6
fa00: 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c  , 8, 8, 0, 0, 0,
fa10: 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e   0 };.    return
fa20: 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79   aSize[serial_ty
fa30: 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pe];.  }.}../*.*
fa40: 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61  * If we are on a
fa50: 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77  n architecture w
fa60: 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  ith mixed-endian
fa70: 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f   floating .** po
fa80: 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20  ints (ex: ARM7) 
fa90: 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f  then swap the lo
faa0: 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68  wer 4 bytes with
fab0: 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34   the .** upper 4
fac0: 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20   bytes.  Return 
fad0: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
fae0: 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69  * For most archi
faf0: 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69  tectures, this i
fb00: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
fb10: 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73   (later):  It is
fb20: 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20   reported to me 
fb30: 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65  that the mixed-e
fb40: 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a  ndian problem.**
fb50: 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69   on ARM7 is an i
fb60: 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e  ssue with GCC, n
fb70: 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37  ot with the ARM7
fb80: 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73   chip.  It seems
fb90: 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76  .** that early v
fba0: 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73  ersions of GCC s
fbb0: 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f  tored the two wo
fbc0: 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a  rds of a 64-bit.
fbd0: 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20  ** float in the 
fbe0: 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e  wrong order.  An
fbf0: 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73  d that error has
fc00: 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64   been propagated
fc10: 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20  .** ever since. 
fc20: 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f   The blame is no
fc30: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69  t necessarily wi
fc40: 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a  th GCC, though..
fc50: 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76  ** GCC might hav
fc60: 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74  e just copying t
fc70: 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20  he problem from 
fc80: 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72  a prior compiler
fc90: 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74  ..** I am also t
fca0: 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76  old that newer v
fcb0: 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74  ersions of GCC t
fcc0: 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66  hat follow a dif
fcd0: 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65  ferent.** ABI ge
fce0: 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
fcf0: 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65   right..**.** De
fd00: 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53  velopers using S
fd10: 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37  QLite on an ARM7
fd20: 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20   should compile 
fd30: 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a  and run their.**
fd40: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69   application usi
fd50: 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55  ng -DSQLITE_DEBU
fd60: 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  G=1 at least onc
fd70: 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a  e.  With DEBUG.*
fd80: 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20  * enabled, some 
fd90: 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69  asserts below wi
fda0: 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  ll ensure that t
fdb0: 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66  he byte order of
fdc0: 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  .** floating poi
fdd0: 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72  nt values is cor
fde0: 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30  rect..**.** (200
fdf0: 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20  7-08-30)  Frank 
fe00: 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75  van Vugt has stu
fe10: 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65  died this proble
fe20: 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64  m closely.** and
fe30: 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69   has send his fi
fe40: 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51  ndings to the SQ
fe50: 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e  Lite developers.
fe60: 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65    Frank.** write
fe70: 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75  s that some Linu
fe80: 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20  x kernels offer 
fe90: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68  floating point h
fea0: 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61  ardware.** emula
feb0: 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f  tion that uses o
fec0: 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69  nly 32-bit manti
fed0: 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ssas instead of 
fee0: 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69  a full .** 48-bi
fef0: 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62  ts as required b
ff00: 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64  y the IEEE stand
ff10: 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74  ard.  (This is t
ff20: 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45  he.** CONFIG_FPE
ff30: 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e  _FASTFPE option.
ff40: 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65  )  On such syste
ff50: 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ms, floating poi
ff60: 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70  nt.** byte swapp
ff70: 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79  ing becomes very
ff80: 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54   complicated.  T
ff90: 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
ffa0: 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61  ,.** the necessa
ffb0: 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ry byte swapping
ffc0: 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20   is carried out 
ffd0: 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69  using a 64-bit i
ffe0: 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72  nteger.** rather
fff0: 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66   than a 64-bit f
10000 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73  loat.  Frank ass
10010 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65  ures us that the
10020 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f   code here.** wo
10030 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65  rks for him.  We
10040 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  , the developers
10050 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f  , have no way to
10060 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a   independently.*
10070 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62  * verify this, b
10080 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74  ut Frank seems t
10090 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69  o know what he i
100a0 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a  s talking about.
100b0 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68  ** so we trust h
100c0 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  im..*/.#ifdef SQ
100d0 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
100e0 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74  N_64BIT_FLOAT.st
100f0 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77  atic u64 floatSw
10100 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e  ap(u64 in){.  un
10110 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b  ion {.    u64 r;
10120 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20  .    u32 i[2];. 
10130 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a   } u;.  u32 t;..
10140 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20    u.r = in;.  t 
10150 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b  = u.i[0];.  u.i[
10160 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75  0] = u.i[1];.  u
10170 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74  .i[1] = t;.  ret
10180 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66  urn u.r;.}.# def
10190 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
101a0 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d  ianFloat(X)  X =
101b0 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65   floatSwap(X).#e
101c0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61  lse.# define swa
101d0 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
101e0 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(X).#endif../*.
101f0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72  ** Write the ser
10200 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f  ialized data blo
10210 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  b for the value 
10220 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69  stored in pMem i
10230 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20  nto .** buf. It 
10240 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
10250 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
10260 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69  llocated suffici
10270 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65  ent space..** Re
10280 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
10290 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
102a0 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20  ..**.** nBuf is 
102b0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70  the amount of sp
102c0 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b  ace left in buf[
102d0 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61 6c  ].  nBuf must al
102e0 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65  ways be.** large
102f0 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
10300 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64  the entire field
10310 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  .  Except, if th
10320 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20  e field is.** a 
10330 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72 6f  blob with a zero
10340 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68  -filled tail, th
10350 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20 62  en buf[] might b
10360 65 20 6a 75 73 74 20 74 68 65 20 72 69 67 68 74  e just the right
10370 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64  .** size to hold
10380 20 65 76 65 72 79 74 68 69 6e 67 20 65 78 63 65   everything exce
10390 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d  pt for the zero-
103a0 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49 66  filled tail.  If
103b0 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c   buf[].** is onl
103c0 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  y big enough to 
103d0 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72  hold the non-zer
103e0 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20 6f  o prefix, then o
103f0 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a 2a  nly write that.*
10400 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62 75  * prefix into bu
10410 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75 66  f[].  But if buf
10420 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  [] is large enou
10430 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20  gh to hold both 
10440 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e  the.** prefix an
10450 64 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e 20  d the tail then 
10460 77 72 69 74 65 20 74 68 65 20 70 72 65 66 69 78  write the prefix
10470 20 61 6e 64 20 73 65 74 20 74 68 65 20 74 61 69   and set the tai
10480 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f  l to all.** zero
10490 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
104a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
104b0 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69  tes actually wri
104c0 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  tten into buf[].
104d0 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
104e0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
104f0 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
10500 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
10510 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
10520 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73   only.** if thos
10530 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72  e bytes were zer
10540 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f  oed in buf[]..*/
10550 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62   .u32 sqlite3Vdb
10560 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62  eSerialPut(u8 *b
10570 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65  uf, int nBuf, Me
10580 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
10590 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32  e_format){.  u32
105a0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73   serial_type = s
105b0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
105c0 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f  Type(pMem, file_
105d0 66 6f 72 6d 61 74 29 3b 0a 20 20 75 33 32 20 6c  format);.  u32 l
105e0 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
105f0 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
10600 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
10610 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
10620 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
10630 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20  ;.    u32 i;.   
10640 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
10650 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
10660 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
10670 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20  sizeof(pMem->r) 
10680 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
10690 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69  &v, &pMem->r, si
106a0 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20  zeof(v));.      
106b0 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
106c0 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c  loat(v);.    }el
106d0 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d  se{.      v = pM
106e0 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20  em->u.i;.    }. 
106f0 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c     len = i = sql
10700 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
10710 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
10720 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
10730 6c 65 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20  len<=nBuf );.   
10740 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20   while( i-- ){. 
10750 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 75       buf[i] = (u
10760 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20  8)(v&0xFF);.    
10770 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d    v >>= 8;.    }
10780 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
10790 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e  .  }..  /* Strin
107a0 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69  g or blob */.  i
107b0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
107c0 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  12 ){.    assert
107d0 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d  ( pMem->n + ((pM
107e0 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
107f0 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a  Zero)?pMem->u.nZ
10800 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20  ero:0).         
10810 20 20 20 20 3d 3d 20 73 71 6c 69 74 65 33 56 64      == sqlite3Vd
10820 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
10830 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a  serial_type) );.
10840 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
10850 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20  ->n<=nBuf );.   
10860 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
10870 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20      memcpy(buf, 
10880 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
10890 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
108a0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
108b0 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d  .      len += pM
108c0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  em->u.nZero;.   
108d0 20 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e     assert( nBuf>
108e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
108f0 6c 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66 20  len > (u32)nBuf 
10900 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d  ){.        len =
10910 20 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20 20   (u32)nBuf;.    
10920 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
10930 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20  (&buf[pMem->n], 
10940 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b  0, len-pMem->n);
10950 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
10960 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
10970 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e   NULL or constan
10980 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72  ts 0 or 1 */.  r
10990 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
109a0 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68  * Deserialize th
109b0 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e  e data blob poin
109c0 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73  ted to by buf as
109d0 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72   serial type ser
109e0 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20  ial_type.** and 
109f0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
10a00 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72   in pMem.  Retur
10a10 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
10a20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a  bytes read..*/ .
10a30 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
10a40 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
10a50 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
10a60 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
10a70 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
10a80 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
10a90 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
10aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
10ab0 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
10ac0 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
10ad0 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
10ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
10af0 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
10b00 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
10b10 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73  /.){.  switch( s
10b20 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
10b30 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20    case 10:   /* 
10b40 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
10b50 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
10b60 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73  ase 11:   /* Res
10b70 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
10b80 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
10b90 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a   0: {  /* NULL *
10ba0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  /.      pMem->fl
10bb0 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
10bc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10bd0 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b   }.    case 1: {
10be0 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65   /* 1-byte signe
10bf0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
10c00 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
10c10 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
10c20 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0];.      pMem->
10c30 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
10c40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
10c50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10c60 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
10c70 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
10c80 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
10c90 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
10ca0 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20  r)buf[0])<<8) | 
10cb0 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[1];.      pM
10cc0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
10cd0 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
10ce0 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 2;.    }.    c
10cf0 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
10d00 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
10d10 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
10d20 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  >u.i = (((signed
10d30 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31   char)buf[0])<<1
10d40 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29  6) | (buf[1]<<8)
10d50 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20   | buf[2];.     
10d60 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
10d70 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
10d80 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20  turn 3;.    }.  
10d90 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
10da0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
10db0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
10dc0 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30  em->u.i = (buf[0
10dd0 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d  ]<<24) | (buf[1]
10de0 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c  <<16) | (buf[2]<
10df0 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20  <8) | buf[3];.  
10e00 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
10e10 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
10e20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d   return 4;.    }
10e30 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f  .    case 5: { /
10e40 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 6-byte signed 
10e50 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
10e60 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e   u64 x = (((sign
10e70 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
10e80 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
10e90 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66      u32 y = (buf
10ea0 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [2]<<24) | (buf[
10eb0 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34  3]<<16) | (buf[4
10ec0 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a  ]<<8) | buf[5];.
10ed0 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
10ee0 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65  ) | y;.      pMe
10ef0 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
10f00 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  &x;.      pMem->
10f10 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
10f20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b  .      return 6;
10f30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10f40 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73  6:   /* 8-byte s
10f50 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
10f60 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f  .    case 7: { /
10f70 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20  * IEEE floating 
10f80 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75  point */.      u
10f90 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20  64 x;.      u32 
10fa0 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  y;.#if !defined(
10fb0 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  NDEBUG) && !defi
10fc0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
10fd0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
10fe0 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
10ff0 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e  that integers an
11000 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  d floating point
11010 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20   values use the 
11020 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  same.      ** by
11030 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
11040 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
11050 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
11060 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20  _FLOAT is.      
11070 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
11080 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
11090 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
110a0 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
110b0 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20      ** endian.. 
110c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
110d0 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
110e0 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
110f0 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20  0000)<<32;.     
11100 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f   static const do
11110 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20  uble r1 = 1.0;. 
11120 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31       u64 t2 = t1
11130 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
11140 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29  dEndianFloat(t2)
11150 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11160 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
11170 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
11180 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
11190 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
111a0 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28  dif..      x = (
111b0 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[0]<<24) | (b
111c0 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[1]<<16) | (bu
111d0 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33  f[2]<<8) | buf[3
111e0 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75  ];.      y = (bu
111f0 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[4]<<24) | (buf
11200 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [5]<<16) | (buf[
11210 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b  6]<<8) | buf[7];
11220 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
11230 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66  2) | y;.      if
11240 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36  ( serial_type==6
11250 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
11260 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
11270 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  x;.        pMem-
11280 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
11290 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
112a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
112b0 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73  izeof(x)==8 && s
112c0 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d  izeof(pMem->r)==
112d0 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61  8 );.        swa
112e0 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
112f0 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  t(x);.        me
11300 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26  mcpy(&pMem->r, &
11310 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
11320 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
11330 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61  gs = sqlite3IsNa
11340 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d  N(pMem->r) ? MEM
11350 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c  _Null : MEM_Real
11360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11370 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a  return 8;.    }.
11380 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
11390 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
113a0 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
113b0 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
113c0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
113d0 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20  serial_type-8;. 
113e0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
113f0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
11400 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
11410 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
11420 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20 3d  .      u32 len =
11430 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
11440 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )/2;.      pMem-
11450 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66  >z = (char *)buf
11460 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
11470 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65  = len;.      pMe
11480 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20  m->xDel = 0;.   
11490 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
114a0 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20  pe&0x01 ){.     
114b0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
114c0 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45   MEM_Str | MEM_E
114d0 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  phem;.      }els
114e0 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  e{.        pMem-
114f0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f  >flags = MEM_Blo
11500 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20  b | MEM_Ephem;. 
11510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
11520 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20  urn len;.    }. 
11530 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
11540 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  .../*.** Given t
11550 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63  he nKey-byte enc
11560 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72  oding of a recor
11570 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72  d in pKey[], par
11580 73 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  se the.** record
11590 20 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65 64   into a Unpacked
115a0 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
115b0 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
115c0 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73  ter to.** that s
115d0 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
115e0 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
115f0 74 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76 69  tion might provi
11600 64 65 20 73 7a 53 70 61 63 65 20 62 79 74 65 73  de szSpace bytes
11610 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70   of memory.** sp
11620 61 63 65 20 61 74 20 70 53 70 61 63 65 2e 20 20  ace at pSpace.  
11630 54 68 69 73 20 73 70 61 63 65 20 63 61 6e 20 62  This space can b
11640 65 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74  e used to hold t
11650 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56  he returned.** V
11660 44 62 65 50 61 72 73 65 64 52 65 63 6f 72 64 20  DbeParsedRecord 
11670 73 74 72 75 63 74 75 72 65 20 69 66 20 69 74 20  structure if it 
11680 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e  is large enough.
11690 20 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f    If it is.** no
116a0 74 20 62 69 67 20 65 6e 6f 75 67 68 2c 20 73 70  t big enough, sp
116b0 61 63 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ace is obtained 
116c0 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
116d0 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  loc()..**.** The
116e0 20 72 65 74 75 72 6e 65 64 20 73 74 72 75 63 74   returned struct
116f0 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  ure should be cl
11700 6f 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74  osed by a call t
11710 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  o.** sqlite3Vdbe
11720 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
11730 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61  cord()..*/ .Unpa
11740 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69  ckedRecord *sqli
11750 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
11760 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ack(.  KeyInfo *
11770 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a  pKeyInfo,     /*
11780 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
11790 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  ut the record fo
117a0 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  rmat */.  int nK
117b0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
117c0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
117d0 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
117e0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
117f0 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
11800 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
11810 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65  /.  char *pSpace
11820 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ,          /* Un
11830 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76  aligned space av
11840 61 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  ailable to hold 
11850 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
11860 69 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20 20  int szSpace     
11870 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
11880 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79  f pSpace[] in by
11890 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  tes */.){.  cons
118a0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
118b0 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
118c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
118d0 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  Key;.  UnpackedR
118e0 65 63 6f 72 64 20 2a 70 3b 20 20 2f 2a 20 54 68  ecord *p;  /* Th
118f0 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  e unpacked recor
11900 64 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 72  d that we will r
11910 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  eturn */.  int n
11920 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Byte;          /
11930 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 6e  * Memory space n
11940 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 70 2c  eeded to hold p,
11950 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
11960 6e 74 20 64 3b 0a 20 20 75 33 32 20 69 64 78 3b  nt d;.  u32 idx;
11970 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20  .  u16 u;       
11980 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
11990 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
119a0 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  */.  u32 szHdr;.
119b0 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69    Mem *pMem;.  i
119c0 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20  nt nOff;        
119d0 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 70     /* Increase p
119e0 53 70 61 63 65 20 62 79 20 74 68 69 73 20 6d 75  Space by this mu
119f0 63 68 20 74 6f 20 38 2d 62 79 74 65 20 61 6c 69  ch to 8-byte ali
11a00 67 6e 20 69 74 20 2a 2f 0a 20 20 0a 20 20 2f 2a  gn it */.  .  /*
11a10 0a 20 20 2a 2a 20 57 65 20 77 61 6e 74 20 74 6f  .  ** We want to
11a20 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74   shift the point
11a30 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63  er pSpace up suc
11a40 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62  h that it is 8-b
11a50 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a  yte aligned..  *
11a60 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20  * Thus, we need 
11a70 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76  to calculate a v
11a80 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77  alue, nOff, betw
11a90 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20  een 0 and 7, to 
11aa0 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62  shift .  ** it b
11ab0 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73  y.  If pSpace is
11ac0 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20   already 8-byte 
11ad0 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68  aligned, nOff sh
11ae0 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20  ould be zero..  
11af0 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d  */.  nOff = (8 -
11b00 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
11b10 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29  INT(pSpace) & 7)
11b20 29 20 26 20 37 3b 0a 20 20 70 53 70 61 63 65 20  ) & 7;.  pSpace 
11b30 2b 3d 20 6e 4f 66 66 3b 0a 20 20 73 7a 53 70 61  += nOff;.  szSpa
11b40 63 65 20 2d 3d 20 6e 4f 66 66 3b 0a 20 20 6e 42  ce -= nOff;.  nB
11b50 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  yte = ROUND8(siz
11b60 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
11b70 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65  rd)) + sizeof(Me
11b80 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  m)*(pKeyInfo->nF
11b90 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e  ield+1);.  if( n
11ba0 42 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a  Byte>szSpace ){.
11bb0 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44      p = sqlite3D
11bc0 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49  bMallocRaw(pKeyI
11bd0 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b  nfo->db, nByte);
11be0 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
11bf0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d  return 0;.    p-
11c00 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45  >flags = UNPACKE
11c10 44 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20 55 4e  D_NEED_FREE | UN
11c20 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54  PACKED_NEED_DEST
11c30 52 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROY;.  }else{.  
11c40 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52    p = (UnpackedR
11c50 65 63 6f 72 64 2a 29 70 53 70 61 63 65 3b 0a 20  ecord*)pSpace;. 
11c60 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e     p->flags = UN
11c70 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54  PACKED_NEED_DEST
11c80 52 4f 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b  ROY;.  }.  p->pK
11c90 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
11ca0 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
11cb0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
11cc0 64 20 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d  d + 1;.  p->aMem
11cd0 20 3d 20 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29   = pMem = (Mem*)
11ce0 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
11cf0 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
11d00 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61  edRecord))];.  a
11d10 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
11d20 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d  E_ALIGNMENT(pMem
11d30 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  ) );.  idx = get
11d40 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
11d50 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48  zHdr);.  d = szH
11d60 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77  dr;.  u = 0;.  w
11d70 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
11d80 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 29  && u<p->nField )
11d90 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
11da0 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20  _type;..    idx 
11db0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
11dc0 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61  aKey[idx], seria
11dd0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28  l_type);.    if(
11de0 20 64 3e 3d 6e 4b 65 79 20 26 26 20 73 71 6c 69   d>=nKey && sqli
11df0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
11e00 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
11e10 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  )>0 ) break;.   
11e20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65   pMem->enc = pKe
11e30 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
11e40 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49  pMem->db = pKeyI
11e50 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 70 4d 65  nfo->db;.    pMe
11e60 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  m->flags = 0;.  
11e70 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20    pMem->zMalloc 
11e80 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71  = 0;.    d += sq
11e90 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
11ea0 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72  et(&aKey[d], ser
11eb0 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b  ial_type, pMem);
11ec0 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20  .    pMem++;.   
11ed0 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65   u++;.  }.  asse
11ee0 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d  rt( u<=pKeyInfo-
11ef0 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20  >nField + 1 );. 
11f00 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a   p->nField = u;.
11f10 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
11f20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  p;.}../*.** This
11f30 20 72 6f 75 74 69 6e 65 20 64 65 73 74 72 6f 79   routine destroy
11f40 73 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  s a UnpackedReco
11f50 72 64 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  rd object.*/.voi
11f60 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
11f70 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  eteUnpackedRecor
11f80 64 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  d(UnpackedRecord
11f90 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
11fa0 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
11fb0 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  s & UNPACKED_NEE
11fc0 44 5f 44 45 53 54 52 4f 59 20 29 7b 0a 20 20 20  D_DESTROY ){.   
11fd0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
11fe0 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20  Mem *pMem;.     
11ff0 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 3d 70   for(i=0, pMem=p
12000 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69  ->aMem; i<p->nFi
12010 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b  eld; i++, pMem++
12020 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
12030 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a  Mem->zMalloc ){.
12040 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12050 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
12060 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d  pMem);.        }
12070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12080 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20     if( p->flags 
12090 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f  & UNPACKED_NEED_
120a0 46 52 45 45 20 29 7b 0a 20 20 20 20 20 20 73 71  FREE ){.      sq
120b0 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 70  lite3DbFree(p->p
120c0 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 29 3b  KeyInfo->db, p);
120d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
120e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
120f0 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
12100 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
12110 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a   index records.*
12120 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b  * specified by {
12130 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
12140 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65  d pPKey2.  It re
12150 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65  turns a negative
12160 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
12170 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66  itive integer if
12180 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
12190 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
121a0 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
121b0 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65   key2.  The {nKe
121c0 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d  y1, pKey1} key m
121d0 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a  ust be a blob.**
121e0 20 63 72 65 61 74 65 64 20 62 79 20 74 68 20 4f   created by th O
121f0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
12200 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
12210 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20    The pPKey2.** 
12220 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61  key must be a pa
12230 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73  rsed key such as
12240 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
12250 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72  * sqlite3VdbePar
12260 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  seRecord..**.** 
12270 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f  Key1 and Key2 do
12280 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e   not have to con
12290 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  tain the same nu
122a0 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a  mber of fields..
122b0 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74 68 20  ** The key with 
122c0 66 65 77 65 72 20 66 69 65 6c 64 73 20 69 73 20  fewer fields is 
122d0 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73  usually compares
122e0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a   less than the .
122f0 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20  ** longer key.  
12300 48 6f 77 65 76 65 72 20 69 66 20 74 68 65 20 55  However if the U
12310 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20  NPACKED_INCRKEY 
12320 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20  flags in pPKey2 
12330 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68  is set.** and th
12340 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65  e common prefixe
12350 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65  s are equal, the
12360 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  n key1 is less t
12370 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20  han key2..** Or 
12380 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  if the UNPACKED_
12390 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61  MATCH_PREFIX fla
123a0 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
123b0 20 70 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a   prefixes are.**
123c0 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65   equal, then the
123d0 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64   keys are consid
123e0 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c  ered to be equal
123f0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74   and.** the part
12400 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d  s beyond the com
12410 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65 20 69  mon prefix are i
12420 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
12430 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 47   the UNPACKED_IG
12440 4e 4f 52 45 5f 52 4f 57 49 44 20 66 6c 61 67 20  NORE_ROWID flag 
12450 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
12460 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a   last byte of.**
12470 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 70   the header of p
12480 4b 65 79 31 20 69 73 20 69 67 6e 6f 72 65 64 2e  Key1 is ignored.
12490 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
124a0 74 68 61 74 20 70 4b 65 79 31 20 69 73 0a 2a 2a  that pKey1 is.**
124b0 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 2c 20 61   an index key, a
124c0 6e 64 20 74 68 75 73 20 65 6e 64 73 20 77 69 74  nd thus ends wit
124d0 68 20 61 20 72 6f 77 69 64 20 76 61 6c 75 65 2e  h a rowid value.
124e0 20 20 54 68 65 20 6c 61 73 74 20 62 79 74 65 0a    The last byte.
124f0 2a 2a 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ** of the header
12500 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20   will therefore 
12510 62 65 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  be the serial ty
12520 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 3a  pe of the rowid:
12530 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c 20 32 2c  .** one of 1, 2,
12540 20 33 2c 20 34 2c 20 35 2c 20 36 2c 20 38 2c 20   3, 4, 5, 6, 8, 
12550 6f 72 20 39 20 2d 20 74 68 65 20 69 6e 74 65 67  or 9 - the integ
12560 65 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  er serial types.
12570 0a 2a 2a 20 54 68 65 20 73 65 72 69 61 6c 20 74  .** The serial t
12580 79 70 65 20 6f 66 20 74 68 65 20 66 69 6e 61 6c  ype of the final
12590 20 72 6f 77 69 64 20 77 69 6c 6c 20 61 6c 77 61   rowid will alwa
125a0 79 73 20 62 65 20 61 20 73 69 6e 67 6c 65 20 62  ys be a single b
125b0 79 74 65 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f 72  yte..** By ignor
125c0 69 6e 67 20 74 68 69 73 20 6c 61 73 74 20 62 79  ing this last by
125d0 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
125e0 2c 20 77 65 20 66 6f 72 63 65 20 74 68 65 20 63  , we force the c
125f0 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f 20  omparison.** to 
12600 69 67 6e 6f 72 65 20 74 68 65 20 72 6f 77 69 64  ignore the rowid
12610 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 6b   at the end of k
12620 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ey1..*/.int sqli
12630 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
12640 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79  pare(.  int nKey
12650 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
12660 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
12670 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
12680 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
12690 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
126a0 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31  y */.){.  int d1
126b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
126c0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
126d0 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
126e0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
126f0 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
12700 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
12710 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
12720 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
12730 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
12740 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12750 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
12760 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
12770 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a  ;.  int nField;.
12780 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
12790 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
127a0 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
127b0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
127c0 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
127d0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
127e0 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
127f0 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
12800 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65  ->pKeyInfo;.  me
12810 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
12820 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64  o->enc;.  mem1.d
12830 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
12840 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d  ;.  mem1.flags =
12850 20 30 3b 0a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d   0;.  mem1.u.i =
12860 20 30 3b 20 20 2f 2a 20 6e 6f 74 20 6e 65 65 64   0;  /* not need
12870 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65  ed, here to sile
12880 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  nce compiler war
12890 6e 69 6e 67 20 2a 2f 0a 20 20 6d 65 6d 31 2e 7a  ning */.  mem1.z
128a0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 0a 20  Malloc = 0;.  . 
128b0 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
128c0 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
128d0 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72  1);.  d1 = szHdr
128e0 31 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d  1;.  if( pPKey2-
128f0 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
12900 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29  D_IGNORE_ROWID )
12910 7b 0a 20 20 20 20 73 7a 48 64 72 31 2d 2d 3b 0a  {.    szHdr1--;.
12920 20 20 7d 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70    }.  nField = p
12930 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
12940 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73  .  while( idx1<s
12950 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79  zHdr1 && i<pPKey
12960 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20  2->nField ){.   
12970 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
12980 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  1;..    /* Read 
12990 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  the serial types
129a0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c   for the next el
129b0 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65  ement in each ke
129c0 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b  y. */.    idx1 +
129d0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61  = getVarint32( a
129e0 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61  Key1+idx1, seria
129f0 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69  l_type1 );.    i
12a00 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20  f( d1>=nKey1 && 
12a10 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
12a20 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
12a30 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b  type1)>0 ) break
12a40 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  ;..    /* Extrac
12a50 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  t the values to 
12a60 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20  be compared..   
12a70 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71   */.    d1 += sq
12a80 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
12a90 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
12aa0 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
12ab0 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  m1);..    /* Do 
12ac0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  the comparison. 
12ad0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
12ae0 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
12af0 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d  (&mem1, &pPKey2-
12b00 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20  >aMem[i],.      
12b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b20 20 20 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20       i<nField ? 
12b30 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
12b40 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28  i] : 0);.    if(
12b50 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
12b60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12b70 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   i++;.  }.  if( 
12b80 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 29 20 73  mem1.zMalloc ) s
12b90 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
12ba0 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a 0a 20 20  ease(&mem1);..  
12bb0 2f 2a 20 49 66 20 74 68 65 20 50 52 45 46 49 58  /* If the PREFIX
12bc0 5f 53 45 41 52 43 48 20 66 6c 61 67 20 69 73 20  _SEARCH flag is 
12bd0 73 65 74 20 61 6e 64 20 61 6c 6c 20 66 69 65 6c  set and all fiel
12be0 64 73 20 65 78 63 65 70 74 20 74 68 65 20 66 69  ds except the fi
12bf0 6e 61 6c 0a 20 20 2a 2a 20 72 6f 77 69 64 20 66  nal.  ** rowid f
12c00 69 65 6c 64 20 77 65 72 65 20 65 71 75 61 6c 2c  ield were equal,
12c10 20 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20   then clear the 
12c20 50 52 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c  PREFIX_SEARCH fl
12c30 61 67 20 61 6e 64 20 73 65 74 20 0a 20 20 2a 2a  ag and set .  **
12c40 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 74   pPKey2->rowid t
12c50 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  o the value of t
12c60 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 20 69  he rowid field i
12c70 6e 20 28 70 4b 65 79 31 2c 20 6e 4b 65 79 31 29  n (pKey1, nKey1)
12c80 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75  ..  ** This is u
12c90 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 73  sed by the OP_Is
12ca0 55 6e 69 71 75 65 20 6f 70 63 6f 64 65 2e 0a 20  Unique opcode.. 
12cb0 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 4b 65 79   */.  if( (pPKey
12cc0 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  2->flags & UNPAC
12cd0 4b 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43  KED_PREFIX_SEARC
12ce0 48 29 20 26 26 20 69 3d 3d 28 70 50 4b 65 79 32  H) && i==(pPKey2
12cf0 2d 3e 6e 46 69 65 6c 64 2d 31 29 20 29 7b 0a 20  ->nField-1) ){. 
12d00 20 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3d     assert( idx1=
12d10 3d 73 7a 48 64 72 31 20 26 26 20 72 63 20 29 3b  =szHdr1 && rc );
12d20 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
12d30 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  1.flags & MEM_In
12d40 74 20 29 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d  t );.    pPKey2-
12d50 3e 66 6c 61 67 73 20 26 3d 20 7e 55 4e 50 41 43  >flags &= ~UNPAC
12d60 4b 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43  KED_PREFIX_SEARC
12d70 48 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 72  H;.    pPKey2->r
12d80 6f 77 69 64 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b  owid = mem1.u.i;
12d90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
12da0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 72 63 3d 3d  0 ){.    /* rc==
12db0 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61  0 here means tha
12dc0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79  t one of the key
12dd0 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
12de0 6c 64 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  lds and.    ** a
12df0 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
12e00 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77   to that point w
12e10 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68  ere equal. If th
12e20 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b  e UNPACKED_INCRK
12e30 45 59 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69  EY.    ** flag i
12e40 73 20 73 65 74 2c 20 74 68 65 6e 20 62 72 65 61  s set, then brea
12e50 6b 20 74 68 65 20 74 69 65 20 62 79 20 74 72 65  k the tie by tre
12e60 61 74 69 6e 67 20 6b 65 79 32 20 61 73 20 6c 61  ating key2 as la
12e70 72 67 65 72 2e 0a 20 20 20 20 2a 2a 20 49 66 20  rger..    ** If 
12e80 74 68 65 20 55 50 41 43 4b 45 44 5f 50 52 45 46  the UPACKED_PREF
12e90 49 58 5f 4d 41 54 43 48 20 66 6c 61 67 20 69 73  IX_MATCH flag is
12ea0 20 73 65 74 2c 20 74 68 65 6e 20 6b 65 79 73 20   set, then keys 
12eb0 77 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66  with common pref
12ec0 69 78 65 73 0a 20 20 20 20 2a 2a 20 61 72 65 20  ixes.    ** are 
12ed0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
12ee0 20 65 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69   equal.  Otherwi
12ef0 73 65 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b  se, the longer k
12f00 65 79 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a  ey is the .    *
12f10 2a 20 6c 61 72 67 65 72 2e 20 20 41 73 20 69 74  * larger.  As it
12f20 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 70 50   happens, the pP
12f30 4b 65 79 32 20 77 69 6c 6c 20 61 6c 77 61 79 73  Key2 will always
12f40 20 62 65 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20   be the longer. 
12f50 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 69     ** if there i
12f60 73 20 61 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  s a difference..
12f70 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
12f80 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55  PKey2->flags & U
12f90 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20  NPACKED_INCRKEY 
12fa0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31  ){.      rc = -1
12fb0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
12fc0 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20  pPKey2->flags & 
12fd0 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f  UNPACKED_PREFIX_
12fe0 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 20 20 2f  MATCH ){.      /
12ff0 2a 20 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f  * Leave rc==0 */
13000 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
13010 64 78 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20  dx1<szHdr1 ){.  
13020 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
13030 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b  }.  }else if( pK
13040 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
13050 65 72 20 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f  er && i<pKeyInfo
13060 2d 3e 6e 46 69 65 6c 64 0a 20 20 20 20 20 20 20  ->nField.       
13070 20 20 20 20 20 20 20 20 26 26 20 70 4b 65 79 49          && pKeyI
13080 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
13090 69 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d  i] ){.    rc = -
130a0 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  rc;.  }..  retur
130b0 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a  n rc;.}. ../*.**
130c0 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
130d0 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63  an index entry c
130e0 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
130f0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
13100 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74  pcode..** Read t
13110 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61  he rowid (the la
13120 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  st field in the 
13130 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72  record) and stor
13140 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a  e it in *rowid..
13150 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
13160 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
13170 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65  g works, or an e
13180 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
13190 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20  ise..**.** pCur 
131a0 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e  might be pointin
131b0 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e  g to text obtain
131c0 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70  ed from a corrup
131d0 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  t database file.
131e0 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65  .** So the conte
131f0 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  nt cannot be tru
13200 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70  sted.  Do approp
13210 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20  riate checks on 
13220 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  the content..*/.
13230 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
13240 64 78 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72  dxRowid(BtCursor
13250 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77   *pCur, i64 *row
13260 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  id){.  i64 nCell
13270 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
13280 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  c;.  u32 szHdr; 
13290 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
132a0 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
132b0 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
132c0 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
132d0 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
132e0 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69  */.  u32 lenRowi
132f0 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  d;     /* Size o
13300 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
13310 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a   Mem m, v;..  /*
13320 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   Get the size of
13330 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
13340 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20  .  Only indices 
13350 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a  entries of less.
13360 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61    ** than 2GiB a
13370 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79  re support - any
13380 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74  thing large must
13390 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72   be database cor
133a0 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  ruption */.  sql
133b0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
133c0 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
133d0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
133e0 79 28 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c  y(nCellKey<=0 ||
133f0 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66   nCellKey>0x7fff
13400 66 66 66 66 29 20 29 7b 0a 20 20 20 20 72 65 74  ffff) ){.    ret
13410 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
13420 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
13430 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63  /* Read in the c
13440 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
13450 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
13460 72 79 20 2a 2f 0a 20 20 6d 2e 66 6c 61 67 73 20  ry */.  m.flags 
13470 3d 20 30 3b 0a 20 20 6d 2e 64 62 20 3d 20 30 3b  = 0;.  m.db = 0;
13480 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  .  m.zMalloc = 0
13490 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
134a0 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
134b0 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e  (pCur, 0, (int)n
134c0 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
134d0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
134e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
134f0 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20  .  /* The index 
13500 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e  entry must begin
13510 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73   with a header s
13520 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  ize */.  (void)g
13530 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
13540 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74  m.z, szHdr);.  t
13550 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
13560 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  2 );.  testcase(
13570 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20   szHdr==m.n );. 
13580 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a   if( unlikely(sz
13590 48 64 72 3c 32 20 7c 7c 20 28 69 6e 74 29 73 7a  Hdr<2 || (int)sz
135a0 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20  Hdr>m.n) ){.    
135b0 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
135c0 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
135d0 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69    /* The last fi
135e0 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  eld of the index
135f0 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e   should be an in
13600 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49  teger - the ROWI
13610 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74  D..  ** Verify t
13620 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  hat the last ent
13630 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  ry really is an 
13640 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76  integer. */.  (v
13650 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
13660 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d  (u8*)&m.z[szHdr-
13670 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a  1], typeRowid);.
13680 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
13690 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65  Rowid==1 );.  te
136a0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
136b0 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61  d==2 );.  testca
136c0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33  se( typeRowid==3
136d0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
136e0 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a  typeRowid==4 );.
136f0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
13700 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65  Rowid==5 );.  te
13710 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
13720 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61  d==6 );.  testca
13730 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38  se( typeRowid==8
13740 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
13750 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a  typeRowid==9 );.
13760 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74    if( unlikely(t
13770 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79  ypeRowid<1 || ty
13780 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70  peRowid>9 || typ
13790 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20  eRowid==7) ){.  
137a0 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
137b0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
137c0 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71  .  lenRowid = sq
137d0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
137e0 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64  ypeLen(typeRowid
137f0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d  );.  testcase( m
13800 2e 6e 2d 6c 65 6e 52 6f 77 69 64 3d 3d 73 7a 48  .n-lenRowid==szH
13810 64 72 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  dr );.  if( unli
13820 6b 65 6c 79 28 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  kely(m.n-lenRowi
13830 64 3c 73 7a 48 64 72 29 20 29 7b 0a 20 20 20 20  d<szHdr) ){.    
13840 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
13850 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
13860 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69    /* Fetch the i
13870 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65  nteger off the e
13880 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
13890 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
138a0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
138b0 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c  ((u8*)&m.z[m.n-l
138c0 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f  enRowid], typeRo
138d0 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77  wid, &v);.  *row
138e0 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71  id = v.u.i;.  sq
138f0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
13900 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
13910 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
13920 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
13930 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
13940 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
13950 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e  after m has been
13960 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e  .  ** allocated.
13970 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a    Free the m obj
13980 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
13990 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a  QLITE_CORRUPT. *
139a0 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  /.idx_rowid_corr
139b0 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61  uption:.  testca
139c0 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30  se( m.zMalloc!=0
139d0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
139e0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
139f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13a00 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d  _CORRUPT_BKPT;.}
13a10 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
13a20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69  the key of the i
13a30 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
13a40 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69  cursor pC is poi
13a50 6e 74 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a  nt to against.**
13a60 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20   the key string 
13a70 69 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67  in pKey (of leng
13a80 74 68 20 6e 4b 65 79 29 2e 20 20 57 72 69 74 65  th nKey).  Write
13a90 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75   into *pRes a nu
13aa0 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  mber.** that is 
13ab0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
13ac0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
13ad0 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  C is less than, 
13ae0 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20  equal to,.** or 
13af0 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 4b 65  greater than pKe
13b00 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
13b10 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
13b20 0a 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65  .**.** pKey is e
13b30 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69  ither created wi
13b40 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72  thout a rowid or
13b50 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f   is truncated so
13b60 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74   that it.** omit
13b70 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  s the rowid at t
13b80 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77  he end.  The row
13b90 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
13ba0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
13bb0 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61  .** is ignored a
13bc0 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20  s well.  Hence, 
13bd0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  this routine onl
13be0 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70  y compares the p
13bf0 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74  refixes .** of t
13c00 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f  he keys prior to
13c10 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
13c20 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65  , not the entire
13c30 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70   key..**.** pUnp
13c40 61 63 6b 65 64 20 6d 61 79 20 62 65 20 61 6e 20  acked may be an 
13c50 75 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e  unpacked version
13c60 20 6f 66 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20   of pKey,nKey.  
13c70 49 66 20 70 55 6e 70 61 63 6b 65 64 20 69 73 0a  If pUnpacked is.
13c80 2a 2a 20 73 75 70 70 6c 69 65 64 20 69 74 20 69  ** supplied it i
13c90 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  s used in place 
13ca0 6f 66 20 70 4b 65 79 2c 6e 4b 65 79 2e 0a 2a 2f  of pKey,nKey..*/
13cb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
13cc0 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20  IdxKeyCompare(. 
13cd0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c   VdbeCursor *pC,
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13cf0 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f  The cursor to co
13d00 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
13d10 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
13d20 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 2f  d *pUnpacked,  /
13d30 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69  * Unpacked versi
13d40 6f 6e 20 6f 66 20 70 4b 65 79 20 61 6e 64 20 6e  on of pKey and n
13d50 4b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  Key */.  int *re
13d60 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
13d70 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
13d80 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73  e comparison res
13d90 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ult here */.){. 
13da0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
13db0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  0;.  int rc;.  B
13dc0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  tCursor *pCur = 
13dd0 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d  pC->pCursor;.  M
13de0 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  em m;..  sqlite3
13df0 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
13e00 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  r, &nCellKey);. 
13e10 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30   if( nCellKey<=0
13e20 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37   || nCellKey>0x7
13e30 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a  fffffff ){.    *
13e40 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  res = 0;.    ret
13e50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13e60 20 7d 0a 20 20 6d 2e 64 62 20 3d 20 30 3b 0a 20   }.  m.db = 0;. 
13e70 20 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20   m.flags = 0;.  
13e80 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  m.zMalloc = 0;. 
13e90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
13ea0 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
13eb0 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 69  ->pCursor, 0, (i
13ec0 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  nt)nCellKey, 1, 
13ed0 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
13ee0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
13ef0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55    }.  assert( pU
13f00 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26  npacked->flags &
13f10 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45   UNPACKED_IGNORE
13f20 5f 52 4f 57 49 44 20 29 3b 0a 20 20 2a 72 65 73  _ROWID );.  *res
13f30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
13f40 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c  cordCompare(m.n,
13f50 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29   m.z, pUnpacked)
13f60 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
13f70 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
13f80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13f90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
13fa0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
13fb0 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65  e value to be re
13fc0 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71  turned by subseq
13fd0 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  uent calls to.**
13fe0 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
13ff0 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  () on the databa
14000 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20  se handle 'db'. 
14010 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14020 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73  VdbeSetChanges(s
14030 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
14040 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65  nChange){.  asse
14050 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
14060 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
14070 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e  ) );.  db->nChan
14080 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20  ge = nChange;.  
14090 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
140a0 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a   += nChange;.}..
140b0 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  /*.** Set a flag
140c0 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20   in the vdbe to 
140d0 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
140e0 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69  e counter when i
140f0 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a  t is finalised.*
14100 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76  * or reset..*/.v
14110 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
14120 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65  ountChanges(Vdbe
14130 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67   *v){.  v->chang
14140 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f  eCntOn = 1;.}../
14150 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20  *.** Mark every 
14160 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
14170 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
14180 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
14190 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65  nnection.** as e
141a0 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  xpired..**.** An
141b0 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65   expired stateme
141c0 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65  nt means that re
141d0 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
141e0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  he statement is.
141f0 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53  ** recommend.  S
14200 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65  tatements expire
14210 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70   when things hap
14220 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68  pen that make th
14230 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20  eir.** programs 
14240 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76  obsolete.  Remov
14250 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ing user-defined
14260 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f   functions or co
14270 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
14280 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e  nces, or changin
14290 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  g an authorizati
142a0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  on function are 
142b0 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20  the types of.** 
142c0 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65  things that make
142d0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
142e0 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a  ents obsolete..*
142f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
14300 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
14310 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  ements(sqlite3 *
14320 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
14330 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56    for(p = db->pV
14340 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  dbe; p; p=p->pNe
14350 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69  xt){.    p->expi
14360 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  red = 1;.  }.}..
14370 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
14380 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
14390 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
143a0 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
143b0 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
143c0 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
143d0 20 76 2d 3e 64 62 3b 0a 7d 0a                     v->db;.}.