/ Hex Artifact Content
Login

Artifact 974a02fb1719799863492702877d52779d9e6b05:


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 38 30 20 32  eaux.c,v 1.480 2
02c0: 30 30 39 2f 30 38 2f 30 38 20 31 38 3a 30 31 3a  009/08/08 18:01:
02d0: 30 38 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  08 drh Exp $.*/.
02e0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
02f0: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0300: 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a 0a 0a 2f  "vdbeInt.h"..../
0310: 2a 0a 2a 2a 20 57 68 65 6e 20 64 65 62 75 67 67  *.** When debugg
0320: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 67 65 6e  ing the code gen
0330: 65 72 61 74 6f 72 20 69 6e 20 61 20 73 79 6d 62  erator in a symb
0340: 6f 6c 69 63 20 64 65 62 75 67 67 65 72 2c 20 6f  olic debugger, o
0350: 6e 65 20 63 61 6e 0a 2a 2a 20 73 65 74 20 74 68  ne can.** set th
0360: 65 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  e sqlite3VdbeAdd
0370: 6f 70 54 72 61 63 65 20 74 6f 20 31 20 61 6e 64  opTrace to 1 and
0380: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 77 69 6c   all opcodes wil
0390: 6c 20 62 65 20 70 72 69 6e 74 65 64 0a 2a 2a 20  l be printed.** 
03a0: 61 73 20 74 68 65 79 20 61 72 65 20 61 64 64 65  as they are adde
03b0: 64 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63  d to the instruc
03c0: 74 69 6f 6e 20 73 74 72 65 61 6d 2e 0a 2a 2f 0a  tion stream..*/.
03d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
03e0: 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  BUG.int sqlite3V
03f0: 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 3d 20  dbeAddopTrace = 
0400: 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  0;.#endif.../*.*
0410: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 76  * Create a new v
0420: 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
0430: 65 6e 67 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20  engine..*/.Vdbe 
0440: 2a 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61  *sqlite3VdbeCrea
0450: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  te(sqlite3 *db){
0460: 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 70 20  .  Vdbe *p;.  p 
0470: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0480: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
0490: 28 56 64 62 65 29 20 29 3b 0a 20 20 69 66 28 20  (Vdbe) );.  if( 
04a0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
04b0: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
04c0: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
04d0: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
04e0: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
04f0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0500: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0510: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
0520: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
0530: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
0540: 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20  _INIT;.  return 
0550: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65  p;.}../*.** Reme
0560: 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72  mber the SQL str
0570: 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72  ing for a prepar
0580: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ed statement..*/
0590: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
05a0: 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c  eSetSql(Vdbe *p,
05b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
05c0: 69 6e 74 20 6e 2c 20 69 6e 74 20 69 73 50 72 65  int n, int isPre
05d0: 70 61 72 65 56 32 29 7b 0a 20 20 69 66 28 20 70  pareV2){.  if( p
05e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69  ==0 ) return;.#i
05f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
0600: 5f 54 52 41 43 45 0a 20 20 69 66 28 20 21 69 73  _TRACE.  if( !is
0610: 50 72 65 70 61 72 65 56 32 20 29 20 72 65 74 75  PrepareV2 ) retu
0620: 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  rn;.#endif.  ass
0630: 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20  ert( p->zSql==0 
0640: 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73  );.  p->zSql = s
0650: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
0660: 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20  p->db, z, n);.  
0670: 70 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d  p->isPrepareV2 =
0680: 20 69 73 50 72 65 70 61 72 65 56 32 20 3f 20 31   isPrepareV2 ? 1
0690: 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   : 0;.}../*.** R
06a0: 65 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73  eturn the SQL as
06b0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
06c0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
06d0: 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  nt.*/.const char
06e0: 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71   *sqlite3_sql(sq
06f0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
0700: 74 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20  t){.  Vdbe *p = 
0710: 28 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20  (Vdbe *)pStmt;. 
0720: 20 72 65 74 75 72 6e 20 28 70 2d 3e 69 73 50 72   return (p->isPr
0730: 65 70 61 72 65 56 32 20 3f 20 70 2d 3e 7a 53 71  epareV2 ? p->zSq
0740: 6c 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  l : 0);.}../*.**
0750: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0760: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
0770: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
0780: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0790: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
07a0: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
07b0: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
07c0: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 74   char *zTmp;.  t
07d0: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
07e0: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
07f0: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0800: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0810: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
0820: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
0830: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
0840: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
0850: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
0860: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
0870: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
0880: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
0890: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
08a0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
08b0: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61  p;.  pB->isPrepa
08c0: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65  reV2 = pA->isPre
08d0: 70 61 72 65 56 32 3b 0a 7d 0a 0a 23 69 66 64 65  pareV2;.}..#ifde
08e0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
08f0: 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69 6e  *.** Turn tracin
0900: 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76  g on or off.*/.v
0910: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 54  oid sqlite3VdbeT
0920: 72 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46 49  race(Vdbe *p, FI
0930: 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d  LE *trace){.  p-
0940: 3e 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b 0a  >trace = trace;.
0950: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
0960: 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e  Resize the Vdbe.
0970: 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 61  aOp array so tha
0980: 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73 74  t it is at least
0990: 20 6f 6e 65 20 6f 70 20 6c 61 72 67 65 72 20 74   one op larger t
09a0: 68 61 6e 20 0a 2a 2a 20 69 74 20 77 61 73 2e 0a  han .** it was..
09b0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d  **.** If an out-
09c0: 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20  of-memory error 
09d0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 73  occurs while res
09e0: 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c  izing the array,
09f0: 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
0a00: 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73  E_NOMEM. In this
0a10: 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20 61   case Vdbe.aOp a
0a20: 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63  nd Vdbe.nOpAlloc
0a30: 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68   remain .** unch
0a40: 61 6e 67 65 64 20 28 74 68 69 73 20 69 73 20 73  anged (this is s
0a50: 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 63 6f 64  o that any opcod
0a60: 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  es already alloc
0a70: 61 74 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20  ated can be .** 
0a80: 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f  correctly deallo
0a90: 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
0aa0: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
0ab0: 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   Vdbe)..*/.stati
0ac0: 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 72 72 61  c int growOpArra
0ad0: 79 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 56 64  y(Vdbe *p){.  Vd
0ae0: 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  beOp *pNew;.  in
0af0: 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70  t nNew = (p->nOp
0b00: 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c  Alloc ? p->nOpAl
0b10: 6c 6f 63 2a 32 20 3a 20 28 69 6e 74 29 28 31 30  loc*2 : (int)(10
0b20: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b  24/sizeof(Op)));
0b30: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0b40: 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62  3DbRealloc(p->db
0b50: 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73  , p->aOp, nNew*s
0b60: 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66  izeof(Op));.  if
0b70: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d  ( pNew ){.    p-
0b80: 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  >nOpAlloc = sqli
0b90: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
0ba0: 70 2d 3e 64 62 2c 20 70 4e 65 77 29 2f 73 69 7a  p->db, pNew)/siz
0bb0: 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 70 2d 3e  eof(Op);.    p->
0bc0: 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  aOp = pNew;.  }.
0bd0: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f    return (pNew ?
0be0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
0bf0: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a 0a 2f  ITE_NOMEM);.}../
0c00: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69  *.** Add a new i
0c10: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
0c20: 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75  e list of instru
0c30: 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69  ctions current i
0c40: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20  n the.** VDBE.  
0c50: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
0c60: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
0c70: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
0c80: 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a   Parameters:.**.
0c90: 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20  **    p         
0ca0: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
0cb0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20   the VDBE.**.** 
0cc0: 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20     op           
0cd0: 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f     The opcode fo
0ce0: 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  r this instructi
0cf0: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20  on.**.**    p1, 
0d00: 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72  p2, p3      Oper
0d10: 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ands.**.** Use t
0d20: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
0d30: 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e  solveLabel() fun
0d40: 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20  ction to fix an 
0d50: 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74  address and.** t
0d60: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  he sqlite3VdbeCh
0d70: 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f  angeP4() functio
0d80: 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  n to change the 
0d90: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a  value of the P4.
0da0: 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69  ** operand..*/.i
0db0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
0dc0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
0dd0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
0de0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
0df0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
0e00: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
0e10: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
0e20: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
0e30: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
0e40: 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f  ssert( op>0 && o
0e50: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20  p<0xff );.  if( 
0e60: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  p->nOpAlloc<=i )
0e70: 7b 0a 20 20 20 20 69 66 28 20 67 72 6f 77 4f 70  {.    if( growOp
0e80: 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20  Array(p) ){.    
0e90: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
0ea0: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  }.  }.  p->nOp++
0eb0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
0ec0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
0ed0: 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  ode = (u8)op;.  
0ee0: 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70  pOp->p5 = 0;.  p
0ef0: 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70  Op->p1 = p1;.  p
0f00: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
0f10: 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70  Op->p3 = p3;.  p
0f20: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
0f30: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
0f40: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d 3e 65  _NOTUSED;.  p->e
0f50: 78 70 69 72 65 64 20 3d 20 30 3b 0a 23 69 66 64  xpired = 0;.#ifd
0f60: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
0f70: 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20    pOp->zComment 
0f80: 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
0f90: 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  e3VdbeAddopTrace
0fa0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 50 72   ) sqlite3VdbePr
0fb0: 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e  intOp(0, i, &p->
0fc0: 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a  aOp[i]);.#endif.
0fd0: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
0fe0: 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65  ILE.  pOp->cycle
0ff0: 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e  s = 0;.  pOp->cn
1000: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  t = 0;.#endif.  
1010: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20  return i;.}.int 
1020: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1030: 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  0(Vdbe *p, int o
1040: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
1050: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1060: 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  , op, 0, 0, 0);.
1070: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1080: 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c  eAddOp1(Vdbe *p,
1090: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29   int op, int p1)
10a0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
10b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
10c0: 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d  op, p1, 0, 0);.}
10d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
10e0: 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20  AddOp2(Vdbe *p, 
10f0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20  int op, int p1, 
1100: 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72  int p2){.  retur
1110: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
1120: 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70  Op3(p, op, p1, p
1130: 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  2, 0);.}.../*.**
1140: 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74   Add an opcode t
1150: 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65  hat includes the
1160: 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20 70   p4 value as a p
1170: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
1180: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1190: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
11a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
11b0: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
11c0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
11d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
11e0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
11f0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
1200: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1210: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
1220: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
1230: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
1240: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1250: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
1260: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
1270: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1280: 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65   *zP4,    /* The
1290: 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P4 operand */. 
12a0: 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
12b0: 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61       /* P4 opera
12c0: 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  nd type */.){.  
12d0: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
12e0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
12f0: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b  op, p1, p2, p3);
1300: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
1310: 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20  angeP4(p, addr, 
1320: 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20  zP4, p4type);.  
1330: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
1340: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
1350: 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65  ew symbolic labe
1360: 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63  l for an instruc
1370: 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65  tion that has ye
1380: 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64  t to be.** coded
1390: 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20  .  The symbolic 
13a0: 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20  label is really 
13b0: 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65 20  just a negative 
13c0: 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20  number.  The.** 
13d0: 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65  label can be use
13e0: 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c 75  d as the P2 valu
13f0: 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  e of an operatio
1400: 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a  n.  Later, when.
1410: 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20  ** the label is 
1420: 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70  resolved to a sp
1430: 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c 20  ecific address, 
1440: 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63  the VDBE will sc
1450: 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74  an.** through it
1460: 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74  s operation list
1470: 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20   and change all 
1480: 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69  values of P2 whi
1490: 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20  ch match.** the 
14a0: 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72  label into the r
14b0: 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e  esolved address.
14c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20  .**.** The VDBE 
14d0: 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32 20  knows that a P2 
14e0: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
14f0: 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20   because labels 
1500: 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65  are.** always ne
1510: 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76 61  gative and P2 va
1520: 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65  lues are suppose
1530: 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74   to be non-negat
1540: 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  ive..** Hence, a
1550: 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 6c   negative P2 val
1560: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68  ue is a label th
1570: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
1580: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a   resolved..**.**
1590: 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   Zero is returne
15a0: 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  d if a malloc() 
15b0: 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  fails..*/.int sq
15c0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
15d0: 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  el(Vdbe *p){.  i
15e0: 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  nt i;.  i = p->n
15f0: 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72  Label++;.  asser
1600: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
1610: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
1620: 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62    if( i>=p->nLab
1630: 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69  elAlloc ){.    i
1640: 6e 74 20 6e 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c  nt n = p->nLabel
1650: 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20  Alloc*2 + 5;.   
1660: 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c   p->aLabel = sql
1670: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
1680: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c  ree(p->db, p->aL
1690: 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  abel,.          
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 2a 73               n*s
16c0: 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b  izeof(p->aLabel[
16d0: 30 5d 29 29 3b 0a 20 20 20 20 70 2d 3e 6e 4c 61  0]));.    p->nLa
16e0: 62 65 6c 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74  belAlloc = sqlit
16f0: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  e3DbMallocSize(p
1700: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29  ->db, p->aLabel)
1710: 2f 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65  /sizeof(p->aLabe
1720: 6c 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  l[0]);.  }.  if(
1730: 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20   p->aLabel ){.  
1740: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d    p->aLabel[i] =
1750: 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   -1;.  }.  retur
1760: 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n -1-i;.}../*.**
1770: 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22   Resolve label "
1780: 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64  x" to be the add
1790: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
17a0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a   instruction to.
17b0: 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20  ** be inserted. 
17c0: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
17d0: 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  x" must have bee
17e0: 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  n obtained from.
17f0: 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  ** a prior call 
1800: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  to sqlite3VdbeMa
1810: 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f  keLabel()..*/.vo
1820: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
1830: 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20  solveLabel(Vdbe 
1840: 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e  *p, int x){.  in
1850: 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73  t j = -1-x;.  as
1860: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
1870: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
1880: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d  );.  assert( j>=
1890: 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c  0 && j<p->nLabel
18a0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61   );.  if( p->aLa
18b0: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
18c0: 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70  abel[j] = p->nOp
18d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ;.  }.}../*.** L
18e0: 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20  oop through the 
18f0: 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20  program looking 
1900: 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20 74 68  for P2 values th
1910: 61 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 0a  at are negative.
1920: 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72  ** on jump instr
1930: 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 73  uctions.  Each s
1940: 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c  uch value is a l
1950: 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74  abel.  Resolve t
1960: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73  he.** label by s
1970: 65 74 74 69 6e 67 20 74 68 65 20 50 32 20 76 61  etting the P2 va
1980: 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65  lue to its corre
1990: 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ct non-zero valu
19a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
19b0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
19c0: 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f  once after all o
19d0: 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e  pcodes have been
19e0: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
19f0: 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46   Variable *pMaxF
1a00: 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 20 74  uncArgs is set t
1a10: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  o the maximum va
1a20: 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72  lue of any P2 ar
1a30: 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e  gument .** to an
1a40: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50   OP_Function, OP
1a50: 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56  _AggStep or OP_V
1a60: 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54  Filter opcode. T
1a70: 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 0a  his is used by .
1a80: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  ** sqlite3VdbeMa
1a90: 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a  keReady() to siz
1aa0: 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  e the Vdbe.apArg
1ab0: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  [] array..**.** 
1ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
1ad0: 6f 20 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f  o does the follo
1ae0: 77 69 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f  wing optimizatio
1af0: 6e 3a 20 20 49 74 20 73 63 61 6e 73 20 66 6f 72  n:  It scans for
1b00: 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  .** instructions
1b10: 20 74 68 61 74 20 6d 69 67 68 74 20 63 61 75 73   that might caus
1b20: 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f  e a statement ro
1b30: 6c 6c 62 61 63 6b 2e 20 20 53 75 63 68 20 69 6e  llback.  Such in
1b40: 73 74 72 75 63 74 69 6f 6e 73 0a 2a 2a 20 61 72  structions.** ar
1b50: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50  e:.**.**   *  OP
1b60: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51  _Halt with P1=SQ
1b70: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
1b80: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
1b90: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74  .**   *  OP_Dest
1ba0: 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56  roy.**   *  OP_V
1bb0: 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f  Update.**   *  O
1bc0: 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  P_VRename.**.** 
1bd0: 49 66 20 6e 6f 20 73 75 63 68 20 69 6e 73 74 72  If no such instr
1be0: 75 63 74 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  uction is found,
1bf0: 20 74 68 65 6e 20 65 76 65 72 79 20 53 74 61 74   then every Stat
1c00: 65 6d 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  ement instructio
1c10: 6e 20 0a 2a 2a 20 69 73 20 63 68 61 6e 67 65 64  n .** is changed
1c20: 20 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 20   to a Noop.  In 
1c30: 74 68 69 73 20 77 61 79 2c 20 77 65 20 61 76 6f  this way, we avo
1c40: 69 64 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  id creating the 
1c50: 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 6a 6f  statement .** jo
1c60: 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63  urnal file unnec
1c70: 65 73 73 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61  essarily..*/.sta
1c80: 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
1c90: 50 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70  P2Values(Vdbe *p
1ca0: 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41  , int *pMaxFuncA
1cb0: 72 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rgs){.  int i;. 
1cc0: 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20   int nMaxArgs = 
1cd0: 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  0;.  Op *pOp;.  
1ce0: 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d  int *aLabel = p-
1cf0: 3e 61 4c 61 62 65 6c 3b 0a 20 20 69 6e 74 20 64  >aLabel;.  int d
1d00: 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c  oesStatementRoll
1d10: 62 61 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20  back = 0;.  int 
1d20: 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69  hasStatementBegi
1d30: 6e 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 65 61 64  n = 0;.  p->read
1d40: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 75  Only = 1;.  p->u
1d50: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d  sesStmtJournal =
1d60: 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d   0;.  for(pOp=p-
1d70: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
1d80: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
1d90: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f  ++){.    u8 opco
1da0: 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  de = pOp->opcode
1db0: 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  ;..    if( opcod
1dc0: 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 7c  e==OP_Function |
1dd0: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67  | opcode==OP_Agg
1de0: 53 74 65 70 20 29 7b 0a 20 20 20 20 20 20 69 66  Step ){.      if
1df0: 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72  ( pOp->p5>nMaxAr
1e00: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
1e10: 70 4f 70 2d 3e 70 35 3b 0a 23 69 66 6e 64 65 66  pOp->p5;.#ifndef
1e20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1e30: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
1e40: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
1e50: 4f 50 5f 56 55 70 64 61 74 65 20 29 7b 0a 20 20  OP_VUpdate ){.  
1e60: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
1e70: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
1e80: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 23  rgs = pOp->p2;.#
1e90: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
1ea0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48  if( opcode==OP_H
1eb0: 61 6c 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  alt ){.      if(
1ec0: 20 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45   pOp->p1==SQLITE
1ed0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70  _CONSTRAINT && p
1ee0: 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74  Op->p2==OE_Abort
1ef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 65 73   ){.        does
1f00: 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63  StatementRollbac
1f10: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  k = 1;.      }. 
1f20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
1f30: 6f 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e  ode==OP_Statemen
1f40: 74 20 29 7b 0a 20 20 20 20 20 20 68 61 73 53 74  t ){.      hasSt
1f50: 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20 31  atementBegin = 1
1f60: 3b 0a 20 20 20 20 20 20 70 2d 3e 75 73 65 73 53  ;.      p->usesS
1f70: 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  tmtJournal = 1;.
1f80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
1f90: 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79  code==OP_Destroy
1fa0: 20 29 7b 0a 20 20 20 20 20 20 64 6f 65 73 53 74   ){.      doesSt
1fb0: 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20  atementRollback 
1fc0: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
1fd0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72  f( opcode==OP_Tr
1fe0: 61 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70  ansaction && pOp
1ff0: 2d 3e 70 32 21 3d 30 20 29 7b 0a 20 20 20 20 20  ->p2!=0 ){.     
2000: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30   p->readOnly = 0
2010: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2020: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2030: 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  LE.    }else if(
2040: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
2050: 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ate || opcode==O
2060: 50 5f 56 52 65 6e 61 6d 65 20 29 7b 0a 20 20 20  P_VRename ){.   
2070: 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74     doesStatement
2080: 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
2090: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f    }else if( opco
20a0: 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29  de==OP_VFilter )
20b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
20c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
20d0: 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a  nOp - i >= 3 );.
20e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
20f0: 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50  p[-1].opcode==OP
2100: 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20  _Integer );.    
2110: 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31    n = pOp[-1].p1
2120: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d  ;.      if( n>nM
2130: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
2140: 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  s = n;.#endif.  
2150: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c    }..    if( sql
2160: 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65 48 61  ite3VdbeOpcodeHa
2170: 73 50 72 6f 70 65 72 74 79 28 6f 70 63 6f 64 65  sProperty(opcode
2180: 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 26 26  , OPFLG_JUMP) &&
2190: 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20   pOp->p2<0 ){.  
21a0: 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70      assert( -1-p
21b0: 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c  Op->p2<p->nLabel
21c0: 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70   );.      pOp->p
21d0: 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f  2 = aLabel[-1-pO
21e0: 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20  p->p2];.    }.  
21f0: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
2200: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
2210: 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c  el);.  p->aLabel
2220: 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75   = 0;..  *pMaxFu
2230: 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67  ncArgs = nMaxArg
2240: 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 6e  s;..  /* If we n
2250: 65 76 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 20  ever rollback a 
2260: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
2270: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 73 74 61 74  ction, then stat
2280: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73  ement.  ** trans
2290: 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
22a0: 6e 65 65 64 65 64 2e 20 20 53 6f 20 63 68 61 6e  needed.  So chan
22b0: 67 65 20 65 76 65 72 79 20 4f 50 5f 53 74 61 74  ge every OP_Stat
22c0: 65 6d 65 6e 74 0a 20 20 2a 2a 20 6f 70 63 6f 64  ement.  ** opcod
22d0: 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  e into an OP_Noo
22e0: 70 2e 20 20 54 68 69 73 20 61 76 6f 69 64 20 61  p.  This avoid a
22f0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2300: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
2310: 29 0a 20 20 2a 2a 20 77 68 69 63 68 20 63 61 6e  ).  ** which can
2320: 20 62 65 20 65 78 70 65 6e 73 69 76 65 20 6f 6e   be expensive on
2330: 20 73 6f 6d 65 20 70 6c 61 74 66 6f 72 6d 73 2e   some platforms.
2340: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 53  .  */.  if( hasS
2350: 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 26 26  tatementBegin &&
2360: 20 21 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52   !doesStatementR
2370: 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 70  ollback ){.    p
2380: 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
2390: 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70  l = 0;.    for(p
23a0: 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e  Op=p->aOp, i=p->
23b0: 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  nOp-1; i>=0; i--
23c0: 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
23d0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
23e0: 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b  =OP_Statement ){
23f0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
2400: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
2410: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2420: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
2430: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
2440: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2450: 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65  ction to be inse
2460: 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rted..*/.int sql
2470: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2480: 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ddr(Vdbe *p){.  
2490: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
24a0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
24b0: 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  T );.  return p-
24c0: 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  >nOp;.}../*.** A
24d0: 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20  dd a whole list 
24e0: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  of operations to
24f0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73   the operation s
2500: 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68  tack.  Return th
2510: 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20  e.** address of 
2520: 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74  the first operat
2530: 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e  ion added..*/.in
2540: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
2550: 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20  OpList(Vdbe *p, 
2560: 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c  int nOp, VdbeOpL
2570: 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b  ist const *aOp){
2580: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61  .  int addr;.  a
2590: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
25a0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
25b0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
25c0: 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41   + nOp > p->nOpA
25d0: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
25e0: 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 72 65  ray(p) ){.    re
25f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64  turn 0;.  }.  ad
2600: 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  dr = p->nOp;.  i
2610: 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29  f( ALWAYS(nOp>0)
2620: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2630: 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f     VdbeOpList co
2640: 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a  nst *pIn = aOp;.
2650: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2660: 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b  Op; i++, pIn++){
2670: 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20  .      int p2 = 
2680: 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56  pIn->p2;.      V
2690: 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70  dbeOp *pOut = &p
26a0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20  ->aOp[i+addr];. 
26b0: 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64       pOut->opcod
26c0: 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b  e = pIn->opcode;
26d0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20  .      pOut->p1 
26e0: 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20  = pIn->p1;.     
26f0: 20 69 66 28 20 70 32 3c 30 20 26 26 20 73 71 6c   if( p2<0 && sql
2700: 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65 48 61  ite3VdbeOpcodeHa
2710: 73 50 72 6f 70 65 72 74 79 28 70 4f 75 74 2d 3e  sProperty(pOut->
2720: 6f 70 63 6f 64 65 2c 20 4f 50 46 4c 47 5f 4a 55  opcode, OPFLG_JU
2730: 4d 50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  MP) ){.        p
2740: 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b  Out->p2 = addr +
2750: 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20 20   ADDR(p2);.     
2760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2770: 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20  pOut->p2 = p2;. 
2780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75       }.      pOu
2790: 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b  t->p3 = pIn->p3;
27a0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 74  .      pOut->p4t
27b0: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
27c0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34  ;.      pOut->p4
27d0: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  .p = 0;.      pO
27e0: 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64  ut->p5 = 0;.#ifd
27f0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2800: 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d        pOut->zCom
2810: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ment = 0;.      
2820: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 41  if( sqlite3VdbeA
2830: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
2840: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2850: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64  PrintOp(0, i+add
2860: 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64  r, &p->aOp[i+add
2870: 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  r]);.      }.#en
2880: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
2890: 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d  >nOp += nOp;.  }
28a0: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
28b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
28c0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
28d0: 20 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P1 operand for 
28e0: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
28f0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
2900: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
2910: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
2920: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
2930: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
2940: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
2950: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
2960: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
2970: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
2980: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
2990: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f   the program..*/
29a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
29b0: 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a  eChangeP1(Vdbe *
29c0: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
29d0: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
29e0: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
29f0: 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20  t( addr>=0 );.  
2a00: 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20  if( p->nOp>addr 
2a10: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
2a20: 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20  dr].p1 = val;.  
2a30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
2a40: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2a50: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f  he P2 operand fo
2a60: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
2a70: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
2a80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
2a90: 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ful for setting 
2aa0: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
2ab0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
2ac0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
2ad0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
2ae0: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
2af0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
2b00: 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30   assert( addr>=0
2b10: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
2b20: 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e  >addr ){.    p->
2b30: 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76  aOp[addr].p2 = v
2b40: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
2b50: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
2b60: 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72  e of the P3 oper
2b70: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
2b80: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
2b90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2ba0: 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65  dbeChangeP3(Vdbe
2bb0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
2bc0: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
2bd0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
2be0: 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a  ert( addr>=0 );.
2bf0: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64    if( p->nOp>add
2c00: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  r ){.    p->aOp[
2c10: 61 64 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a  addr].p3 = val;.
2c20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
2c30: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
2c40: 20 74 68 65 20 50 35 20 6f 70 65 72 61 6e 64 20   the P5 operand 
2c50: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
2c60: 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f  ently.** added o
2c70: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  peration..*/.voi
2c80: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
2c90: 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75  ngeP5(Vdbe *p, u
2ca0: 38 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  8 val){.  assert
2cb0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( p!=0 );.  if( 
2cc0: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61 73  p->aOp ){.    as
2cd0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
2ce0: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ;.    p->aOp[p->
2cf0: 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b  nOp-1].p5 = val;
2d00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
2d10: 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72  ange the P2 oper
2d20: 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69  and of instructi
2d30: 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20  on addr so that 
2d40: 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  it points to.** 
2d50: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
2d60: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
2d70: 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e  ion to be coded.
2d80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2d90: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62  VdbeJumpHere(Vdb
2da0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
2db0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
2dc0: 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20  angeP2(p, addr, 
2dd0: 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  p->nOp);.}.../*.
2de0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
2df0: 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
2e00: 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20  e is ephemeral, 
2e10: 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49  then free it.  I
2e20: 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66  f.** the FuncDef
2e30: 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c   is not ephermal
2e40: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e  , then do nothin
2e50: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
2e60: 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46  d freeEphemeralF
2e70: 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  unction(sqlite3 
2e80: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44  *db, FuncDef *pD
2e90: 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59  ef){.  if( ALWAY
2ea0: 53 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66  S(pDef) && (pDef
2eb0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2ec0: 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20  _FUNC_EPHEM)!=0 
2ed0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
2ee0: 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b 0a  Free(db, pDef);.
2ef0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
2f00: 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69  ete a P4 value i
2f10: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
2f20: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
2f30: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
2f40: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
2f50: 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20   *p4){.  if( p4 
2f60: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  ){.    switch( p
2f70: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  4type ){.      c
2f80: 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20  ase P4_REAL:.   
2f90: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
2fa0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
2fb0: 4d 50 52 49 4e 54 46 3a 0a 20 20 20 20 20 20 63  MPRINTF:.      c
2fc0: 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a  ase P4_DYNAMIC:.
2fd0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45        case P4_KE
2fe0: 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73  YINFO:.      cas
2ff0: 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 0a 20  e P4_INTARRAY:. 
3000: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59       case P4_KEY
3010: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a  INFO_HANDOFF: {.
3020: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3030: 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20  bFree(db, p4);. 
3040: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3050: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3060: 20 50 34 5f 56 44 42 45 46 55 4e 43 3a 20 7b 0a   P4_VDBEFUNC: {.
3070: 20 20 20 20 20 20 20 20 56 64 62 65 46 75 6e 63          VdbeFunc
3080: 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56   *pVdbeFunc = (V
3090: 64 62 65 46 75 6e 63 20 2a 29 70 34 3b 0a 20 20  dbeFunc *)p4;.  
30a0: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
30b0: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
30c0: 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63  pVdbeFunc->pFunc
30d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
30e0: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
30f0: 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30  ata(pVdbeFunc, 0
3100: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3110: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 56 64  e3DbFree(db, pVd
3120: 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  beFunc);.       
3130: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3140: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55        case P4_FU
3150: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20  NCDEF: {.       
3160: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
3170: 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63  nction(db, (Func
3180: 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  Def*)p4);.      
3190: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
31a0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
31b0: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  EM: {.        sq
31c0: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28  lite3ValueFree((
31d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70  sqlite3_value*)p
31e0: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
31f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3200: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
3210: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3220: 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61  3VtabUnlock((VTa
3230: 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20  ble *)p4);.     
3240: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3250: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  }.    }.  }.}...
3260: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f  /*.** Change N o
3270: 70 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20  pcodes starting 
3280: 61 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70  at addr to No-op
3290: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
32a0: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
32b0: 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  op(Vdbe *p, int 
32c0: 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  addr, int N){.  
32d0: 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20  if( p->aOp ){.  
32e0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
32f0: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
3300: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
3310: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 77 68 69 6c   p->db;.    whil
3320: 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20  e( N-- ){.      
3330: 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e  freeP4(db, pOp->
3340: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
3350: 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  p);.      memset
3360: 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (pOp, 0, sizeof(
3370: 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  pOp[0]));.      
3380: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
3390: 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f 70  _Noop;.      pOp
33a0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ++;.    }.  }.}.
33b0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
33c0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
33d0: 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  4 operand for a 
33e0: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
33f0: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
3400: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
3410: 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f  when a large pro
3420: 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66  gram is loaded f
3430: 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20  rom a.** static 
3440: 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69  array using sqli
3450: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
3460: 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   but we want to 
3470: 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69  make a.** few mi
3480: 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74  nor changes to t
3490: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a  he program..**.*
34a0: 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74  * If n>=0 then t
34b0: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73  he P4 operand is
34c0: 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e   dynamic, meanin
34d0: 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66  g that a copy of
34e0: 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69  .** the string i
34f0: 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f  s made into memo
3500: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
3510: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
3520: 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66  )..** A value of
3530: 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79   n==0 means copy
3540: 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70   bytes of zP4 up
3550: 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e   to and includin
3560: 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e  g the.** first n
3570: 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e  ull byte.  If n>
3580: 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20  0 then copy n+1 
3590: 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a  bytes of zP4..**
35a0: 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45 59  .** If n==P4_KEY
35b0: 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68  INFO it means th
35c0: 61 74 20 7a 50 34 20 69 73 20 61 20 70 6f 69 6e  at zP4 is a poin
35d0: 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  ter to a KeyInfo
35e0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41   structure..** A
35f0: 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
3600: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
3610: 75 63 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f  ucture into memo
3620: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
3630: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
3640: 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20  oc, to be freed 
3650: 77 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73  when the Vdbe is
3660: 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e   finalized..** n
3670: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  ==P4_KEYINFO_HAN
3680: 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73 20 74  DOFF indicates t
3690: 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 20 74  hat zP4 points t
36a0: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  o a KeyInfo stru
36b0: 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20  cture.** stored 
36c0: 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74  in memory that t
36d0: 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62  he caller has ob
36e0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
36f0: 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20  te3_malloc. The 
3700: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
3710: 64 20 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61  d not free the a
3720: 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69  llocation, it wi
3730: 6c 6c 20 62 65 20 66 72 65 65 64 20 77 68 65 6e  ll be freed when
3740: 20 74 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20   the Vdbe is.** 
3750: 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a  finalized..** .*
3760: 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  * Other values o
3770: 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20  f n (P4_STATIC, 
3780: 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29  P4_COLLSEQ etc.)
3790: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a   indicate that z
37a0: 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  P4 points.** to 
37b0: 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75  a string or stru
37c0: 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75  cture that is gu
37d0: 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73  aranteed to exis
37e0: 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69  t for the lifeti
37f0: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62  me of.** the Vdb
3800: 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  e. In these case
3810: 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f  s we can just co
3820: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a  py the pointer..
3830: 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20  **.** If addr<0 
3840: 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f  then change P4 o
3850: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
3860: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73  tly inserted ins
3870: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
3880: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
3890: 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69  ngeP4(Vdbe *p, i
38a0: 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63  nt addr, const c
38b0: 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29  har *zP4, int n)
38c0: 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73  {.  Op *pOp;.  s
38d0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73  qlite3 *db;.  as
38e0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
38f0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
3900: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
3910: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3920: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d  );.  if( p->aOp=
3930: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
3940: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66  Failed ){.    if
3950: 20 28 20 6e 21 3d 50 34 5f 4b 45 59 49 4e 46 4f   ( n!=P4_KEYINFO
3960: 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42 20 29   && n!=P4_VTAB )
3970: 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28   {.      freeP4(
3980: 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28  db, n, (void*)*(
3990: 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20  char**)&zP4);.  
39a0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a    }.    return;.
39b0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
39c0: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65  >nOp>0 );.  asse
39d0: 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20  rt( addr<p->nOp 
39e0: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
39f0: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
3a00: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  >nOp - 1;.  }.  
3a10: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
3a20: 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 64 62  dr];.  freeP4(db
3a30: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
3a40: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70  Op->p4.p);.  pOp
3a50: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66  ->p4.p = 0;.  if
3a60: 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b  ( n==P4_INT32 ){
3a70: 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68  .    /* Note: th
3a80: 69 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c  is cast is safe,
3a90: 20 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69   because the ori
3aa0: 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77  gin data point w
3ab0: 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a  as an int.    **
3ac0: 20 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74   that was cast t
3ad0: 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20  o a (const char 
3ae0: 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e  *). */.    pOp->
3af0: 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54  p4.i = SQLITE_PT
3b00: 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20  R_TO_INT(zP4);. 
3b10: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3b20: 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c   P4_INT32;.  }el
3b30: 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b  se if( zP4==0 ){
3b40: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
3b50: 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74   0;.    pOp->p4t
3b60: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
3b70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  ;.  }else if( n=
3b80: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20  =P4_KEYINFO ){. 
3b90: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
3ba0: 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46  Info;.    int nF
3bb0: 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20  ield, nByte;..  
3bc0: 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65 79    nField = ((Key
3bd0: 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69 65  Info*)zP4)->nFie
3be0: 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  ld;.    nByte = 
3bf0: 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
3c00: 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73  ) + (nField-1)*s
3c10: 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e  izeof(pKeyInfo->
3c20: 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65  aColl[0]) + nFie
3c30: 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  ld;.    pKeyInfo
3c40: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
3c50: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 70  ( nByte );.    p
3c60: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20  Op->p4.pKeyInfo 
3c70: 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  = pKeyInfo;.    
3c80: 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
3c90: 20 20 20 20 20 20 75 38 20 2a 61 53 6f 72 74 4f        u8 *aSortO
3ca0: 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63  rder;.      memc
3cb0: 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 34  py(pKeyInfo, zP4
3cc0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
3cd0: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65  aSortOrder = pKe
3ce0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
3cf0: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 6f  r;.      if( aSo
3d00: 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20  rtOrder ){.     
3d10: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f     pKeyInfo->aSo
3d20: 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69 67  rtOrder = (unsig
3d30: 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79 49  ned char*)&pKeyI
3d40: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c  nfo->aColl[nFiel
3d50: 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  d];.        memc
3d60: 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  py(pKeyInfo->aSo
3d70: 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f 72  rtOrder, aSortOr
3d80: 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20  der, nField);.  
3d90: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 2d      }.      pOp-
3da0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59  >p4type = P4_KEY
3db0: 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  INFO;.    }else{
3dc0: 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61  .      p->db->ma
3dd0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
3de0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70        pOp->p4typ
3df0: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
3e00: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
3e10: 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f  ( n==P4_KEYINFO_
3e20: 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20 70  HANDOFF ){.    p
3e30: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
3e40: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
3e50: 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49  p4type = P4_KEYI
3e60: 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NFO;.  }else if(
3e70: 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20   n==P4_VTAB ){. 
3e80: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
3e90: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
3ea0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3eb0: 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65  VTAB;.    sqlite
3ec0: 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c  3VtabLock((VTabl
3ed0: 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73  e *)zP4);.    as
3ee0: 73 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a  sert( ((VTable *
3ef0: 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62  )zP4)->db==p->db
3f00: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
3f10: 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  n<0 ){.    pOp->
3f20: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
3f30: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
3f40: 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  pe = (signed cha
3f50: 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r)n;.  }else{.  
3f60: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d    if( n==0 ) n =
3f70: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
3f80: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
3f90: 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62  p4.z = sqlite3Db
3fa0: 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a  StrNDup(p->db, z
3fb0: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d  P4, n);.    pOp-
3fc0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
3fd0: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  AMIC;.  }.}..#if
3fe0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
3ff0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d  * Change the com
4000: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74 68 65 20  ment on the the 
4010: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f  most recently co
4020: 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ded instruction.
4030: 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61    Or.** insert a
4040: 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74   No-op and add t
4050: 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68  he comment to th
4060: 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69  at new instructi
4070: 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b  on.  This.** mak
4080: 65 73 20 74 68 65 20 63 6f 64 65 20 65 61 73 69  es the code easi
4090: 65 72 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e  er to read durin
40a0: 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f  g debugging.  No
40b0: 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70 70 65  ne of this happe
40c0: 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75  ns.** in a produ
40d0: 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a  ction build..*/.
40e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
40f0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
4100: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
4110: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
4120: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 61 73 73 65  _list ap;.  asse
4130: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20  rt( p->nOp>0 || 
4140: 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61  p->aOp==0 );.  a
4150: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30  ssert( p->aOp==0
4160: 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   || p->aOp[p->nO
4170: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30  p-1].zComment==0
4180: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
4190: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
41a0: 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63   p->nOp ){.    c
41b0: 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61  har **pz = &p->a
41c0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
41d0: 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74  mment;.    va_st
41e0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
41f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
4200: 72 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b  ree(p->db, *pz);
4210: 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74  .    *pz = sqlit
4220: 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62  e3VMPrintf(p->db
4230: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
4240: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
4250: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
4260: 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e  e3VdbeNoopCommen
4270: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
4280: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
4290: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
42a0: 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ap;.  sqlite3Vdb
42b0: 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f  eAddOp0(p, OP_No
42c0: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  op);.  assert( p
42d0: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f  ->nOp>0 || p->aO
42e0: 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p==0 );.  assert
42f0: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70  ( p->aOp==0 || p
4300: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
4310: 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70  zComment==0 || p
4320: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
4330: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ed );.  if( p->n
4340: 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  Op ){.    char *
4350: 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d  *pz = &p->aOp[p-
4360: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
4370: 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ;.    va_start(a
4380: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
4390: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
43a0: 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20  ->db, *pz);.    
43b0: 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  *pz = sqlite3VMP
43c0: 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f  rintf(p->db, zFo
43d0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
43e0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
43f0: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42  .#endif  /* NDEB
4400: 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  UG */../*.** Ret
4410: 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66  urn the opcode f
4420: 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65  or a given addre
4430: 73 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72  ss.  If the addr
4440: 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a  ess is -1, then.
4450: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** return the mo
4460: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
4470: 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  rted opcode..**.
4480: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
4490: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
44a0: 68 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69  has occurred pri
44b0: 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e  or to the callin
44c0: 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75  g of this.** rou
44d0: 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69  tine, then a poi
44e0: 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20  nter to a dummy 
44f0: 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72  VdbeOp will be r
4500: 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f  eturned.  That o
4510: 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64  pcode.** is read
4520: 61 62 6c 65 20 61 6e 64 20 77 72 69 74 61 62 6c  able and writabl
4530: 65 2c 20 62 75 74 20 69 74 20 68 61 73 20 6e 6f  e, but it has no
4540: 20 65 66 66 65 63 74 2e 20 20 54 68 65 20 72 65   effect.  The re
4550: 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 0a  turn of a dummy.
4560: 2a 2a 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73  ** opcode allows
4570: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e   the call to con
4580: 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e  tinue functionin
4590: 67 20 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61  g after a OOM fa
45a0: 75 6c 74 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68  ult without.** h
45b0: 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74  aving to check t
45c0: 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74  o see if the ret
45d0: 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 72 6f  urn from this ro
45e0: 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64  utine is a valid
45f0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
4600: 41 62 6f 75 74 20 74 68 65 20 23 69 66 64 65 66  About the #ifdef
4610: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
4620: 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  CE:  Normally, t
4630: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
4640: 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20 75  ever called.** u
4650: 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20  nless p->nOp>0. 
4660: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
4670: 20 69 6e 20 74 68 65 20 61 62 73 65 6e 73 65 20   in the absense 
4680: 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  of SQLITE_OMIT_T
4690: 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54  RACE,.** an OP_T
46a0: 72 61 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  race instruction
46b0: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 73 65 72   is always inser
46c0: 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64  ted by sqlite3Vd
46d0: 62 65 47 65 74 28 29 20 61 73 20 73 6f 6f 6e 20  beGet() as soon 
46e0: 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42 45  as.** a new VDBE
46f0: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 53 6f   is created.  So
4700: 20 77 65 20 61 72 65 20 66 72 65 65 20 74 6f 20   we are free to 
4710: 73 65 74 20 61 64 64 72 20 74 6f 20 70 2d 3e 6e  set addr to p->n
4720: 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a 20  Op-1 without.** 
4730: 68 61 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c 65  having to double
4740: 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73  -check to make s
4750: 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 73  ure that the res
4760: 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  ult is non-negat
4770: 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20 53  ive. But.** if S
4780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
4790: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
47a0: 20 4f 50 5f 54 72 61 63 65 20 69 73 20 6f 6d 69   OP_Trace is omi
47b0: 74 74 65 64 20 61 6e 64 20 77 65 20 64 6f 20 6e  tted and we do n
47c0: 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20  eed to.** check 
47d0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  the value of p->
47e0: 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20 63 6f 6e  nOp-1 before con
47f0: 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65  tinuing..*/.Vdbe
4800: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  Op *sqlite3VdbeG
4810: 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  etOp(Vdbe *p, in
4820: 74 20 61 64 64 72 29 7b 0a 20 20 73 74 61 74 69  t addr){.  stati
4830: 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 0a  c VdbeOp dummy;.
4840: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
4850: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
4860: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64  NIT );.  if( add
4870: 72 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  r<0 ){.#ifdef SQ
4880: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
4890: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d      if( p->nOp==
48a0: 30 20 29 20 72 65 74 75 72 6e 20 26 64 75 6d 6d  0 ) return &dumm
48b0: 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64  y;.#endif.    ad
48c0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
48d0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
48e0: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
48f0: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
4900: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
4910: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
4920: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
4930: 20 20 20 72 65 74 75 72 6e 20 26 64 75 6d 6d 79     return &dummy
4940: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
4950: 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64  eturn &p->aOp[ad
4960: 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  dr];.  }.}..#if 
4970: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
4980: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c  OMIT_EXPLAIN) ||
4990: 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
49a0: 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69  ) \.     || defi
49b0: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
49c0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
49d0: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
49e0: 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e   Compute a strin
49f0: 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
4a00: 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65   the P4 paramete
4a10: 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e  r for an opcode.
4a20: 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f  .** Use zTemp fo
4a30: 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74  r any required t
4a40: 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
4a50: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
4a60: 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34   char *displayP4
4a70: 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a  (Op *pOp, char *
4a80: 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70  zTemp, int nTemp
4a90: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d  ){.  char *zP4 =
4aa0: 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74   zTemp;.  assert
4ab0: 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20  ( nTemp>=20 );. 
4ac0: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34   switch( pOp->p4
4ad0: 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
4ae0: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54   P4_KEYINFO_STAT
4af0: 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  IC:.    case P4_
4b00: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
4b10: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20   int i, j;.     
4b20: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
4b30: 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  fo = pOp->p4.pKe
4b40: 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c  yInfo;.      sql
4b50: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4b60: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79  emp, zTemp, "key
4b70: 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e  info(%d", pKeyIn
4b80: 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20  fo->nField);.   
4b90: 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74     i = sqlite3St
4ba0: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20  rlen30(zTemp);. 
4bb0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
4bc0: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
4bd0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4be0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
4bf0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
4c00: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
4c10: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
4c20: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
4c30: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c  te3Strlen30(pCol
4c40: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
4c50: 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65       if( i+n>nTe
4c60: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
4c70: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
4c80: 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a  p[i],",...",4);.
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
4ca0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
4cb0: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
4cc0: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
4cd0: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
4ce0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
4cf0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
4d00: 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20  Order[j] ){.    
4d10: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
4d20: 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20  +] = '-';.      
4d30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
4d40: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
4d50: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e  , pColl->zName,n
4d60: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +1);.          i
4d70: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d   += n;.        }
4d80: 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65  else if( i+4<nTe
4d90: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
4da0: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
4db0: 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20  i],",nil",4);.  
4dc0: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a          i += 4;.
4dd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4de0: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b  }.      zTemp[i+
4df0: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20  +] = ')';.      
4e00: 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20  zTemp[i] = 0;.  
4e10: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54      assert( i<nT
4e20: 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65  emp );.      bre
4e30: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4e40: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P4_COLLSEQ: {
4e50: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
4e60: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e  pColl = pOp->p4.
4e70: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c  pColl;.      sql
4e80: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4e90: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c  emp, zTemp, "col
4ea0: 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43  lseq(%.20s)", pC
4eb0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
4ec0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4ed0: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
4ee0: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  DEF: {.      Fun
4ef0: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
4f00: 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20  ->p4.pFunc;.    
4f10: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4f20: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4f30: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
4f40: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
4f50: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
4f60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4f70: 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20   P4_INT64: {.   
4f80: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
4f90: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4fa0: 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e  , "%lld", *pOp->
4fb0: 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20  p4.pI64);.      
4fc0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4fd0: 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20   case P4_INT32: 
4fe0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
4ff0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
5000: 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70  zTemp, "%d", pOp
5010: 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62  ->p4.i);.      b
5020: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5030: 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a  case P4_REAL: {.
5040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
5050: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
5060: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70  emp, "%.16g", *p
5070: 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20  Op->p4.pReal);. 
5080: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5090: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45  }.    case P4_ME
50a0: 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  M: {.      Mem *
50b0: 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pMem = pOp->p4.p
50c0: 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Mem;.      asser
50d0: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
50e0: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
50f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
5100: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
5110: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  r ){.        zP4
5120: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
5130: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
5140: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
5150: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
5160: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
5170: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
5180: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
5190: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
51a0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
51b0: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
51c0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
51d0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
51e0: 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e   "%.16g", pMem->
51f0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
5200: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
5210: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5220: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
5230: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
5240: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
5250: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
5260: 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70  pOp->p4.pVtab->p
5270: 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69  Vtab;.      sqli
5280: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
5290: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62  mp, zTemp, "vtab
52a0: 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62 2c 20  :%p:%p", pVtab, 
52b0: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b  pVtab->pModule);
52c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
52d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
52e0: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
52f0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
5300: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
5310: 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72 72 61   zTemp, "intarra
5320: 79 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  y");.      break
5330: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
5340: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34  ult: {.      zP4
5350: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
5360: 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29      if( zP4==0 )
5370: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
5380: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a  zTemp;.        z
5390: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
53a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
53b0: 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20   assert( zP4!=0 
53c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b  );.  return zP4;
53d0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
53e0: 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20   Declare to the 
53f0: 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54  Vdbe that the BT
5400: 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62  ree object at db
5410: 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64  ->aDb[i] is used
5420: 2e 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ..**.*/.void sql
5430: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
5440: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
5450: 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20  ){.  int mask;. 
5460: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
5470: 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26   i<p->db->nDb &&
5480: 20 69 3c 73 69 7a 65 6f 66 28 75 33 32 29 2a 38   i<sizeof(u32)*8
5490: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c   );.  assert( i<
54a0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62  (int)sizeof(p->b
54b0: 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  treeMask)*8 );. 
54c0: 20 6d 61 73 6b 20 3d 20 28 28 75 33 32 29 31 29   mask = ((u32)1)
54d0: 3c 3c 69 3b 0a 20 20 69 66 28 20 28 70 2d 3e 62  <<i;.  if( (p->b
54e0: 74 72 65 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29  treeMask & mask)
54f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 62 74  ==0 ){.    p->bt
5500: 72 65 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  reeMask |= mask;
5510: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
5520: 65 4d 75 74 65 78 41 72 72 61 79 49 6e 73 65 72  eMutexArrayInser
5530: 74 28 26 70 2d 3e 61 4d 75 74 65 78 2c 20 70 2d  t(&p->aMutex, p-
5540: 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  >db->aDb[i].pBt)
5550: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65  ;.  }.}...#if de
5560: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
5570: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
5580: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
5590: 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c  ** Print a singl
55a0: 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  e opcode.  This 
55b0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
55c0: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  for debugging on
55d0: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
55e0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46  te3VdbePrintOp(F
55f0: 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70  ILE *pOut, int p
5600: 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63  c, Op *pOp){.  c
5610: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72  har *zP4;.  char
5620: 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61   zPtr[50];.  sta
5630: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
5640: 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20  zFormat1 = "%4d 
5650: 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34  %-13s %4d %4d %4
5660: 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e  d %-4s %.2X %s\n
5670: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
5680: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
5690: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
56a0: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
56b0: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20  izeof(zPtr));.  
56c0: 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46  fprintf(pOut, zF
56d0: 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20  ormat1, pc, .   
56e0: 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65     sqlite3Opcode
56f0: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
5700: 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  ), pOp->p1, pOp-
5710: 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50  >p2, pOp->p3, zP
5720: 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64  4, pOp->p5,.#ifd
5730: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
5740: 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d        pOp->zComm
5750: 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  ent ? pOp->zComm
5760: 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20  ent : "".#else. 
5770: 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66 0a 20       "".#endif. 
5780: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
5790: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
57a0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61  .** Release an a
57b0: 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c  rray of N Mem el
57c0: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
57d0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d   void releaseMem
57e0: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
57f0: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26  t N){.  if( p &&
5800: 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70   N ){.    Mem *p
5810: 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  End;.    sqlite3
5820: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
5830: 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c    u8 malloc_fail
5840: 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ed = db->mallocF
5850: 61 69 6c 65 64 3b 0a 20 20 20 20 66 6f 72 28 70  ailed;.    for(p
5860: 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e  End=&p[N]; p<pEn
5870: 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 61  d; p++){.      a
5880: 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d  ssert( (&p[1])==
5890: 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d  pEnd || p[0].db=
58a0: 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20 20 20  =p[1].db );..   
58b0: 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
58c0: 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e   is really an in
58d0: 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  lined version of
58e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
58f0: 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a  elease().      *
5900: 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76  * that takes adv
5910: 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61  antage of the fa
5920: 63 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f  ct that the memo
5930: 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73  ry cell value is
5940: 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67   .      ** being
5950: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74   set to NULL aft
5960: 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79  er releasing any
5970: 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63   dynamic resourc
5980: 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  es..      **.   
5990: 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66     ** The justif
59a0: 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c  ication for dupl
59b0: 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20  icating code is 
59c0: 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74  that according t
59d0: 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  o .      ** call
59e0: 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73  grind, this caus
59f0: 65 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73  es a certain tes
5a00: 74 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68  t case to hit th
5a10: 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20  e CPU 4.7 .     
5a20: 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73   ** percent less
5a30: 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63   (x86 linux, gcc
5a40: 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20   version 4.1.2, 
5a50: 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20  -O6) than if .  
5a60: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65      ** sqlite3Me
5a70: 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20  mRelease() were 
5a80: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65  called from here
5a90: 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73  . With -O2, this
5aa0: 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20   jumps.      ** 
5ab0: 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20  to 6.6 percent. 
5ac0: 54 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73  The test case is
5ad0: 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20   inserting 1000 
5ae0: 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c  rows into a tabl
5af0: 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68  e .      ** with
5b00: 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e   no indexes usin
5b10: 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61  g a single prepa
5b20: 72 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65  red INSERT state
5b30: 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20  ment, bind() .  
5b40: 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
5b50: 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20  (). Inserts are 
5b60: 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74  grouped into a t
5b70: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
5b80: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
5b90: 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67  ->flags&(MEM_Agg
5ba0: 7c 4d 45 4d 5f 44 79 6e 29 20 29 7b 0a 20 20 20  |MEM_Dyn) ){.   
5bb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5bc0: 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20  MemRelease(p);. 
5bd0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
5be0: 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20  ->zMalloc ){.   
5bf0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5c00: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
5c10: 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a  c);.        p->z
5c20: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
5c30: 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c    }..      p->fl
5c40: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
5c50: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61      }.    db->ma
5c60: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c  llocFailed = mal
5c70: 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a  loc_failed;.  }.
5c80: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
5c90: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
5ca0: 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71  ANAGEMENT.int sq
5cb0: 6c 69 74 65 33 56 64 62 65 52 65 6c 65 61 73 65  lite3VdbeRelease
5cc0: 42 75 66 66 65 72 73 28 56 64 62 65 20 2a 70 29  Buffers(Vdbe *p)
5cd0: 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  {.  int ii;.  in
5ce0: 74 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 61  t nFree = 0;.  a
5cf0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5d00: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
5d10: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
5d20: 28 69 69 3d 31 3b 20 69 69 3c 3d 70 2d 3e 6e 4d  (ii=1; ii<=p->nM
5d30: 65 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 4d  em; ii++){.    M
5d40: 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61  em *pMem = &p->a
5d50: 4d 65 6d 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28  Mem[ii];.    if(
5d60: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
5d70: 45 4d 5f 52 6f 77 53 65 74 20 29 7b 0a 20 20 20  EM_RowSet ){.   
5d80: 20 20 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74     sqlite3RowSet
5d90: 43 6c 65 61 72 28 70 4d 65 6d 2d 3e 75 2e 70 52  Clear(pMem->u.pR
5da0: 6f 77 53 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20  owSet);.    }.  
5db0: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 20 26 26    if( pMem->z &&
5dc0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d   pMem->flags&MEM
5dd0: 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 61 73  _Dyn ){.      as
5de0: 73 65 72 74 28 20 21 70 4d 65 6d 2d 3e 78 44 65  sert( !pMem->xDe
5df0: 6c 20 29 3b 0a 20 20 20 20 20 20 6e 46 72 65 65  l );.      nFree
5e00: 20 2b 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c   += sqlite3DbMal
5e10: 6c 6f 63 53 69 7a 65 28 70 4d 65 6d 2d 3e 64 62  locSize(pMem->db
5e20: 2c 20 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  , pMem->z);.    
5e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
5e40: 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20  Release(pMem);. 
5e50: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5e60: 6e 20 6e 46 72 65 65 3b 0a 7d 0a 23 65 6e 64 69  n nFree;.}.#endi
5e70: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
5e80: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
5e90: 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74  *.** Give a list
5ea0: 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ing of the progr
5eb0: 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  am in the virtua
5ec0: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a  l machine..**.**
5ed0: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
5ee0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  s the same as sq
5ef0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
5f00: 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66    But instead of
5f10: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  .** running the 
5f20: 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73  code, it invokes
5f30: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
5f40: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74  ce for each inst
5f50: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
5f60: 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64   feature is used
5f70: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45   to implement "E
5f80: 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57  XPLAIN"..**.** W
5f90: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
5fa0: 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  1, each instruct
5fb0: 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20  ion is listed.  
5fc0: 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61  When.** p->expla
5fd0: 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45  in==2, only OP_E
5fe0: 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
5ff0: 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61  ons are listed a
6000: 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20  nd these.** are 
6010: 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65  shown in a diffe
6020: 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d  rent format.  p-
6030: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75  >explain==2 is u
6040: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
6050: 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52  .** EXPLAIN QUER
6060: 59 20 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e 74 20 73  Y PLAN..*/.int s
6070: 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a  qlite3VdbeList(.
6080: 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20    Vdbe *p       
6090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
60a0: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20  he VDBE */.){.  
60b0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
60c0: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
60d0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
60e0: 4f 4b 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  OK;.  Mem *pMem 
60f0: 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20  = p->pResultSet 
6100: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 0a  = &p->aMem[1];..
6110: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70    assert( p->exp
6120: 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lain );.  assert
6130: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
6140: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20  _MAGIC_RUN );.  
6150: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 67 69  assert( db->magi
6160: 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c==SQLITE_MAGIC_
6170: 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65 72 74  BUSY );.  assert
6180: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
6190: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
61a0: 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72  ITE_BUSY || p->r
61b0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
61c0: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
61d0: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
61e0: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79   does not use dy
61f0: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f  namic strings fo
6200: 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c  r.  ** the resul
6210: 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  t, result column
6220: 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e  s may become dyn
6230: 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72  amic if the user
6240: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69   calls.  ** sqli
6250: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
6260: 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74  6(), causing a t
6270: 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54  ranslation to UT
6280: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20  F-16 encoding.. 
6290: 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   */.  releaseMem
62a0: 41 72 72 61 79 28 70 4d 65 6d 2c 20 70 2d 3e 6e  Array(pMem, p->n
62b0: 4d 65 6d 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  Mem);..  if( p->
62c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
62d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
62e0: 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c  happens if a mal
62f0: 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63  loc() inside a c
6300: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
6310: 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a  olumn_text() or.
6320: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
6330: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66  olumn_text16() f
6340: 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64  ailed.  */.    d
6350: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6360: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
6370: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
6380: 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d  }..  do{.    i =
6390: 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69   p->pc++;.  }whi
63a0: 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26 20  le( i<p->nOp && 
63b0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26  p->explain==2 &&
63c0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
63d0: 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b  e!=OP_Explain );
63e0: 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70  .  if( i>=p->nOp
63f0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
6400: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
6410: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
6420: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
6430: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
6440: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
6450: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
6460: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
6470: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
6480: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
6490: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
64a0: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
64b0: 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d  Str(p->rc));.  }
64c0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
64d0: 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d  z;.    Op *pOp =
64e0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20   &p->aOp[i];.   
64f0: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
6500: 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d  =1 ){.      pMem
6510: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
6520: 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  t;.      pMem->t
6530: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
6540: 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d  EGER;.      pMem
6550: 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20  ->u.i = i;      
6560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
6580: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
6590: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
65a0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
65b0: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c  gs = MEM_Static|
65c0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
65d0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
65e0: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
65f0: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
6600: 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63  opcode);  /* Opc
6610: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ode */.      ass
6620: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
6630: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  );.      pMem->n
6640: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
6650: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
6660: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
6670: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
6680: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
6690: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
66a0: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a    pMem++;.    }.
66b0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
66c0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
66d0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
66e0: 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p1;            
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6700: 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d   P1 */.    pMem-
6710: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
6720: 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d  NTEGER;.    pMem
6730: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  ++;..    pMem->f
6740: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
6750: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
6760: 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20  pOp->p2;        
6770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6780: 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70    /* P2 */.    p
6790: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
67a0: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
67b0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
67c0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
67d0: 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  {.      pMem->fl
67e0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
67f0: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
6800: 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20   pOp->p3;       
6810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6820: 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20     /* P3 */.    
6830: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
6840: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
6850: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20       pMem++;.   
6860: 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69   }..    if( sqli
6870: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
6880: 4d 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20  Mem, 32, 0) ){  
6890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20            /* P4 
68a0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
68b0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
68c0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
68d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
68e0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  R;.    }.    pMe
68f0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44  m->flags = MEM_D
6900: 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  yn|MEM_Str|MEM_T
6910: 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73  erm;.    z = dis
6920: 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d  playP4(pOp, pMem
6930: 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66  ->z, 32);.    if
6940: 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a  ( z!=pMem->z ){.
6950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6960: 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c  eMemSetStr(pMem,
6970: 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55   z, -1, SQLITE_U
6980: 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  TF8, 0);.    }el
6990: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
69a0: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
69b0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
69c0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
69d0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
69e0: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
69f0: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20  TE_UTF8;.    }. 
6a00: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
6a10: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
6a20: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66   pMem++;..    if
6a30: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
6a40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
6a50: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
6a60: 70 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20  pMem, 4, 0) ){. 
6a70: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6a80: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
6a90: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ed );.        re
6aa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
6ab0: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
6ac0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
6ad0: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d  EM_Dyn|MEM_Str|M
6ae0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
6af0: 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20  Mem->n = 2;.    
6b00: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6b10: 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22  tf(3, pMem->z, "
6b20: 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b  %.2x", pOp->p5);
6b30: 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20     /* P5 */.    
6b40: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
6b50: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
6b60: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
6b70: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
6b80: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64   pMem++;.  .#ifd
6b90: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
6ba0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a        if( pOp->z
6bb0: 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  Comment ){.     
6bc0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
6bd0: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
6be0: 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  m;.        pMem-
6bf0: 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  >z = pOp->zComme
6c00: 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  nt;.        pMem
6c10: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
6c20: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
6c30: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e          pMem->en
6c40: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
6c50: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  .        pMem->t
6c60: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
6c70: 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  T;.      }else.#
6c80: 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
6c90: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
6ca0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20  s = MEM_Null;   
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cc0: 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a      /* Comment *
6cd0: 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /.        pMem->
6ce0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55  type = SQLITE_NU
6cf0: 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
6d00: 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f  }..    p->nResCo
6d10: 6c 75 6d 6e 20 3d 20 38 20 2d 20 35 2a 28 70 2d  lumn = 8 - 5*(p-
6d20: 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20  >explain-1);.   
6d30: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
6d40: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
6d50: 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72  ITE_ROW;.  }.  r
6d60: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
6d70: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
6d80: 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69  T_EXPLAIN */..#i
6d90: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
6da0: 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  G./*.** Print th
6db0: 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75  e SQL that was u
6dc0: 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  sed to generate 
6dd0: 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a  a VDBE program..
6de0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
6df0: 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65  dbePrintSql(Vdbe
6e00: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
6e10: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
6e20: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e  Op *pOp;.  if( n
6e30: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
6e40: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30   pOp = &p->aOp[0
6e50: 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  ];.  if( pOp->op
6e60: 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26  code==OP_Trace &
6e70: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
6e80: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
6e90: 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b   *z = pOp->p4.z;
6ea0: 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69  .    while( sqli
6eb0: 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29  te3Isspace(*z) )
6ec0: 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66   z++;.    printf
6ed0: 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20  ("SQL: [%s]\n", 
6ee0: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
6ef0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
6f00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
6f10: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
6f20: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
6f30: 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  CE)./*.** Print 
6f40: 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61  an IOTRACE messa
6f50: 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63  ge showing SQL c
6f60: 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ontent..*/.void 
6f70: 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61  sqlite3VdbeIOTra
6f80: 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ceSql(Vdbe *p){.
6f90: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e    int nOp = p->n
6fa0: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  Op;.  VdbeOp *pO
6fb0: 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  p;.  if( sqlite3
6fc0: 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74  IoTrace==0 ) ret
6fd0: 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31  urn;.  if( nOp<1
6fe0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70   ) return;.  pOp
6ff0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
7000: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
7010: 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f  ==OP_Trace && pO
7020: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
7030: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
7040: 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20  char z[1000];.  
7050: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7060: 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
7070: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a   "%s", pOp->p4.z
7080: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
7090: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
70a0: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
70b0: 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20   for(j=0; z[i]; 
70c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
70d0: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
70e0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
70f0: 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20  if( z[i-1]!=' ' 
7100: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  ){.          z[j
7110: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
7120: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
7130: 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  {.        z[j++]
7140: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d   = z[i];.      }
7150: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20  .    }.    z[j] 
7160: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
7170: 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c  IoTrace("SQL %s\
7180: 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65  n", z);.  }.}.#e
7190: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
71a0: 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51  OMIT_TRACE && SQ
71b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
71c0: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ACE */../*.** Al
71d0: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 72 6f  locate space fro
71e0: 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65 20 62  m a fixed size b
71f0: 75 66 66 65 72 2e 20 20 4d 61 6b 65 20 2a 70 70  uffer.  Make *pp
7200: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
7210: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
7220: 2e 20 20 28 4e 6f 74 65 3a 20 20 70 70 20 69 73  .  (Note:  pp is
7230: 20 61 20 63 68 61 72 2a 20 72 61 74 68 65 72 20   a char* rather 
7240: 74 68 61 6e 20 61 20 76 6f 69 64 2a 2a 20 74 6f  than a void** to
7250: 0a 2a 2a 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20  .** work around 
7260: 74 68 65 20 70 6f 69 6e 74 65 72 20 61 6c 69 61  the pointer alia
7270: 73 69 6e 67 20 72 75 6c 65 73 20 6f 66 20 43 2e  sing rules of C.
7280: 29 20 20 2a 70 70 20 73 68 6f 75 6c 64 20 69 6e  )  *pp should in
7290: 69 74 69 61 6c 6c 79 0a 2a 2a 20 62 65 20 7a 65  itially.** be ze
72a0: 72 6f 2e 20 20 49 66 20 2a 70 70 20 69 73 20 6e  ro.  If *pp is n
72b0: 6f 74 20 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65  ot zero, that me
72c0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 70 61  ans that the spa
72d0: 63 65 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  ce has already.*
72e0: 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  * been allocated
72f0: 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
7300: 65 20 69 73 20 61 20 6e 6f 6f 70 2e 0a 2a 2a 0a  e is a noop..**.
7310: 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65 20  ** nByte is the 
7320: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
7330: 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e  of space needed.
7340: 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70  .**.** *ppFrom p
7350: 6f 69 6e 74 20 74 6f 20 61 76 61 69 6c 61 62 6c  oint to availabl
7360: 65 20 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64  e space and pEnd
7370: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65   points to the e
7380: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61  nd of the.** ava
7390: 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 0a 2a 2a  ilable space..**
73a0: 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61  .** *pnByte is a
73b0: 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20   counter of the 
73c0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
73d0: 6f 66 20 73 70 61 63 65 20 74 68 61 74 20 68 61  of space that ha
73e0: 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20  ve failed.** to 
73f0: 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68  allocate.  If th
7400: 65 72 65 20 69 73 20 69 6e 73 75 66 66 69 63 69  ere is insuffici
7410: 65 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70  ent space in *pp
7420: 46 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20  From to satisfy 
7430: 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20  the.** request, 
7440: 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a  then increment *
7450: 70 6e 42 79 74 65 20 62 79 20 74 68 65 20 61 6d  pnByte by the am
7460: 6f 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75  ount of the requ
7470: 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  est..*/.static v
7480: 6f 69 64 20 61 6c 6c 6f 63 53 70 61 63 65 28 0a  oid allocSpace(.
7490: 20 20 63 68 61 72 20 2a 70 70 2c 20 20 20 20 20    char *pp,     
74a0: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
74b0: 3a 20 53 65 74 20 2a 70 70 20 74 6f 20 70 6f 69  : Set *pp to poi
74c0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 64 20  nt to allocated 
74d0: 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
74e0: 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
74f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
7500: 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
7510: 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d  */.  u8 **ppFrom
7520: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ,         /* IN/
7530: 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72  OUT: Allocate fr
7540: 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20  om *ppFrom */.  
7550: 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  u8 *pEnd,       
7560: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
7570: 74 6f 20 31 20 62 79 74 65 20 70 61 73 74 20 74  to 1 byte past t
7580: 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f  he end of *ppFro
7590: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  m buffer */.  in
75a0: 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20  t *pnByte       
75b0: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74     /* If allocat
75c0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61  ion cannot be ma
75d0: 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  de, increment *p
75e0: 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  nByte */.){.  as
75f0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
7600: 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72  _ALIGNMENT(*ppFr
7610: 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 28 2a 28  om) );.  if( (*(
7620: 76 6f 69 64 2a 2a 29 70 70 29 3d 3d 30 20 29 7b  void**)pp)==0 ){
7630: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  .    nByte = ROU
7640: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 20 20  ND8(nByte);.    
7650: 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e  if( &(*ppFrom)[n
7660: 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b  Byte] <= pEnd ){
7670: 0a 20 20 20 20 20 20 2a 28 76 6f 69 64 2a 2a 29  .      *(void**)
7680: 70 70 20 3d 20 28 76 6f 69 64 20 2a 29 2a 70 70  pp = (void *)*pp
7690: 46 72 6f 6d 3b 0a 20 20 20 20 20 20 2a 70 70 46  From;.      *ppF
76a0: 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  rom += nByte;.  
76b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
76c0: 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b  pnByte += nByte;
76d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
76e0: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69  .** Prepare a vi
76f0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f  rtual machine fo
7700: 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54 68  r execution.  Th
7710: 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e  is involves thin
7720: 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c  gs such.** as al
7730: 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73  locating stack s
7740: 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  pace and initial
7750: 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61  izing the progra
7760: 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66  m counter..** Af
7770: 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73  ter the VDBE has
7780: 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20   be prepped, it 
7790: 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20  can be executed 
77a0: 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a  by one or more.*
77b0: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
77c0: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a  e3VdbeExec().  .
77d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  **.** This is th
77e0: 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f  e only way to mo
77f0: 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20 56  ve a VDBE from V
7800: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74  DBE_MAGIC_INIT t
7810: 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
7820: 52 55 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  RUN..**.** This 
7830: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
7840: 63 61 6c 6c 65 64 20 6d 6f 72 65 20 74 68 61 6e  called more than
7850: 20 6f 6e 63 65 20 6f 6e 20 61 20 73 69 6e 67 6c   once on a singl
7860: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
7870: 65 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  e..** The first 
7880: 63 61 6c 6c 20 69 73 20 6d 61 64 65 20 77 68 69  call is made whi
7890: 6c 65 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65  le compiling the
78a0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
78b0: 53 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 63 61  Subsequent.** ca
78c0: 6c 6c 73 20 61 72 65 20 6d 61 64 65 20 61 73 20  lls are made as 
78d0: 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 6f 63  part of the proc
78e0: 65 73 73 20 6f 66 20 72 65 73 65 74 74 69 6e 67  ess of resetting
78f0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20   a statement to 
7900: 62 65 0a 2a 2a 20 72 65 2d 65 78 65 63 75 74 65  be.** re-execute
7910: 64 20 28 66 72 6f 6d 20 61 20 63 61 6c 6c 20 74  d (from a call t
7920: 6f 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  o sqlite3_reset(
7930: 29 29 2e 20 54 68 65 20 6e 56 61 72 2c 20 6e 4d  )). The nVar, nM
7940: 65 6d 2c 20 6e 43 75 72 73 6f 72 20 0a 2a 2a 20  em, nCursor .** 
7950: 61 6e 64 20 69 73 45 78 70 6c 61 69 6e 20 70 61  and isExplain pa
7960: 72 61 6d 65 74 65 72 73 20 61 72 65 20 6f 6e 6c  rameters are onl
7970: 79 20 70 61 73 73 65 64 20 63 6f 72 72 65 63 74  y passed correct
7980: 20 76 61 6c 75 65 73 20 74 68 65 20 66 69 72 73   values the firs
7990: 74 20 74 69 6d 65 0a 2a 2a 20 74 68 65 20 66 75  t time.** the fu
79a0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
79b0: 2e 20 4f 6e 20 73 75 62 73 65 71 75 65 6e 74 20  . On subsequent 
79c0: 63 61 6c 6c 73 2c 20 66 72 6f 6d 20 73 71 6c 69  calls, from sqli
79d0: 74 65 33 5f 72 65 73 65 74 28 29 2c 20 6e 56 61  te3_reset(), nVa
79e0: 72 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 2d  r.** is passed -
79f0: 31 20 61 6e 64 20 6e 4d 65 6d 2c 20 6e 43 75 72  1 and nMem, nCur
7a00: 73 6f 72 20 61 6e 64 20 69 73 45 78 70 6c 61 69  sor and isExplai
7a10: 6e 20 61 72 65 20 61 6c 6c 20 70 61 73 73 65 64  n are all passed
7a20: 20 7a 65 72 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73   zero..*/.void s
7a30: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
7a40: 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ady(.  Vdbe *p, 
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
7a70: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c  E */.  int nVar,
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7aa0: 6f 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68  of '?' see in th
7ab0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
7ac0: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20  */.  int nMem,  
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ae0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7af0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f   memory cells to
7b00: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69   allocate */.  i
7b10: 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20  nt nCursor,     
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7b30: 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   Number of curso
7b40: 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
7b50: 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69  /.  int isExplai
7b60: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
7b70: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
7b80: 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72  e EXPLAIN keywor
7b90: 64 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  ds is present */
7ba0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  .){.  int n;.  s
7bb0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
7bc0: 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  db;..  assert( p
7bd0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
7be0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
7bf0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20  MAGIC_INIT );.. 
7c00: 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64   /* There should
7c10: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
7c20: 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20   opcode..  */.  
7c30: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
7c40: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
7c50: 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f  e magic to VDBE_
7c60: 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72  MAGIC_RUN sooner
7c70: 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
7c80: 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69  er. */.  p->magi
7c90: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
7ca0: 55 4e 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61  UN;..  /* For ea
7cb0: 63 68 20 63 75 72 73 6f 72 20 72 65 71 75 69 72  ch cursor requir
7cc0: 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74  ed, also allocat
7cd0: 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  e a memory cell.
7ce0: 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c   Memory.  ** cel
7cf0: 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73  ls (nMem+1-nCurs
7d00: 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75  or)..nMem, inclu
7d10: 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72  sive, will never
7d20: 20 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a   be used by.  **
7d30: 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
7d40: 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79 20  m. Instead they 
7d50: 61 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f  are used to allo
7d60: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20  cate space for. 
7d70: 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 2f 42   ** VdbeCursor/B
7d80: 74 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72  tCursor structur
7d90: 65 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66 20  es. The blob of 
7da0: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
7db0: 64 20 77 69 74 68 20 0a 20 20 2a 2a 20 63 75 72  d with .  ** cur
7dc0: 73 6f 72 20 30 20 69 73 20 73 74 6f 72 65 64 20  sor 0 is stored 
7dd0: 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e  in memory cell n
7de0: 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c  Mem. Memory cell
7df0: 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73   (nMem-1).  ** s
7e00: 74 6f 72 65 73 20 74 68 65 20 62 6c 6f 62 20 6f  tores the blob o
7e10: 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  f memory associa
7e20: 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
7e30: 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a  1, etc..  **.  *
7e40: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f  * See also: allo
7e50: 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20  cateCursor()..  
7e60: 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75  */.  nMem += nCu
7e70: 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  rsor;..  /* Allo
7e80: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d  cate space for m
7e90: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 2c  emory registers,
7ea0: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 2c 20   SQL variables, 
7eb0: 56 44 42 45 20 63 75 72 73 6f 72 73 20 61 6e 64  VDBE cursors and
7ec0: 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61 79 20   .  ** an array 
7ed0: 74 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c 20 66  to marshal SQL f
7ee0: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
7ef0: 73 20 69 6e 2e 20 54 68 69 73 20 69 73 20 6f 6e  s in. This is on
7f00: 6c 79 20 64 6f 6e 65 20 74 68 65 0a 20 20 2a 2a  ly done the.  **
7f10: 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
7f20: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
7f30: 6c 65 64 20 66 6f 72 20 61 20 67 69 76 65 6e 20  led for a given 
7f40: 56 44 42 45 2c 20 6e 6f 74 20 77 68 65 6e 20 69  VDBE, not when i
7f50: 74 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20  t is.  ** being 
7f60: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 73 71 6c 69  called from sqli
7f70: 74 65 33 5f 72 65 73 65 74 28 29 20 74 6f 20 72  te3_reset() to r
7f80: 65 73 65 74 20 74 68 65 20 76 69 72 74 75 61 6c  eset the virtual
7f90: 20 6d 61 63 68 69 6e 65 2e 0a 20 20 2a 2f 0a 20   machine..  */. 
7fa0: 20 69 66 28 20 6e 56 61 72 3e 3d 30 20 26 26 20   if( nVar>=0 && 
7fb0: 41 4c 57 41 59 53 28 64 62 2d 3e 6d 61 6c 6c 6f  ALWAYS(db->mallo
7fc0: 63 46 61 69 6c 65 64 3d 3d 30 29 20 29 7b 0a 20  cFailed==0) ){. 
7fd0: 20 20 20 75 38 20 2a 7a 43 73 72 20 3d 20 28 75     u8 *zCsr = (u
7fe0: 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  8 *)&p->aOp[p->n
7ff0: 4f 70 5d 3b 0a 20 20 20 20 75 38 20 2a 7a 45 6e  Op];.    u8 *zEn
8000: 64 20 3d 20 28 75 38 20 2a 29 26 70 2d 3e 61 4f  d = (u8 *)&p->aO
8010: 70 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 0a  p[p->nOpAlloc];.
8020: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20      int nByte;. 
8030: 20 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20     int nArg;    
8040: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
8050: 6d 62 65 72 20 6f 66 20 61 72 67 73 20 70 61 73  mber of args pas
8060: 73 65 64 20 74 6f 20 61 20 75 73 65 72 20 66 75  sed to a user fu
8070: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 72  nction. */.    r
8080: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
8090: 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20 20 69 66  , &nArg);.    if
80a0: 28 20 69 73 45 78 70 6c 61 69 6e 20 26 26 20 6e  ( isExplain && n
80b0: 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 20 20  Mem<10 ){.      
80c0: 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 20 20 7d  nMem = 10;.    }
80d0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 43 73 72  .    memset(zCsr
80e0: 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b  , 0, zEnd-zCsr);
80f0: 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43  .    zCsr += (zC
8100: 73 72 20 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a  sr - (u8*)0)&7;.
8110: 20 20 20 20 61 73 73 65 72 74 28 20 45 49 47 48      assert( EIGH
8120: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
8130: 28 7a 43 73 72 29 20 29 3b 0a 0a 20 20 20 20 64  (zCsr) );..    d
8140: 6f 20 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20  o {.      nByte 
8150: 3d 20 30 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63  = 0;.      alloc
8160: 53 70 61 63 65 28 28 63 68 61 72 2a 29 26 70 2d  Space((char*)&p-
8170: 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65  >aMem, nMem*size
8180: 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20  of(Mem), &zCsr, 
8190: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
81a0: 20 20 20 20 20 61 6c 6c 6f 63 53 70 61 63 65 28       allocSpace(
81b0: 28 63 68 61 72 2a 29 26 70 2d 3e 61 56 61 72 2c  (char*)&p->aVar,
81c0: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d   nVar*sizeof(Mem
81d0: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
81e0: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 61  &nByte);.      a
81f0: 6c 6c 6f 63 53 70 61 63 65 28 28 63 68 61 72 2a  llocSpace((char*
8200: 29 26 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67  )&p->apArg, nArg
8210: 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26  *sizeof(Mem*), &
8220: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
8230: 74 65 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63  te);.      alloc
8240: 53 70 61 63 65 28 28 63 68 61 72 2a 29 26 70 2d  Space((char*)&p-
8250: 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  >azVar, nVar*siz
8260: 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73  eof(char*), &zCs
8270: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
8280: 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 53 70 61  ;.      allocSpa
8290: 63 65 28 28 63 68 61 72 2a 29 26 70 2d 3e 61 70  ce((char*)&p->ap
82a0: 43 73 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Csr, .          
82b0: 20 20 20 20 20 20 20 6e 43 75 72 73 6f 72 2a 73         nCursor*s
82c0: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
82d0: 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  *), &zCsr, zEnd,
82e0: 20 26 6e 42 79 74 65 0a 20 20 20 20 20 20 29 3b   &nByte.      );
82f0: 0a 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65  .      if( nByte
8300: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
8310: 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Free = sqlite3Db
8320: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
8330: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Byte);.      }. 
8340: 20 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70       zCsr = p->p
8350: 46 72 65 65 3b 0a 20 20 20 20 20 20 7a 45 6e 64  Free;.      zEnd
8360: 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b   = &zCsr[nByte];
8370: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 42 79  .    }while( nBy
8380: 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  te && !db->mallo
8390: 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20  cFailed );..    
83a0: 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75 31  p->nCursor = (u1
83b0: 36 29 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 69  6)nCursor;.    i
83c0: 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20  f( p->aVar ){.  
83d0: 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 75      p->nVar = (u
83e0: 31 36 29 6e 56 61 72 3b 0a 20 20 20 20 20 20 66  16)nVar;.      f
83f0: 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20  or(n=0; n<nVar; 
8400: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  n++){.        p-
8410: 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aVar[n].flags =
8420: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
8430: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62     p->aVar[n].db
8440: 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20   = db;.      }. 
8450: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
8460: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 70 2d  aMem ){.      p-
8470: 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20  >aMem--;        
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8490: 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f   aMem[] goes fro
84a0: 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20  m 1..nMem */.   
84b0: 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65     p->nMem = nMe
84c0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
84d0: 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20     /*       not 
84e0: 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a  from 0..nMem-1 *
84f0: 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b  /.      for(n=1;
8500: 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a   n<=nMem; n++){.
8510: 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b          p->aMem[
8520: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  n].flags = MEM_N
8530: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ull;.        p->
8540: 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b  aMem[n].db = db;
8550: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8560: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
8570: 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 6e 3d 31  _DEBUG.  for(n=1
8580: 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b  ; n<p->nMem; n++
8590: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
85a0: 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64 62  ->aMem[n].db==db
85b0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
85c0: 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20    p->pc = -1;.  
85d0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
85e0: 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  K;.  p->errorAct
85f0: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
8600: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20    p->explain |= 
8610: 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e  isExplain;.  p->
8620: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
8630: 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68  IC_RUN;.  p->nCh
8640: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  ange = 0;.  p->c
8650: 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70  acheCtr = 1;.  p
8660: 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f  ->minWriteFileFo
8670: 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d  rmat = 255;.  p-
8680: 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >iStatement = 0;
8690: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
86a0: 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74  FILE.  {.    int
86b0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
86c0: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
86d0: 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  .      p->aOp[i]
86e0: 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  .cnt = 0;.      
86f0: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
8700: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
8710: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
8720: 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72  Close a VDBE cur
8730: 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20  sor and release 
8740: 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65  all the resource
8750: 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a  s that cursor .*
8760: 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c  * happens to hol
8770: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
8780: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
8790: 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75  (Vdbe *p, VdbeCu
87a0: 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66  rsor *pCx){.  if
87b0: 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pCx==0 ){.    
87c0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
87d0: 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pCx->pBt ){.  
87e0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
87f0: 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20  ose(pCx->pBt);. 
8800: 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70     /* The pCx->p
8810: 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63  Cursor will be c
8820: 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  lose automatical
8830: 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ly, if it exists
8840: 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20  , by.    ** the 
8850: 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20  call above. */. 
8860: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e   }else if( pCx->
8870: 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  pCursor ){.    s
8880: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
8890: 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72  Cursor(pCx->pCur
88a0: 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  sor);.  }.#ifnde
88b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
88c0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
88d0: 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f   pCx->pVtabCurso
88e0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
88f0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
8900: 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d  tabCursor = pCx-
8910: 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  >pVtabCursor;.  
8920: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
8930: 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20  module *pModule 
8940: 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  = pCx->pModule;.
8950: 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74      p->inVtabMet
8960: 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 28 76 6f  hod = 1;.    (vo
8970: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
8980: 4f 66 66 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  Off(p->db);.    
8990: 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
89a0: 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20  pVtabCursor);.  
89b0: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
89c0: 61 66 65 74 79 4f 6e 28 70 2d 3e 64 62 29 3b 0a  afetyOn(p->db);.
89d0: 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74      p->inVtabMet
89e0: 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  hod = 0;.  }.#en
89f0: 64 69 66 0a 20 20 69 66 28 20 21 70 43 78 2d 3e  dif.  if( !pCx->
8a00: 65 70 68 65 6d 50 73 65 75 64 6f 54 61 62 6c 65  ephemPseudoTable
8a10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
8a20: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 43 78  bFree(p->db, pCx
8a30: 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a  ->pData);.  }.}.
8a40: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
8a50: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61   cursors..*/.sta
8a60: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c  tic void closeAl
8a70: 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70  lCursors(Vdbe *p
8a80: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
8a90: 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20  ( p->apCsr==0 ) 
8aa0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
8ab0: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
8ac0: 20 69 2b 2b 29 7b 0a 20 20 20 20 56 64 62 65 43   i++){.    VdbeC
8ad0: 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61  ursor *pC = p->a
8ae0: 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 69 66 28  pCsr[i];.    if(
8af0: 20 70 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c   pC ){.      sql
8b00: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
8b10: 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20  or(p, pC);.     
8b20: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30   p->apCsr[i] = 0
8b30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
8b40: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
8b50: 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75  e VM after execu
8b60: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
8b70: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75   routine will au
8b80: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
8b90: 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c  e any cursors, l
8ba0: 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20  ists, and/or.** 
8bb0: 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72  sorters that wer
8bc0: 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74  e left open.  It
8bd0: 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68   also deletes th
8be0: 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76  e values of.** v
8bf0: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
8c00: 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  aVar[] array..*/
8c10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65  .static void Cle
8c20: 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20  anup(Vdbe *p){. 
8c30: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
8c40: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
8c50: 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 63 6c   Mem *pMem;.  cl
8c60: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29  oseAllCursors(p)
8c70: 3b 0a 20 20 66 6f 72 28 70 4d 65 6d 3d 26 70 2d  ;.  for(pMem=&p-
8c80: 3e 61 4d 65 6d 5b 31 5d 2c 20 69 3d 31 3b 20 69  >aMem[1], i=1; i
8c90: 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 2c 20  <=p->nMem; i++, 
8ca0: 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  pMem++){.    if(
8cb0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
8cc0: 45 4d 5f 52 6f 77 53 65 74 20 29 7b 0a 20 20 20  EM_RowSet ){.   
8cd0: 20 20 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74     sqlite3RowSet
8ce0: 43 6c 65 61 72 28 70 4d 65 6d 2d 3e 75 2e 70 52  Clear(pMem->u.pR
8cf0: 6f 77 53 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20  owSet);.    }.  
8d00: 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
8d10: 28 70 4d 65 6d 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  (pMem, MEM_Null)
8d20: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
8d30: 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d  emArray(&p->aMem
8d40: 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20  [1], p->nMem);. 
8d50: 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78 74 53   if( p->contextS
8d60: 74 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  tack ){.    sqli
8d70: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
8d80: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29 3b 0a  >contextStack);.
8d90: 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74    }.  p->context
8da0: 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e  Stack = 0;.  p->
8db0: 63 6f 6e 74 65 78 74 53 74 61 63 6b 44 65 70 74  contextStackDept
8dc0: 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74  h = 0;.  p->cont
8dd0: 65 78 74 53 74 61 63 6b 54 6f 70 20 3d 20 30 3b  extStackTop = 0;
8de0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
8df0: 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
8e00: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
8e10: 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74   0;.  p->pResult
8e20: 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Set = 0;.}../*.*
8e30: 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
8e40: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
8e50: 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
8e60: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
8e70: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
8e80: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73  t. This is now s
8e90: 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  et at compile ti
8ea0: 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  me, rather than 
8eb0: 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74  during.** execut
8ec0: 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20  ion of the vdbe 
8ed0: 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20  program so that 
8ee0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
8ef0: 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65  ount() can.** be
8f00: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51   called on an SQ
8f10: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f  L statement befo
8f20: 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  re sqlite3_step(
8f30: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
8f40: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
8f50: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52  (Vdbe *p, int nR
8f60: 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d  esColumn){.  Mem
8f70: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e   *pColName;.  in
8f80: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t n;.  sqlite3 *
8f90: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72  db = p->db;..  r
8fa0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
8fb0: 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
8fc0: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
8fd0: 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  E_N);.  sqlite3D
8fe0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
8ff0: 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52  lName);.  n = nR
9000: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
9010: 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
9020: 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43  umn = (u16)nResC
9030: 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
9040: 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20  Name = pColName 
9050: 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44  = (Mem*)sqlite3D
9060: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
9070: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b  sizeof(Mem)*n );
9080: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61  .  if( p->aColNa
9090: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
90a0: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
90b0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65   ){.    pColName
90c0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
90d0: 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  ll;.    pColName
90e0: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
90f0: 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20    pColName++;.  
9100: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
9110: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
9120: 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
9130: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
9140: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
9150: 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
9160: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
9170: 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
9180: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
9190: 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
91a0: 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
91b0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
91c0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
91d0: 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70  *.** The final p
91e0: 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20  arameter, xDel, 
91f0: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53  must be one of S
9200: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53  QLITE_DYNAMIC, S
9210: 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20  QLITE_STATIC.** 
9220: 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  or SQLITE_TRANSI
9230: 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51  ENT. If it is SQ
9240: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68  LITE_DYNAMIC, th
9250: 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  en the buffer po
9260: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
9270: 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65  Name will be fre
9280: 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46  ed by sqlite3DbF
9290: 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76  ree() when the v
92a0: 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64  dbe is destroyed
92b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
92c0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a  VdbeSetColName(.
92d0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92f0: 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67     /* Vdbe being
9300: 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20   configured */. 
9310: 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
9320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9330: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
9340: 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69  lumn zName appli
9350: 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76  es to */.  int v
9360: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
9370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9380: 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d  ne of the COLNAM
9390: 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  E_* constants */
93a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
93b0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
93c0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
93d0: 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
93e0: 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f  ing name */.  vo
93f0: 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  id (*xDel)(void*
9400: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
9410: 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  * Memory managem
9420: 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72  ent strategy for
9430: 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69   zName */.){.  i
9440: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
9450: 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
9460: 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
9470: 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
9480: 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
9490: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
94a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
94b0: 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d     assert( !zNam
94c0: 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54  e || xDel!=SQLIT
94d0: 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20  E_DYNAMIC );.   
94e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
94f0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  OMEM;.  }.  asse
9500: 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21  rt( p->aColName!
9510: 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65  =0 );.  pColName
9520: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65   = &(p->aColName
9530: 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73  [idx+var*p->nRes
9540: 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d  Column]);.  rc =
9550: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
9560: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
9570: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
9580: 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20  E_UTF8, xDel);. 
9590: 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c   assert( rc!=0 |
95a0: 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f  | !zName || (pCo
95b0: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d  lName->flags&MEM
95c0: 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72  _Term)!=0 );.  r
95d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
95e0: 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69  ** A read or wri
95f0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
9600: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
9610: 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62   active on datab
9620: 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
9630: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
9640: 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f  on is active, co
9650: 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72  mmit it. If ther
9660: 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d  e is a.** write-
9670: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
9680: 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ning more than o
9690: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
96a0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
96b0: 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  * takes care of 
96c0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
96d0: 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a  al trickery..*/.
96e0: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
96f0: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
9700: 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  b, Vdbe *p){.  i
9710: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61  nt i;.  int nTra
9720: 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62  ns = 0;  /* Numb
9730: 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  er of databases 
9740: 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77  with an active w
9750: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
9760: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
9770: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
9780: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b  needXcommit = 0;
9790: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
97a0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
97b0: 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73  E.  /* With this
97c0: 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33   option, sqlite3
97d0: 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65  VtabSync() is de
97e0: 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70  fined to be simp
97f0: 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  ly .  ** SQLITE_
9800: 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75  OK so p is not u
9810: 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55  sed. .  */.  UNU
9820: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
9830: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  ;.#endif..  /* B
9840: 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
9850: 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20  hing else, call 
9860: 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  the xSync() call
9870: 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a  back for any.  *
9880: 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  * virtual module
9890: 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20   tables written 
98a0: 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
98b0: 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f  ion. This has to
98c0: 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65  .  ** be done be
98d0: 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67  fore determining
98e0: 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65   whether a maste
98f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
9900: 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
9910: 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20  , as an xSync() 
9920: 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64  callback may add
9930: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
9940: 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68  abase.  ** to th
9950: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
9960: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
9970: 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 26  e3VtabSync(db, &
9980: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  p->zErrMsg);.  i
9990: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
99a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
99b0: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  c;.  }..  /* Thi
99c0: 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65  s loop determine
99d0: 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d  s (a) if the com
99e0: 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20  mit hook should 
99f0: 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20  be invoked and. 
9a00: 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79   ** (b) how many
9a10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
9a20: 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20  have open write 
9a30: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f  transactions, no
9a40: 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e  t .  ** includin
9a50: 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  g the temp datab
9a60: 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f  ase. (b) is impo
9a70: 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66  rtant because if
9a80: 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a   more than .  **
9a90: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
9aa0: 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77  le has an open w
9ab0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
9ac0: 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  , a master journ
9ad0: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  al.  ** file is 
9ae0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
9af0: 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20  atomic commit.. 
9b00: 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */ .  for(i=0; 
9b10: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
9b20: 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
9b30: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
9b40: 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
9b50: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
9b60: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
9b70: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a  eedXcommit = 1;.
9b80: 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29        if( i!=1 )
9b90: 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d   nTrans++;.    }
9ba0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
9bb0: 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
9bc0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
9bd0: 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
9be0: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
9bf0: 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
9c00: 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
9c10: 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
9c20: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61   (void)sqlite3Sa
9c30: 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20  fetyOff(db);.   
9c40: 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
9c50: 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
9c60: 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 28  ommitArg);.    (
9c70: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
9c80: 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20 20 69 66  tyOn(db);.    if
9c90: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
9ca0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
9cb0: 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20  TRAINT;.    }.  
9cc0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
9cd0: 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
9ce0: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
9cf0: 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
9d00: 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
9d10: 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
9d20: 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
9d30: 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
9d40: 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
9d50: 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
9d60: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
9d70: 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
9d80: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
9d90: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
9da0: 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
9db0: 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
9dc0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
9dd0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
9de0: 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65  :memory: or a te
9df0: 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20  mp file.  In .  
9e00: 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20  ** that case we 
9e10: 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
9e20: 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
9e30: 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
9e40: 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c   the .  ** simpl
9e50: 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e  e case then too.
9e60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
9e70: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
9e80: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
9e90: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
9ea0: 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54  ].pBt)).   || nT
9eb0: 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20  rans<=1.  ){.   
9ec0: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
9ed0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
9ee0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
9ef0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
9f00: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
9f10: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
9f20: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
9f30: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
9f40: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b  haseOne(pBt, 0);
9f50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
9f60: 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
9f70: 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
9f80: 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
9f90: 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65  ssfully complete
9fa0: 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a   phase 1. .    *
9fb0: 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * If one of the 
9fc0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
9fd0: 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c  One() calls fail
9fe0: 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  s, this indicate
9ff0: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65  s an.    ** IO e
a000: 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74  rror while delet
a010: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
a020: 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  g a journal file
a030: 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79  . It is unlikely
a040: 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75  ,.    ** but cou
a050: 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68  ld happen. In th
a060: 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20  is case abandon 
a070: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
a080: 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e  eturn the error.
a090: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
a0a0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
a0b0: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
a0c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
a0d0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
a0e0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
a0f0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
a100: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
a110: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
a120: 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d  wo(pBt);.      }
a130: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
a140: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
a150: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
a160: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  bCommit(db);.   
a170: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
a180: 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20   complex case - 
a190: 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69  There is a multi
a1a0: 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e  -file write-tran
a1b0: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a  saction active..
a1c0: 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72    ** This requir
a1d0: 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
a1e0: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75  nal file to ensu
a1f0: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
a200: 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69  on is.  ** commi
a210: 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20  tted atomicly.. 
a220: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
a230: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
a240: 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
a250: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
a260: 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  b->pVfs;.    int
a270: 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20   needSync = 0;. 
a280: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
a290: 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
a2a0: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
a2b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
a2c0: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
a2d0: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
a2e0: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
a2f0: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
a300: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
a310: 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
a320: 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
a330: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
a340: 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65  es;..    /* Sele
a350: 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ct a master jour
a360: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  nal file name */
a370: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
a380: 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20  u32 iRandom;.   
a390: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
a3a0: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
a3b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
a3c0: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69  domness(sizeof(i
a3d0: 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f  Random), &iRando
a3e0: 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65  m);.      zMaste
a3f0: 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
a400: 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25 30 38  tf(db, "%s-mj%08
a410: 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 69  X", zMainFile, i
a420: 52 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66  Random&0x7ffffff
a430: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  f);.      if( !z
a440: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
a450: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a460: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
a470: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a480: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
a490: 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
a4a0: 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
a4b0: 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  res);.    }while
a4c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a4d0: 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66  && res );.    if
a4e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a4f0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ){.      /* Open
a500: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
a510: 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  nal. */.      rc
a520: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
a530: 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61  Malloc(pVfs, zMa
a540: 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20  ster, &pMaster, 
a550: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
a560: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
a570: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
a580: 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53  ATE|.          S
a590: 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
a5a0: 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
a5b0: 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c  _MASTER_JOURNAL,
a5c0: 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
a5d0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
a5e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a5f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a600: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
a610: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
a620: 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69    }. .    /* Wri
a630: 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65  te the name of e
a640: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
a650: 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  e in the transac
a660: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65  tion into the ne
a670: 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  w.    ** master 
a680: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
a690: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
a6a0: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63   at this point c
a6b0: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  lose.    ** and 
a6c0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
a6d0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
a6e0: 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75  All the individu
a6f0: 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  al journal files
a700: 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61  .    ** still ha
a710: 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65  ve 'null' as the
a720: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a730: 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79  pointer, so they
a740: 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a   will roll.    *
a750: 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
a760: 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72  ntly if a failur
a770: 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f  e occurs..    */
a780: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
a790: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
a7a0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
a7b0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
a7c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31  ;.      if( i==1
a7d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 2f   ) continue;   /
a7e0: 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 54 45 4d  * Ignore the TEM
a7f0: 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  P database */.  
a800: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
a810: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
a820: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  t) ){.        ch
a830: 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20  ar const *zFile 
a840: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
a850: 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74  tJournalname(pBt
a860: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
a870: 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e  File[0]==0 ) con
a880: 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72  tinue;  /* Ignor
a890: 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62  e :memory: datab
a8a0: 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ases */.        
a8b0: 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26  if( !needSync &&
a8c0: 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79   !sqlite3BtreeSy
a8d0: 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20  ncDisabled(pBt) 
a8e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65  ){.          nee
a8f0: 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
a900: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
a910: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
a920: 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c  (pMaster, zFile,
a930: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
a940: 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65  (zFile)+1, offse
a950: 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  t);.        offs
a960: 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  et += sqlite3Str
a970: 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a  len30(zFile)+1;.
a980: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
a990: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a9a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
a9b0: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
a9c0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
a9d0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
a9e0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
a9f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
aa00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
aa10: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
aa20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
aa30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
aa40: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
aa50: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
aa60: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
aa70: 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
aa80: 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20  L device.    ** 
aa90: 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73  flag is set this
aaa0: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
aab0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
aac0: 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20   needSync .     
aad0: 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73  && 0==(sqlite3Os
aae0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
aaf0: 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53  stics(pMaster)&S
ab00: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
ab10: 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20  ENTIAL).     && 
ab20: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ab30: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
ab40: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53  Master, SQLITE_S
ab50: 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20  YNC_NORMAL)).   
ab60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ab70: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
ab80: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
ab90: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
aba0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
abb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
abc0: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
abd0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
abe0: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
abf0: 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
ac00: 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
ac10: 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
ac20: 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
ac30: 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
ac40: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ac50: 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
ac60: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
ac70: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
ac80: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
ac90: 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
aca0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
acb0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
acc0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
acd0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
ace0: 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
acf0: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
ad00: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
ad10: 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
ad20: 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
ad30: 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
ad40: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
ad50: 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
ad60: 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
ad70: 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
ad80: 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
ad90: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ada0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
adb0: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
adc0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
add0: 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
ade0: 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  e failure occurr
adf0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
ae00: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
ae10: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
ae20: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
ae30: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
ae40: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
ae50: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
ae60: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
ae70: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
ae80: 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73  aseOne(pBt, zMas
ae90: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
aea0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
aeb0: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
aec0: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
aed0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
aee0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
aef0: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
af00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
af10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
af20: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
af30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
af40: 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20  his commits the 
af50: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74  transaction. Aft
af60: 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  er.    ** doing 
af70: 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f  this the directo
af80: 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61  ry is synced aga
af90: 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e  in before any in
afa0: 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20  dividual.    ** 
afb0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65  transaction file
afc0: 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20  s are deleted.. 
afd0: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
afe0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
aff0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29  Vfs, zMaster, 1)
b000: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
b010: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
b020: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
b030: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  0;.    if( rc ){
b040: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
b050: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
b060: 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69  All files and di
b070: 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61  rectories have a
b080: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
b090: 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  ed, so the follo
b0a0: 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  wing.    ** call
b0b0: 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
b0c0: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
b0d0: 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69  ) are only closi
b0e0: 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20  ng files and.   
b0f0: 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20   ** deleting or 
b100: 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e  truncating journ
b110: 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e  als. If somethin
b120: 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69  g goes wrong whi
b130: 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
b140: 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64  s happening we d
b150: 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65  on't really care
b160: 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20  . The integrity 
b170: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  of the.    ** tr
b180: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
b190: 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c  eady guaranteed,
b1a0: 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20   but some stray 
b1b0: 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a  'cold' journals.
b1c0: 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79      ** may be ly
b1d0: 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75  ing around. Retu
b1e0: 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
b1f0: 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d  ode won't help m
b200: 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  atters..    */. 
b210: 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
b220: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
b230: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
b240: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
b250: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
b260: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
b270: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
b280: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
b290: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
b2a0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
b2b0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
b2c0: 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20  haseTwo(pBt);.  
b2d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b2e0: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
b2f0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e  Malloc();.    en
b300: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
b310: 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20  o_errors();..   
b320: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
b330: 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
b340: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
b350: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
b360: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74  routine checks t
b370: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e  hat the sqlite3.
b380: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f  activeVdbeCnt co
b390: 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
b3a0: 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
b3b0: 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
b3c0: 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
b3d0: 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
b3e0: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
b3f0: 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
b400: 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
b410: 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
b420: 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
b430: 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
b440: 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
b450: 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
b460: 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
b470: 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
b480: 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
b490: 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
b4a0: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
b4b0: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
b4c0: 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
b4d0: 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
b4e0: 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
b4f0: 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
b500: 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20  .  int nWrite = 
b510: 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
b520: 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
b530: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67  {.    if( p->mag
b540: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
b550: 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  UN && p->pc>=0 )
b560: 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
b570: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64       if( p->read
b580: 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65  Only==0 ) nWrite
b590: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20  ++;.    }.    p 
b5a0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
b5b0: 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64    assert( cnt==d
b5c0: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
b5d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57   );.  assert( nW
b5e0: 72 69 74 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56  rite==db->writeV
b5f0: 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73  dbeCnt );.}.#els
b600: 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41  e.#define checkA
b610: 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a  ctiveVdbeCnt(x).
b620: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f  #endif../*.** Fo
b630: 72 20 65 76 65 72 79 20 42 74 72 65 65 20 74 68  r every Btree th
b640: 61 74 20 69 6e 20 64 61 74 61 62 61 73 65 20 63  at in database c
b650: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77 68 69  onnection db whi
b660: 63 68 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ch .** has been 
b670: 6d 6f 64 69 66 69 65 64 2c 20 22 74 72 69 70 22  modified, "trip"
b680: 20 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20 65   or invalidate e
b690: 61 63 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a  ach cursor in.**
b6a0: 20 74 68 61 74 20 42 74 72 65 65 20 6d 69 67 68   that Btree migh
b6b0: 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  t have been modi
b6c0: 66 69 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  fied so that the
b6d0: 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e   cursor.** can n
b6e0: 65 76 65 72 20 62 65 20 75 73 65 64 20 61 67 61  ever be used aga
b6f0: 69 6e 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  in.  This happen
b700: 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  s when a rollbac
b710: 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57  k.*** occurs.  W
b720: 65 20 68 61 76 65 20 74 6f 20 74 72 69 70 20 61  e have to trip a
b730: 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 75 72  ll the other cur
b740: 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75  sors, even.** cu
b750: 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72 20  rsor from other 
b760: 56 4d 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74  VMs in different
b770: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
b780: 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61  tions,.** so tha
b790: 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74  t none of them t
b7a0: 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 64 61  ry to use the da
b7b0: 74 61 20 61 74 20 77 68 69 63 68 20 74 68 65 79  ta at which they
b7c0: 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74 69 6e  .** were pointin
b7d0: 67 20 61 6e 64 20 77 68 69 63 68 20 6e 6f 77 20  g and which now 
b7e0: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 68  may have been ch
b7f0: 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20  anged due.** to 
b800: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
b810: 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 61  .** Remember tha
b820: 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e  t a rollback can
b830: 20 64 65 6c 65 74 65 20 74 61 62 6c 65 73 20 63   delete tables c
b840: 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72  omplete and.** r
b850: 65 6f 72 64 65 72 20 72 6f 6f 74 70 61 67 65 73  eorder rootpages
b860: 2e 20 20 53 6f 20 69 74 20 69 73 20 6e 6f 74 20  .  So it is not 
b870: 73 75 66 66 69 63 69 65 6e 74 20 6a 75 73 74 20  sufficient just 
b880: 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65 20 73  to save.** the s
b890: 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73  tate of the curs
b8a0: 6f 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  or.  We have to 
b8b0: 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63  invalidate the c
b8c0: 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74  ursor.** so that
b8d0: 20 69 74 20 69 73 20 6e 65 76 65 72 20 75 73 65   it is never use
b8e0: 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  d again..*/.stat
b8f0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
b900: 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66  teCursorsOnModif
b910: 69 65 64 42 74 72 65 65 73 28 73 71 6c 69 74 65  iedBtrees(sqlite
b920: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
b930: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
b940: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
b950: 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e   Btree *p = db->
b960: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
b970: 69 66 28 20 70 20 26 26 20 73 71 6c 69 74 65 33  if( p && sqlite3
b980: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
b990: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
b9a0: 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
b9b0: 72 73 6f 72 73 28 70 2c 20 53 51 4c 49 54 45 5f  rsors(p, SQLITE_
b9c0: 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20  ABORT);.    }.  
b9d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
b9e0: 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
b9f0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
ba00: 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61  ent opened a sta
ba10: 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
ba20: 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20  on,.** close it 
ba30: 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f  now. Argument eO
ba40: 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  p must be either
ba50: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
ba60: 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f  ACK or.** SAVEPO
ba70: 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20  INT_RELEASE. If 
ba80: 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
ba90: 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74  ROLLBACK, then t
baa0: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
bab0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
bac0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65  olled back. If e
bad0: 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  Op is SAVEPOINT_
bae0: 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68  RELEASE, then th
baf0: 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  e .** statement 
bb00: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
bb10: 6f 6d 6d 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ommtted..**.** I
bb20: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
bb30: 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f  curs, an SQLITE_
bb40: 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
bb50: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
bb60: 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  . .** Otherwise 
bb70: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
bb80: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  t sqlite3VdbeClo
bb90: 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65  seStatement(Vdbe
bba0: 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20   *p, int eOp){. 
bbb0: 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20   sqlite3 *const 
bbc0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
bbd0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bbe0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53  ;..  /* If p->iS
bbf0: 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61  tatement is grea
bc00: 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
bc10: 68 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70  hen this Vdbe op
bc20: 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61  ened a .  ** sta
bc30: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
bc40: 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  on that should b
bc50: 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54  e closed here. T
bc60: 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f  he only exceptio
bc70: 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61  n.  ** is that a
bc80: 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68  n IO error may h
bc90: 61 76 65 20 6f 63 63 75 72 65 64 2c 20 63 61 75  ave occured, cau
bca0: 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63  sing an emergenc
bcb0: 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a  y rollback..  **
bcc0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 64   In this case (d
bcd0: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
bce0: 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ), and there is 
bcf0: 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20  nothing to do.. 
bd00: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53   */.  if( db->nS
bd10: 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69  tatement && p->i
bd20: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
bd30: 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73   int i;.    cons
bd40: 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  t int iSavepoint
bd50: 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74   = p->iStatement
bd60: 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  -1;..    assert(
bd70: 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
bd80: 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d  ROLLBACK || eOp=
bd90: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
bda0: 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  SE);.    assert(
bdb0: 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e   db->nStatement>
bdc0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
bdd0: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d   p->iStatement==
bde0: 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b  (db->nStatement+
bdf0: 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20  db->nSavepoint) 
be00: 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  );..    for(i=0;
be10: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
be20: 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  { .      int rc2
be30: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
be40: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
be50: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
be60: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
be70: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f  {.        if( eO
be80: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
be90: 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
bea0: 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
beb0: 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
bec0: 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Bt, SAVEPOINT_RO
bed0: 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
bee0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
bef0: 20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d         if( rc2==
bf00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bf10: 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
bf20: 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
bf30: 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
bf40: 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
bf50: 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
bf60: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
bf70: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
bf80: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63           rc = rc
bf90: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
bfa0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64     }.    }.    d
bfb0: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b  b->nStatement--;
bfc0: 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  .    p->iStateme
bfd0: 6e 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  nt = 0;.  }.  re
bfe0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
bff0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63  * If SQLite is c
c000: 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f  ompiled to suppo
c010: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
c020: 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74  mode and to be t
c030: 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68  hreadsafe,.** th
c040: 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69  is routine obtai
c050: 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73  ns the mutex ass
c060: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
c070: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
c080: 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79  ture.** that may
c090: 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20   be accessed by 
c0a0: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
c0b0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e   an argument. In
c0c0: 20 64 6f 69 6e 67 20 73 6f 20 69 74 0a 2a 2a 20   doing so it.** 
c0d0: 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65  sets the BtShare
c0e0: 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65  d.db member of e
c0f0: 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61  ach of the BtSha
c100: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20  red structures, 
c110: 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74  ensuring.** that
c120: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73   the correct bus
c130: 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
c140: 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66  ck is invoked if
c150: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a   required..**.**
c160: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f   If SQLite is no
c170: 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74  t threadsafe but
c180: 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68   does support sh
c190: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c  ared-cache mode,
c1a0: 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33   then.** sqlite3
c1b0: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 29 20  BtreeEnterAll() 
c1c0: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  is invoked to se
c1d0: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  t the BtShared.d
c1e0: 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f  b variables.** o
c1f0: 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65  f all of BtShare
c200: 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63  d structures acc
c210: 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20  essible via the 
c220: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
c230: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
c240: 69 74 68 20 74 68 65 20 56 4d 2e 20 4f 66 20 63  ith the VM. Of c
c250: 6f 75 72 73 65 20 6f 6e 6c 79 20 61 20 73 75 62  ourse only a sub
c260: 73 65 74 20 6f 66 20 74 68 65 73 65 20 73 74 72  set of these str
c270: 75 63 74 75 72 65 73 0a 2a 2a 20 77 69 6c 6c 20  uctures.** will 
c280: 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74  be accessed by t
c290: 68 65 20 56 4d 2c 20 61 6e 64 20 77 65 20 63 6f  he VM, and we co
c2a0: 75 6c 64 20 75 73 65 20 56 64 62 65 2e 62 74 72  uld use Vdbe.btr
c2b0: 65 65 4d 61 73 6b 20 74 6f 20 66 69 67 75 72 65  eeMask to figure
c2c0: 0a 2a 2a 20 74 68 61 74 20 73 75 62 73 65 74 20  .** that subset 
c2d0: 6f 75 74 2c 20 62 75 74 20 74 68 65 72 65 20 69  out, but there i
c2e0: 73 20 6e 6f 20 61 64 76 61 6e 74 61 67 65 20 74  s no advantage t
c2f0: 6f 20 64 6f 69 6e 67 20 73 6f 2e 0a 2a 2a 0a 2a  o doing so..**.*
c300: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
c310: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e  ot threadsafe an
c320: 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  d does not suppo
c330: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
c340: 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75  mode, this.** fu
c350: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
c360: 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  p..*/.#ifndef SQ
c370: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
c380: 5f 43 41 43 48 45 0a 76 6f 69 64 20 73 71 6c 69  _CACHE.void sqli
c390: 74 65 33 56 64 62 65 4d 75 74 65 78 41 72 72 61  te3VdbeMutexArra
c3a0: 79 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b  yEnter(Vdbe *p){
c3b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
c3c0: 41 44 53 41 46 45 0a 20 20 73 71 6c 69 74 65 33  ADSAFE.  sqlite3
c3d0: 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 45  BtreeMutexArrayE
c3e0: 6e 74 65 72 28 26 70 2d 3e 61 4d 75 74 65 78 29  nter(&p->aMutex)
c3f0: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
c400: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 70  3BtreeEnterAll(p
c410: 2d 3e 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  ->db);.#endif.}.
c420: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
c430: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
c440: 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20  lled the when a 
c450: 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61  VDBE tries to ha
c460: 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45  lt.  If the VDBE
c470: 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61  .** has made cha
c480: 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nges and is in a
c490: 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20  utocommit mode, 
c4a0: 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73  then commit thos
c4b0: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49  e.** changes.  I
c4c0: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  f a rollback is 
c4d0: 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20  needed, then do 
c4e0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
c4f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c500: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
c510: 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61   to move the sta
c520: 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a  te of a VM from.
c530: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  ** SQLITE_MAGIC_
c540: 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41  RUN to SQLITE_MA
c550: 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73  GIC_HALT.  It is
c560: 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20   harmless to.** 
c570: 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56  call this on a V
c580: 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  M that is in the
c590: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
c5a0: 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  LT state..**.** 
c5b0: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
c5c0: 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f  code.  If the co
c5d0: 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63  mmit could not c
c5e0: 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
c5f0: 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65  of.** lock conte
c600: 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51  ntion, return SQ
c610: 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53  LITE_BUSY.  If S
c620: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
c630: 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65  turned, it.** me
c640: 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69  ans the close di
c650: 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64  d not happen and
c660: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70   needs to be rep
c670: 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eated..*/.int sq
c680: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64  lite3VdbeHalt(Vd
c690: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
c6a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c6b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
c6c0: 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73  d to store trans
c6d0: 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65  ient return code
c6e0: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
c6f0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
c700: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c710: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67  contains the log
c720: 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  ic that determin
c730: 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e  es if a statemen
c740: 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61  t or.  ** transa
c750: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f  ction will be co
c760: 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
c770: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
c780: 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65  lt of the.  ** e
c790: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73  xecution of this
c7a0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
c7b0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  . .  **.  ** If 
c7c0: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
c7d0: 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75  wing errors occu
c7e0: 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  r:.  **.  **    
c7f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20   SQLITE_NOMEM.  
c800: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f  **     SQLITE_IO
c810: 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ERR.  **     SQL
c820: 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20  ITE_FULL.  **   
c830: 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55    SQLITE_INTERRU
c840: 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  PT.  **.  ** The
c850: 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  n the internal c
c860: 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20  ache might have 
c870: 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20  been left in an 
c880: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a  inconsistent.  *
c890: 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65  * state.  We nee
c8a0: 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  d to rollback th
c8b0: 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
c8c0: 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72  saction, if ther
c8d0: 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f  e is.  ** one, o
c8e0: 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
c8f0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68  ransaction if th
c900: 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d  ere is no statem
c910: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
c920: 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e  .  */..  if( p->
c930: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c940: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
c950: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c960: 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  }.  closeAllCurs
c970: 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ors(p);.  if( p-
c980: 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
c990: 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65  IC_RUN ){.    re
c9a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c9b0: 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76    }.  checkActiv
c9c0: 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
c9d0: 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
c9e0: 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
c9f0: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
ca00: 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f  never started */
ca10: 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
ca20: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20  ){.    int mrc; 
ca30: 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72    /* Primary err
ca40: 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e  or code from p->
ca50: 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53  rc */.    int eS
ca60: 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a  tatementOp = 0;.
ca70: 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61      int isSpecia
ca80: 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
ca90: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
caa0: 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27  e if a 'special'
cab0: 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f   error */..    /
cac0: 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65  * Lock all btree
cad0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74  s used by the st
cae0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73  atement */.    s
caf0: 71 6c 69 74 65 33 56 64 62 65 4d 75 74 65 78 41  qlite3VdbeMutexA
cb00: 72 72 61 79 45 6e 74 65 72 28 70 29 3b 0a 0a 20  rrayEnter(p);.. 
cb10: 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
cb20: 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
cb30: 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  al errors */.   
cb40: 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30   mrc = p->rc & 0
cb50: 78 66 66 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xff;.    assert(
cb60: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49   p->rc!=SQLITE_I
cb70: 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20  OERR_BLOCKED ); 
cb80: 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 6e   /* This error n
cb90: 6f 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73 20  o longer exists 
cba0: 2a 2f 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c  */.    isSpecial
cbb0: 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c  Error = mrc==SQL
cbc0: 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
cbd0: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbf0: 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49      || mrc==SQLI
cc00: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20  TE_INTERRUPT || 
cc10: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
cc20: 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63  ;.    if( isSpec
cc30: 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ialError ){.    
cc40: 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
cc50: 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c  y was read-only,
cc60: 20 77 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72   we need do no r
cc70: 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20  ollback at all. 
cc80: 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20  Otherwise,.     
cc90: 20 2a 2a 20 70 72 6f 63 65 65 64 20 77 69 74 68   ** proceed with
cca0: 20 74 68 65 20 73 70 65 63 69 61 6c 20 68 61 6e   the special han
ccb0: 64 6c 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  dling..      */.
ccc0: 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65        if( !p->re
ccd0: 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53  adOnly || mrc!=S
cce0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
ccf0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
cd00: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
cd10: 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
cd20: 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65  _FULL) && p->use
cd30: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  sStmtJournal ){.
cd40: 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
cd50: 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
cd60: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
cd70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cd80: 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
cd90: 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62  forced to roll b
cda0: 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74  ack the active t
cdb0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f  ransaction. Befo
cdc0: 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20  re doing.       
cdd0: 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20     ** so, abort 
cde0: 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d  any other statem
cdf0: 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65  ents this handle
ce00: 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
ce10: 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20  ctive..         
ce20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
ce30: 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
ce40: 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
ce50: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  db);.          s
ce60: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
ce70: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  l(db);.         
ce80: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
ce90: 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
cea0: 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
ceb0: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
cec0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ced0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
cee0: 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  the auto-commit 
cef0: 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
cf00: 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  this is the only
cf10: 20 61 63 74 69 76 65 20 77 72 69 74 65 72 20 0a   active writer .
cf20: 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20      ** VM, then 
cf30: 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63  we do either a c
cf40: 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63  ommit or rollbac
cf50: 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  k of the current
cf60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20   transaction. . 
cf70: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
cf80: 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c  e: This block al
cf90: 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f  so runs if one o
cfa0: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
cfb0: 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20  rors handled .  
cfc0: 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f    ** above has o
cfd0: 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f  ccurred. .    */
cfe0: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
cff0: 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20  3VtabInSync(db) 
d000: 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74  .     && db->aut
d010: 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26  oCommit .     &&
d020: 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e   db->writeVdbeCn
d030: 74 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  t==(p->readOnly=
d040: 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  =0) .    ){.    
d050: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
d060: 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72  ITE_OK || (p->er
d070: 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
d080: 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c  il && !isSpecial
d090: 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  Error) ){.      
d0a0: 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f    /* The auto-co
d0b0: 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75  mmit flag is tru
d0c0: 65 2c 20 61 6e 64 20 74 68 65 20 76 64 62 65 20  e, and the vdbe 
d0d0: 70 72 6f 67 72 61 6d 20 77 61 73 20 0a 20 20 20  program was .   
d0e0: 20 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66       ** successf
d0f0: 75 6c 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52  ul or hit an 'OR
d100: 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e   FAIL' constrain
d110: 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  t. This means a 
d120: 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20  commit .        
d130: 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ** is required..
d140: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
d150: 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d     rc = vdbeComm
d160: 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  it(db, p);.     
d170: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d180: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
d190: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
d1a0: 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28  MutexArrayLeave(
d1b0: 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 20  &p->aMutex);.   
d1c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
d1d0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
d1e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
d1f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d200: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
d210: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
d220: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
d230: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  (db);.        }e
d240: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
d250: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
d260: 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b  rnalChanges(db);
d270: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d280: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d290: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
d2a0: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  ll(db);.      }.
d2b0: 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65        db->nState
d2c0: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ment = 0;.    }e
d2d0: 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65  lse if( eStateme
d2e0: 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ntOp==0 ){.     
d2f0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
d300: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f  TE_OK || p->erro
d310: 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
d320: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
d330: 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
d340: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20  OINT_RELEASE;.  
d350: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
d360: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
d370: 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
d380: 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
d390: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
d3a0: 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ACK;.      }else
d3b0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69  {.        invali
d3c0: 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64  dateCursorsOnMod
d3d0: 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29 3b  ifiedBtrees(db);
d3e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d3f0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
d400: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d410: 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
d420: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
d430: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
d440: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d450: 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61   .    /* If eSta
d460: 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d  tementOp is non-
d470: 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61  zero, then a sta
d480: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
d490: 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  on needs to.    
d4a0: 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ** be committed 
d4b0: 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  or rolled back. 
d4c0: 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  Call sqlite3Vdbe
d4d0: 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29  CloseStatement()
d4e0: 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f   to.    ** do so
d4f0: 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74  . If this operat
d500: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ion returns an e
d510: 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75  rror, and the cu
d520: 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a  rrent statement.
d530: 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64      ** error cod
d540: 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  e is SQLITE_OK o
d550: 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  r SQLITE_CONSTRA
d560: 49 4e 54 2c 20 74 68 65 6e 20 73 65 74 20 74 68  INT, then set th
d570: 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63  e error.    ** c
d580: 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77 20 76  ode to the new v
d590: 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  alue..    */.   
d5a0: 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
d5b0: 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  p ){.      rc = 
d5c0: 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
d5d0: 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74  Statement(p, eSt
d5e0: 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20  atementOp);.    
d5f0: 20 20 69 66 28 20 72 63 20 26 26 20 28 70 2d 3e    if( rc && (p->
d600: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
d610: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43   p->rc==SQLITE_C
d620: 4f 4e 53 54 52 41 49 4e 54 29 20 29 7b 0a 20 20  ONSTRAINT) ){.  
d630: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
d640: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d650: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
d660: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
d670: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
d680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d690: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
d6a0: 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
d6b0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
d6c0: 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e   and no statemen
d6d0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  t transaction.  
d6e0: 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f    ** has been ro
d6f0: 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74  lled back, updat
d700: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  e the database c
d710: 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65  onnection change
d720: 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a  -counter. .    *
d730: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61  /.    if( p->cha
d740: 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20  ngeCntOn ){.    
d750: 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
d760: 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op!=SAVEPOINT_RO
d770: 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
d780: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d790: 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
d7a0: 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d  Change);.      }
d7b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
d7c0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
d7d0: 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ges(db, 0);.    
d7e0: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68    }.      p->nCh
d7f0: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ange = 0;.    }.
d800: 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61    .    /* Rollba
d810: 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79  ck or commit any
d820: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
d830: 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e 20 2a  that occurred. *
d840: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21  /.    if( p->rc!
d850: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62  =SQLITE_OK && db
d860: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49  ->flags&SQLITE_I
d870: 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a  nternChanges ){.
d880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73        sqlite3Res
d890: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
d8a0: 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 64  (db, 0);.      d
d8b0: 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e  b->flags = (db->
d8c0: 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49  flags | SQLITE_I
d8d0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20  nternChanges);. 
d8e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
d8f0: 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a  ease the locks *
d900: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
d910: 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76  eeMutexArrayLeav
d920: 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20  e(&p->aMutex);. 
d930: 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65   }..  /* We have
d940: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61   successfully ha
d950: 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20  lted and closed 
d960: 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20  the VM.  Record 
d970: 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
d980: 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
d990: 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64      db->activeVd
d9a0: 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28  beCnt--;.    if(
d9b0: 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b   !p->readOnly ){
d9c0: 0a 20 20 20 20 20 20 64 62 2d 3e 77 72 69 74 65  .      db->write
d9d0: 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d  VdbeCnt--;.    }
d9e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
d9f0: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 3d  >activeVdbeCnt>=
da00: 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
da10: 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67   );.  }.  p->mag
da20: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
da30: 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74  HALT;.  checkAct
da40: 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
da50: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
da60: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
da70: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
da80: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
da90: 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
daa0: 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
dab0: 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  to true, then an
dac0: 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72  y locks that wer
dad0: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63  e held.  ** by c
dae0: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76  onnection db hav
daf0: 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61  e now been relea
db00: 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  sed. Call sqlite
db10: 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
db20: 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69  ked() .  ** to i
db30: 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72  nvoke any requir
db40: 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  ed unlock-notify
db50: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f   callbacks..  */
db60: 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43  .  if( db->autoC
db70: 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  ommit ){.    sql
db80: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
db90: 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a  locked(db);.  }.
dba0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61  .  assert( db->a
dbb0: 63 74 69 76 65 56 64 62 65 43 6e 74 3e 30 20 7c  ctiveVdbeCnt>0 |
dbc0: 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  | db->autoCommit
dbd0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74  ==0 || db->nStat
dbe0: 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65  ement==0 );.  re
dbf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dc00: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56  }.../*.** Each V
dc10: 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65  DBE holds the re
dc20: 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  sult of the most
dc30: 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
dc40: 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69  step() call.** i
dc50: 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72  n p->rc.  This r
dc60: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74  outine sets that
dc70: 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20   result back to 
dc80: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f  SQLITE_OK..*/.vo
dc90: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
dca0: 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64  setStepResult(Vd
dcb0: 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20  be *p){.  p->rc 
dcc0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  = SQLITE_OK;.}..
dcd0: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
dce0: 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
dcf0: 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74  ution but do not
dd00: 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45   delete the VDBE
dd10: 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72   just yet..** Wr
dd20: 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
dd30: 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45  ssages into *pzE
dd40: 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74  rrMsg.  Return t
dd50: 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  he result code..
dd60: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  **.** After this
dd70: 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c   routine is run,
dd80: 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64   the VDBE should
dd90: 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20   be ready to be 
dda0: 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69  executed.** agai
ddb0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b  n..**.** To look
ddc0: 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77   at it another w
ddd0: 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ay, this routine
dde0: 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74   resets the stat
ddf0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74  e of the.** virt
de00: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d  ual machine from
de10: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
de20: 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  or VDBE_MAGIC_HA
de30: 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44  LT back to.** VD
de40: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a  BE_MAGIC_INIT..*
de50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
de60: 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b  eReset(Vdbe *p){
de70: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
de80: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20    db = p->db;.. 
de90: 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69   /* If the VM di
dea0: 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d  d not run to com
deb0: 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74  pletion or if it
dec0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a   encountered an.
ded0: 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e    ** error, then
dee0: 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61   it might not ha
def0: 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70  ve been halted p
df00: 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c  roperly.  So hal
df10: 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20  t.  ** it now.. 
df20: 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69   */.  (void)sqli
df30: 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b  te3SafetyOn(db);
df40: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  .  sqlite3VdbeHa
df50: 6c 74 28 70 29 3b 0a 20 20 28 76 6f 69 64 29 73  lt(p);.  (void)s
df60: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
df70: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  db);..  /* If th
df80: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
df90: 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
dfa0: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
dfb0: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
dfc0: 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
dfd0: 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
dfe0: 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
dff0: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
e000: 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
e010: 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
e020: 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
e030: 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
e040: 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
e050: 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
e060: 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
e070: 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
e080: 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
e090: 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
e0a0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
e0b0: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  >pc>=0 ){.    if
e0c0: 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
e0d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
e0e0: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
e0f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e100: 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
e110: 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73  Err,-1,p->zErrMs
e120: 67 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51  g,SQLITE_UTF8,SQ
e130: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
e140: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
e150: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
e160: 0a 20 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f  .      db->errCo
e170: 64 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20  de = p->rc;.    
e180: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e190: 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
e1a0: 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  .      p->zErrMs
e1b0: 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
e1c0: 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20   if( p->rc ){.  
e1d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e1e0: 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a  (db, p->rc, 0);.
e1f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e200: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
e210: 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
e220: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
e230: 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65  f( p->rc && p->e
e240: 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a  xpired ){.    /*
e250: 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61   The expired fla
e260: 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65  g was set on the
e270: 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65   VDBE before the
e280: 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20   first call.    
e290: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ** to sqlite3_st
e2a0: 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73  ep(). For consis
e2b0: 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c  tency (since sql
e2c0: 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a  ite3_step() was.
e2d0: 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20      ** called), 
e2e0: 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
e2f0: 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63   error in this c
e300: 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20  ase as well..   
e310: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
e320: 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20  rror(db, p->rc, 
e330: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
e340: 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
e350: 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72  Err, -1, p->zErr
e360: 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Msg, SQLITE_UTF8
e370: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
e380: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
e390: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
e3a0: 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
e3b0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
e3c0: 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c  .  /* Reclaim al
e3d0: 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
e3e0: 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20   the VDBE.  */. 
e3f0: 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20   Cleanup(p);..  
e400: 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
e410: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
e420: 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
e430: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44  ..  */.#ifdef VD
e440: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
e450: 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66     FILE *out = f
e460: 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69  open("vdbe_profi
e470: 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20  le.out", "a");. 
e480: 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20     if( out ){.  
e490: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
e4a0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
e4b0: 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f  --- ");.      fo
e4c0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
e4d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
e4e0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32  printf(out, "%02
e4f0: 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70  x", p->aOp[i].op
e500: 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  code);.      }. 
e510: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
e520: 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66  , "\n");.      f
e530: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
e540: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
e550: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36  fprintf(out, "%6
e560: 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22  d %10lld %8lld "
e570: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
e580: 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20  aOp[i].cnt,.    
e590: 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
e5a0: 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20  .cycles,.       
e5b0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
e5c0: 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e  t>0 ? p->aOp[i].
e5d0: 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d  cycles/p->aOp[i]
e5e0: 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20  .cnt : 0.       
e5f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
e600: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f  te3VdbePrintOp(o
e610: 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
e620: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
e630: 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
e640: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
e650: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
e660: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20  E_MAGIC_INIT;.  
e670: 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64  return p->rc & d
e680: 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a  b->errMask;.}. .
e690: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
e6a0: 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45  nd delete a VDBE
e6b0: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
e6c0: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
e6d0: 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a  eger which is.**
e6e0: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
e6f0: 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  .  Write any err
e700: 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
e710: 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a  into *pzErrMsg..
e720: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
e730: 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20  beFinalize(Vdbe 
e740: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
e750: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
e760: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
e770: 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e  MAGIC_RUN || p->
e780: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
e790: 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63  C_HALT ){.    rc
e7a0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
e7b0: 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65  set(p);.    asse
e7c0: 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d  rt( (rc & p->db-
e7d0: 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b  >errMask)==rc );
e7e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
e7f0: 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72  beDelete(p);.  r
e800: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
e810: 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74  ** Call the dest
e820: 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20  ructor for each 
e830: 61 75 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e  auxdata entry in
e840: 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77   pVdbeFunc for w
e850: 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72  hich.** the corr
e860: 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
e870: 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20   mask is clear. 
e880: 20 41 75 78 64 61 74 61 20 65 6e 74 72 69 65 73   Auxdata entries
e890: 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72   beyond 31.** ar
e8a0: 65 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79  e always destroy
e8b0: 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20  ed.  To destroy 
e8c0: 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72  all auxdata entr
e8d0: 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a  ies, call this.*
e8e0: 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d  * routine with m
e8f0: 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20  ask==0..*/.void 
e900: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
e910: 65 41 75 78 44 61 74 61 28 56 64 62 65 46 75 6e  eAuxData(VdbeFun
e920: 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e  c *pVdbeFunc, in
e930: 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69  t mask){.  int i
e940: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
e950: 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20  VdbeFunc->nAux; 
e960: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
e970: 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d   AuxData *pAux =
e980: 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41   &pVdbeFunc->apA
e990: 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28  ux[i];.    if( (
e9a0: 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28  i>31 || !(mask&(
e9b0: 28 28 75 33 32 29 31 29 3c 3c 69 29 29 29 20 26  ((u32)1)<<i))) &
e9c0: 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a  & pAux->pAux ){.
e9d0: 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e        if( pAux->
e9e0: 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  xDelete ){.     
e9f0: 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65     pAux->xDelete
ea00: 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20  (pAux->pAux);.  
ea10: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78      }.      pAux
ea20: 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20  ->pAux = 0;.    
ea30: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
ea40: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
ea50: 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VDBE..*/.void sq
ea60: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
ea70: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
ea80: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
ea90: 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  ;..  if( NEVER(p
eaa0: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ==0) ) return;. 
eab0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69   db = p->db;.  i
eac0: 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
ead0: 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
eae0: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
eaf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
eb00: 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
eb10: 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
eb20: 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
eb30: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
eb40: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
eb50: 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
eb60: 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ev;.  }.  if( p-
eb70: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a  >aOp ){.    Op *
eb80: 70 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20  pOp = p->aOp;.  
eb90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
eba0: 6e 4f 70 3b 20 69 2b 2b 2c 20 70 4f 70 2b 2b 29  nOp; i++, pOp++)
ebb0: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64  {.      freeP4(d
ebc0: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
ebd0: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64  pOp->p4.p);.#ifd
ebe0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
ebf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
ec00: 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f  ree(db, pOp->zCo
ec10: 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20  mment);.#endif  
ec20: 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20     .    }.  }.  
ec30: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
ec40: 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
ec50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
ec60: 65 65 28 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c  ee(db, p->aLabel
ec70: 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
ec80: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
ec90: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
eca0: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
ecb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
ecc0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
ecd0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
ece0: 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d  , p->zSql);.  p-
ecf0: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
ed00: 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69  GIC_DEAD;.  sqli
ed10: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
ed20: 3e 61 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  >aOp);.  sqlite3
ed30: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46  DbFree(db, p->pF
ed40: 72 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ree);.  sqlite3D
ed50: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
ed60: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
ed70: 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73   the cursor p is
ed80: 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f   ready to read o
ed90: 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20  r write the row 
eda0: 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77  to which it.** w
edb0: 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e  as last position
edc0: 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ed.  Return an e
edd0: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
ede0: 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f  OOM fault or I/O
edf0: 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e   error.** preven
ee00: 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74  ts us from posit
ee10: 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  ioning the curso
ee20: 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74  r to its correct
ee30: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   position..**.**
ee40: 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65   If a MoveTo ope
ee50: 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e  ration is pendin
ee60: 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63  g on the given c
ee70: 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74  ursor, then do t
ee80: 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f  hat.** MoveTo no
ee90: 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69  w.  If no move i
eea0: 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b  s pending, check
eeb0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
eec0: 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64  ow has been.** d
eed0: 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
eee0: 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
eef0: 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20   and if it has, 
ef00: 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a  mark the row as.
ef10: 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  ** a NULL row..*
ef20: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73  *.** If the curs
ef30: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
ef40: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f  inting to the co
ef50: 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68  rrect row and th
ef60: 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f  at row has.** no
ef70: 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f  t been deleted o
ef80: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
ef90: 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74  e cursor, then t
efa0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
efb0: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
efc0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
efd0: 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f  Moveto(VdbeCurso
efe0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
eff0: 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29  deferredMoveto )
f000: 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72  {.    int res, r
f010: 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  c;.#ifdef SQLITE
f020: 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e  _TEST.    extern
f030: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
f040: 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69  rch_count;.#endi
f050: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  f.    assert( p-
f060: 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  >isTable );.    
f070: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
f080: 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
f090: 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70  p->pCursor, 0, p
f0a0: 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20  ->movetoTarget, 
f0b0: 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66  0, &res);.    if
f0c0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
f0d0: 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77  ;.    p->lastRow
f0e0: 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  id = p->movetoTa
f0f0: 72 67 65 74 3b 0a 20 20 20 20 70 2d 3e 72 6f 77  rget;.    p->row
f100: 69 64 49 73 56 61 6c 69 64 20 3d 20 41 4c 57 41  idIsValid = ALWA
f110: 59 53 28 72 65 73 3d 3d 30 29 20 3f 31 3a 30 3b  YS(res==0) ?1:0;
f120: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 72  .    if( NEVER(r
f130: 65 73 3c 30 29 20 29 7b 0a 20 20 20 20 20 20 72  es<0) ){.      r
f140: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
f150: 4e 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c  Next(p->pCursor,
f160: 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66   &res);.      if
f170: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
f180: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
f190: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73  QLITE_TEST.    s
f1a0: 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
f1b0: 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
f1c0: 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
f1d0: 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  eto = 0;.    p->
f1e0: 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
f1f0: 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c  CHE_STALE;.  }el
f200: 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 2d  se if( ALWAYS(p-
f210: 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  >pCursor) ){.   
f220: 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20   int hasMoved;. 
f230: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
f240: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
f250: 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f  sMoved(p->pCurso
f260: 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20  r, &hasMoved);. 
f270: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
f280: 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68  rn rc;.    if( h
f290: 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20  asMoved ){.     
f2a0: 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
f2b0: 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
f2c0: 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20       p->nullRow 
f2d0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
f2e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f2f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
f300: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
f310: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ons:.**.** sqlit
f320: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
f330: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
f340: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
f350: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
f360: 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
f370: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
f380: 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  ut().** sqlite3V
f390: 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a  dbeSerialGet().*
f3a0: 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65  *.** encapsulate
f3b0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
f3c0: 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73  erializes values
f3d0: 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20   for storage in 
f3e0: 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61  SQLite.** data a
f3f0: 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  nd index records
f400: 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65  . Each serialize
f410: 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73  d value consists
f420: 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c   of a.** 'serial
f430: 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f  -type' and a blo
f440: 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73  b of data. The s
f450: 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e  erial type is an
f460: 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   8-byte unsigned
f470: 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f  .** integer, sto
f480: 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e  red as a varint.
f490: 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c  .**.** In an SQL
f4a0: 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ite index record
f4b0: 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  , the serial typ
f4c0: 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65  e is stored dire
f4d0: 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74  ctly before.** t
f4e0: 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  he blob of data 
f4f0: 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f  that it correspo
f500: 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62  nds to. In a tab
f510: 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73  le record, all s
f520: 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61  erial.** types a
f530: 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  re stored at the
f540: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65   start of the re
f550: 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c  cord, and the bl
f560: 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a  obs of data at.*
f570: 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65  * the end. Hence
f580: 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73   these functions
f590: 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65   allow the calle
f5a0: 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a  r to handle the.
f5b0: 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61  ** serial-type a
f5c0: 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70  nd data blob sep
f5d0: 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  erately..**.** T
f5e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
f5f0: 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
f600: 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65   various storage
f610: 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74   classes for dat
f620: 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61  a:.**.**   seria
f630: 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79  l type        by
f640: 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20  tes of data     
f650: 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d   type.**   -----
f660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
f670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
f680: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
f690: 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20  .**      0      
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
f6b0: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
f6c0: 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20  .**      1      
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
f6f0: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
f700: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
f710: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
f720: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
f730: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20  eger.**      3  
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f750: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
f760: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
f770: 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20  *      4        
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20               4  
f790: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
f7a0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
f7b0: 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20   5              
f7c0: 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20         6        
f7d0: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
f7e0: 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20  er.**      6    
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f800: 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69   8            si
f810: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
f820: 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20       7          
f830: 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
f840: 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f          IEEE flo
f850: 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20  at.**      8    
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f870: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
f880: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30  teger constant 0
f890: 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20  .**      9      
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
f8c0: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a  ger constant 1.*
f8d0: 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20  *     10,11     
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8f0: 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76            reserv
f900: 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e  ed for expansion
f910: 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64  .**    N>=12 and
f920: 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31   even       (N-1
f930: 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42  2)/2        BLOB
f940: 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64  .**    N>=13 and
f950: 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31   odd        (N-1
f960: 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74  3)/2        text
f970: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64  .**.** The 8 and
f980: 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64   9 types were ad
f990: 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69  ded in 3.3.0, fi
f9a0: 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72  le format 4.  Pr
f9b0: 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  ior versions.** 
f9c0: 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  of SQLite will n
f9d0: 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  ot understand th
f9e0: 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  ose serial types
f9f0: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
fa00: 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79  rn the serial-ty
fa10: 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  pe for the value
fa20: 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e   stored in pMem.
fa30: 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
fa40: 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65  dbeSerialType(Me
fa50: 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
fa60: 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74  e_format){.  int
fa70: 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
fa80: 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  lags;.  int n;..
fa90: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
faa0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
fab0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
fac0: 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
fad0: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
fae0: 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73  ut whether to us
faf0: 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20  e 1, 2, 4, 6 or 
fb00: 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20  8 bytes. */.#   
fb10: 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45  define MAX_6BYTE
fb20: 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38   ((((i64)0x00008
fb30: 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20  000)<<32)-1).   
fb40: 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75   i64 i = pMem->u
fb50: 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20  .i;.    u64 u;. 
fb60: 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d     if( file_form
fb70: 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d  at>=4 && (i&1)==
fb80: 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  i ){.      retur
fb90: 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20 20 20 20  n 8+(u32)i;.    
fba0: 7d 0a 20 20 20 20 75 20 3d 20 69 3c 30 20 3f 20  }.    u = i<0 ? 
fbb0: 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69 66 28 20  -i : i;.    if( 
fbc0: 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20  u<=127 ) return 
fbd0: 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32  1;.    if( u<=32
fbe0: 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  767 ) return 2;.
fbf0: 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36      if( u<=83886
fc00: 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20  07 ) return 3;. 
fc10: 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38     if( u<=214748
fc20: 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b  3647 ) return 4;
fc30: 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f  .    if( u<=MAX_
fc40: 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35  6BYTE ) return 5
fc50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
fc60: 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
fc70: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
fc80: 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20  return 7;.  }.  
fc90: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
fca0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
fcb0: 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72  | flags&(MEM_Str
fcc0: 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20  |MEM_Blob) );.  
fcd0: 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69  n = pMem->n;.  i
fce0: 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  f( flags & MEM_Z
fcf0: 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ero ){.    n += 
fd00: 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pMem->u.nZero;. 
fd10: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d   }.  assert( n>=
fd20: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  0 );.  return ((
fd30: 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c  n*2) + 12 + ((fl
fd40: 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29  ags&MEM_Str)!=0)
fd50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
fd60: 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
fd70: 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73   the data corres
fd80: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73  ponding to the s
fd90: 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74  upplied serial-t
fda0: 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  ype..*/.u32 sqli
fdb0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
fdc0: 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f  eLen(u32 serial_
fdd0: 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72  type){.  if( ser
fde0: 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
fdf0: 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
fe00: 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
fe10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74   }else{.    stat
fe20: 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a  ic const u8 aSiz
fe30: 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c  e[] = { 0, 1, 2,
fe40: 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20   3, 4, 6, 8, 8, 
fe50: 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
fe60: 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73    return aSize[s
fe70: 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d  erial_type];.  }
fe80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  .}../*.** If we 
fe90: 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74  are on an archit
fea0: 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65  ecture with mixe
feb0: 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e  d-endian floatin
fec0: 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78  g .** points (ex
fed0: 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61  : ARM7) then swa
fee0: 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79  p the lower 4 by
fef0: 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  tes with the .**
ff00: 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20   upper 4 bytes. 
ff10: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
ff20: 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f  lt..**.** For mo
ff30: 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73  st architectures
ff40: 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
ff50: 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29  p..**.** (later)
ff60: 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  :  It is reporte
ff70: 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65  d to me that the
ff80: 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72   mixed-endian pr
ff90: 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37  oblem.** on ARM7
ffa0: 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74   is an issue wit
ffb0: 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20  h GCC, not with 
ffc0: 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20  the ARM7 chip.  
ffd0: 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74  It seems.** that
ffe0: 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20   early versions 
fff0: 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68  of GCC stored th
10000 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61  e two words of a
10010 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74   64-bit.** float
10020 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72   in the wrong or
10030 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65  der.  And that e
10040 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
10050 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72  opagated.** ever
10060 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61   since.  The bla
10070 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  me is not necess
10080 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20  arily with GCC, 
10090 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d  though..** GCC m
100a0 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63  ight have just c
100b0 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  opying the probl
100c0 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  em from a prior 
100d0 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61  compiler..** I a
100e0 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74  m also told that
100f0 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
10100 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c  of GCC that foll
10110 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ow a different.*
10120 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79  * ABI get the by
10130 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a  te order right..
10140 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73  **.** Developers
10150 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e   using SQLite on
10160 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20   an ARM7 should 
10170 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20  compile and run 
10180 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61  their.** applica
10190 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c  tion using -DSQL
101a0 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c  ITE_DEBUG=1 at l
101b0 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68  east once.  With
101c0 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65   DEBUG.** enable
101d0 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20  d, some asserts 
101e0 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72  below will ensur
101f0 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20  e that the byte 
10200 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61  order of.** floa
10210 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
10220 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a  s is correct..**
10230 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29  .** (2007-08-30)
10240 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74    Frank van Vugt
10250 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69   has studied thi
10260 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c  s problem closel
10270 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e  y.** and has sen
10280 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74  d his findings t
10290 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76  o the SQLite dev
102a0 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a  elopers.  Frank.
102b0 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73  ** writes that s
102c0 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c  ome Linux kernel
102d0 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67  s offer floating
102e0 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a   point hardware.
102f0 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61  ** emulation tha
10300 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62  t uses only 32-b
10310 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73  it mantissas ins
10320 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a  tead of a full .
10330 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65  ** 48-bits as re
10340 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45  quired by the IE
10350 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54  EE standard.  (T
10360 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f  his is the.** CO
10370 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45  NFIG_FPE_FASTFPE
10380 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75   option.)  On su
10390 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61  ch systems, floa
103a0 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79  ting point.** by
103b0 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f  te swapping beco
103c0 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63  mes very complic
103d0 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20  ated.  To avoid 
103e0 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65  problems,.** the
103f0 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20   necessary byte 
10400 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72  swapping is carr
10410 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20  ied out using a 
10420 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a  64-bit integer.*
10430 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  * rather than a 
10440 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46  64-bit float.  F
10450 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20  rank assures us 
10460 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65  that the code he
10470 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20  re.** works for 
10480 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65  him.  We, the de
10490 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e  velopers, have n
104a0 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e  o way to indepen
104b0 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79  dently.** verify
104c0 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b   this, but Frank
104d0 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77   seems to know w
104e0 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e  hat he is talkin
104f0 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65  g about.** so we
10500 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23   trust him..*/.#
10510 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58  ifdef SQLITE_MIX
10520 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
10530 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34  FLOAT.static u64
10540 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69   floatSwap(u64 i
10550 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  n){.  union {.  
10560 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32    u64 r;.    u32
10570 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20   i[2];.  } u;.  
10580 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20  u32 t;..  u.r = 
10590 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d  in;.  t = u.i[0]
105a0 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69  ;.  u.i[0] = u.i
105b0 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20  [1];.  u.i[1] = 
105c0 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b  t;.  return u.r;
105d0 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  .}.# define swap
105e0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
105f0 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77  (X)  X = floatSw
10600 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ap(X).#else.# de
10610 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
10620 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e  dianFloat(X).#en
10630 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
10640 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
10650 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
10660 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
10670 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
10680 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
10690 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
106a0 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
106b0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
106c0 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
106d0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
106e0 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
106f0 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75  nBuf is the amou
10700 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74  nt of space left
10710 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66   in buf[].  nBuf
10720 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a   must always be.
10730 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
10740 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69  to hold the enti
10750 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70  re field.  Excep
10760 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20  t, if the field 
10770 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74  is.** a blob wit
10780 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  h a zero-filled 
10790 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d  tail, then buf[]
107a0 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74   might be just t
107b0 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65  he right.** size
107c0 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68   to hold everyth
107d0 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74  ing except for t
107e0 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
107f0 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a  ail.  If buf[].*
10800 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e  * is only big en
10810 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
10820 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78   non-zero prefix
10830 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
10840 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78  e that.** prefix
10850 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75   into buf[].  Bu
10860 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61  t if buf[] is la
10870 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
10880 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70  ld both the.** p
10890 72 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61  refix and the ta
108a0 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  il then write th
108b0 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74  e prefix and set
108c0 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c   the tail to all
108d0 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a  .** zeros..**.**
108e0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
108f0 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
10900 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
10910 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
10920 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
10930 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
10940 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
10950 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
10960 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
10970 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
10980 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
10990 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  uf[]..*/ .u32 sq
109a0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
109b0 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20  ut(u8 *buf, int 
109c0 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  nBuf, Mem *pMem,
109d0 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
109e0 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  ){.  u32 serial_
109f0 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64  type = sqlite3Vd
10a00 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65  beSerialType(pMe
10a10 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b  m, file_format);
10a20 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f  .  u32 len;..  /
10a30 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65  * Integer and Re
10a40 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  al */.  if( seri
10a50 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65  al_type<=7 && se
10a60 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20  rial_type>0 ){. 
10a70 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33     u64 v;.    u3
10a80 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72  2 i;.    if( ser
10a90 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
10aa0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
10ab0 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70  eof(v)==sizeof(p
10ac0 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20  Mem->r) );.     
10ad0 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
10ae0 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  m->r, sizeof(v))
10af0 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
10b00 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
10b10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10b20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
10b30 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
10b40 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   i = sqlite3Vdbe
10b50 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
10b60 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
10b70 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33  assert( len<=(u3
10b80 32 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68  2)nBuf );.    wh
10b90 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20  ile( i-- ){.    
10ba0 20 20 62 75 66 5b 69 5d 20 3d 20 28 75 38 29 28    buf[i] = (u8)(
10bb0 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76  v&0xFF);.      v
10bc0 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20   >>= 8;.    }.  
10bd0 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
10be0 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f  }..  /* String o
10bf0 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20  r blob */.  if( 
10c00 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
10c10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
10c20 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d  Mem->n + ((pMem-
10c30 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
10c40 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  o)?pMem->u.nZero
10c50 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0).            
10c60 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33   == (int)sqlite3
10c70 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
10c80 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29  n(serial_type) )
10c90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
10ca0 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20  em->n<=nBuf );. 
10cb0 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e     len = pMem->n
10cc0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66  ;.    memcpy(buf
10cd0 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b  , pMem->z, len);
10ce0 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66  .    if( pMem->f
10cf0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
10d00 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20  ){.      len += 
10d10 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pMem->u.nZero;. 
10d20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 42 75       assert( nBu
10d30 66 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  f>=0 );.      if
10d40 28 20 6c 65 6e 20 3e 20 28 75 33 32 29 6e 42 75  ( len > (u32)nBu
10d50 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e  f ){.        len
10d60 20 3d 20 28 75 33 32 29 6e 42 75 66 3b 0a 20 20   = (u32)nBuf;.  
10d70 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
10d80 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d  et(&buf[pMem->n]
10d90 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e  , 0, len-pMem->n
10da0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
10db0 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
10dc0 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74  /* NULL or const
10dd0 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  ants 0 or 1 */. 
10de0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
10df0 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
10e00 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f  the data blob po
10e10 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20  inted to by buf 
10e20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73  as serial type s
10e30 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e  erial_type.** an
10e40 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
10e50 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74  lt in pMem.  Ret
10e60 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
10e70 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f  f bytes read..*/
10e80 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62   .u32 sqlite3Vdb
10e90 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f  eSerialGet(.  co
10ea0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
10eb0 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
10ec0 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
10ed0 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
10ee0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10f00 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
10f10 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
10f20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
10f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10f40 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
10f50 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
10f60 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28   */.){.  switch(
10f70 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
10f80 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f      case 10:   /
10f90 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
10fa0 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
10fb0 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52   case 11:   /* R
10fc0 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
10fd0 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
10fe0 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c  se 0: {  /* NULL
10ff0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
11000 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
11010 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11020 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a     }.    case 1:
11030 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67   { /* 1-byte sig
11040 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
11050 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
11060 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75   (signed char)bu
11070 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[0];.      pMem
11080 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
11090 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
110a0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
110b0 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65  e 2: { /* 2-byte
110c0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
110d0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
110e0 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63  .i = (((signed c
110f0 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20  har)buf[0])<<8) 
11100 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20  | buf[1];.      
11110 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
11120 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
11130 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 2;.    }.   
11140 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
11150 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
11160 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
11170 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e  m->u.i = (((sign
11180 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
11190 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c  <16) | (buf[1]<<
111a0 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20  8) | buf[2];.   
111b0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
111c0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
111d0 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a  return 3;.    }.
111e0 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
111f0 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
11200 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
11210 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66  pMem->u.i = (buf
11220 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [0]<<24) | (buf[
11230 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32  1]<<16) | (buf[2
11240 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a  ]<<8) | buf[3];.
11250 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
11260 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
11270 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20     return 4;.   
11280 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
11290 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
112a0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
112b0 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 73 69     u64 x = (((si
112c0 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
112d0 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a  )<<8) | buf[1];.
112e0 20 20 20 20 20 20 75 33 32 20 79 20 3d 20 28 62        u32 y = (b
112f0 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[2]<<24) | (bu
11300 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[3]<<16) | (buf
11310 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d  [4]<<8) | buf[5]
11320 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
11330 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70  32) | y;.      p
11340 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
11350 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d  *)&x;.      pMem
11360 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
11370 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
11380 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  6;.    }.    cas
11390 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65  e 6:   /* 8-byte
113a0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
113b0 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b  */.    case 7: {
113c0 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e   /* IEEE floatin
113d0 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  g point */.     
113e0 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33   u64 x;.      u3
113f0 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  2 y;.#if !define
11400 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65  d(NDEBUG) && !de
11410 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
11420 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
11430 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66  ).      /* Verif
11440 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
11450 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
11460 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
11470 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  e same.      ** 
11480 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
11490 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
114a0 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
114b0 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
114c0 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61    ** defined tha
114d0 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  t 64-bit floatin
114e0 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72  g point values r
114f0 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a  eally are mixed.
11500 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e        ** endian.
11510 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11520 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34  static const u64
11530 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66   t1 = ((u64)0x3f
11540 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20  f00000)<<32;.   
11550 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
11560 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b  double r1 = 1.0;
11570 0a 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20  .      u64 t2 = 
11580 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  t1;.      swapMi
11590 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
115a0 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  2);.      assert
115b0 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69  ( sizeof(r1)==si
115c0 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63  zeof(t2) && memc
115d0 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a  mp(&r1, &t2, siz
115e0 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23  eof(r1))==0 );.#
115f0 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d  endif..      x =
11600 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20   (buf[0]<<24) | 
11610 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28  (buf[1]<<16) | (
11620 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[2]<<8) | buf
11630 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28  [3];.      y = (
11640 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[4]<<24) | (b
11650 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[5]<<16) | (bu
11660 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37  f[6]<<8) | buf[7
11670 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  ];.      x = (x<
11680 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20  <32) | y;.      
11690 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
116a0 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =6 ){.        pM
116b0 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
116c0 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  )&x;.        pMe
116d0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
116e0 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  nt;.      }else{
116f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11700 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26   sizeof(x)==8 &&
11710 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29   sizeof(pMem->r)
11720 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==8 );.        s
11730 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
11740 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20  oat(x);.        
11750 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c  memcpy(&pMem->r,
11760 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
11770 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
11780 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73  lags = sqlite3Is
11790 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d  NaN(pMem->r) ? M
117a0 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65  EM_Null : MEM_Re
117b0 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  al;.      }.    
117c0 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20    return 8;.    
117d0 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20  }.    case 8:   
117e0 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f   /* Integer 0 */
117f0 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20  .    case 9: {  
11800 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a  /* Integer 1 */.
11810 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
11820 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b  = serial_type-8;
11830 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
11840 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
11850 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
11860 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
11870 20 7b 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e   {.      u32 len
11880 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
11890 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65  12)/2;.      pMe
118a0 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62  m->z = (char *)b
118b0 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  uf;.      pMem->
118c0 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70  n = len;.      p
118d0 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20  Mem->xDel = 0;. 
118e0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
118f0 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20  type&0x01 ){.   
11900 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
11910 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d   = MEM_Str | MEM
11920 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65  _Ephem;.      }e
11930 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  lse{.        pMe
11940 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42  m->flags = MEM_B
11950 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b  lob | MEM_Ephem;
11960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
11970 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d  eturn len;.    }
11980 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
11990 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  .}.../*.** Given
119a0 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65   the nKey-byte e
119b0 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63  ncoding of a rec
119c0 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70  ord in pKey[], p
119d0 61 72 73 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f  arse the.** reco
119e0 72 64 20 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b  rd into a Unpack
119f0 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
11a00 72 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  re.  Return a po
11a10 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74  inter to.** that
11a20 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
11a30 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
11a40 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f  nction might pro
11a50 76 69 64 65 20 73 7a 53 70 61 63 65 20 62 79 74  vide szSpace byt
11a60 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20  es of memory.** 
11a70 73 70 61 63 65 20 61 74 20 70 53 70 61 63 65 2e  space at pSpace.
11a80 20 20 54 68 69 73 20 73 70 61 63 65 20 63 61 6e    This space can
11a90 20 62 65 20 75 73 65 64 20 74 6f 20 68 6f 6c 64   be used to hold
11aa0 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   the returned.**
11ab0 20 56 44 62 65 50 61 72 73 65 64 52 65 63 6f 72   VDbeParsedRecor
11ac0 64 20 73 74 72 75 63 74 75 72 65 20 69 66 20 69  d structure if i
11ad0 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  t is large enoug
11ae0 68 2e 20 20 49 66 20 69 74 20 69 73 0a 2a 2a 20  h.  If it is.** 
11af0 6e 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 2c 20  not big enough, 
11b00 73 70 61 63 65 20 69 73 20 6f 62 74 61 69 6e 65  space is obtaine
11b10 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
11b20 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  alloc()..**.** T
11b30 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 75  he returned stru
11b40 63 74 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20  cture should be 
11b50 63 6c 6f 73 65 64 20 62 79 20 61 20 63 61 6c 6c  closed by a call
11b60 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64   to.** sqlite3Vd
11b70 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64  beDeleteUnpacked
11b80 52 65 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e  Record()..*/ .Un
11b90 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71  packedRecord *sq
11ba0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
11bb0 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f  npack(.  KeyInfo
11bc0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
11bd0 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
11be0 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20  bout the record 
11bf0 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20  format */.  int 
11c00 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
11c10 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
11c20 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
11c30 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
11c40 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54  *pKey,      /* T
11c50 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
11c60 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
11c70 63 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ce,          /* 
11c80 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20  Unaligned space 
11c90 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c  available to hol
11ca0 64 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  d the object */.
11cb0 20 20 69 6e 74 20 73 7a 53 70 61 63 65 20 20 20    int szSpace   
11cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
11cd0 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20   of pSpace[] in 
11ce0 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  bytes */.){.  co
11cf0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
11d00 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74  r *aKey = (const
11d10 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
11d20 29 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65  )pKey;.  Unpacke
11d30 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 2f 2a 20  dRecord *p;  /* 
11d40 54 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63  The unpacked rec
11d50 6f 72 64 20 74 68 61 74 20 77 65 20 77 69 6c 6c  ord that we will
11d60 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
11d70 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
11d80 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65   /* Memory space
11d90 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
11da0 70 2c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  p, in bytes */. 
11db0 20 69 6e 74 20 64 3b 0a 20 20 75 33 32 20 69 64   int d;.  u32 id
11dc0 78 3b 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20  x;.  u16 u;     
11dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
11de0 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
11df0 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  r */.  u32 szHdr
11e00 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20  ;.  Mem *pMem;. 
11e10 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20   int nOff;      
11e20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65       /* Increase
11e30 20 70 53 70 61 63 65 20 62 79 20 74 68 69 73 20   pSpace by this 
11e40 6d 75 63 68 20 74 6f 20 38 2d 62 79 74 65 20 61  much to 8-byte a
11e50 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 0a 20 20  lign it */.  .  
11e60 2f 2a 0a 20 20 2a 2a 20 57 65 20 77 61 6e 74 20  /*.  ** We want 
11e70 74 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f 69  to shift the poi
11e80 6e 74 65 72 20 70 53 70 61 63 65 20 75 70 20 73  nter pSpace up s
11e90 75 63 68 20 74 68 61 74 20 69 74 20 69 73 20 38  uch that it is 8
11ea0 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20  -byte aligned.. 
11eb0 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65   ** Thus, we nee
11ec0 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61  d to calculate a
11ed0 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65   value, nOff, be
11ee0 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74  tween 0 and 7, t
11ef0 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74  o shift .  ** it
11f00 20 62 79 2e 20 20 49 66 20 70 53 70 61 63 65 20   by.  If pSpace 
11f10 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74  is already 8-byt
11f20 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20  e aligned, nOff 
11f30 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a  should be zero..
11f40 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38    */.  nOff = (8
11f50 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54   - (SQLITE_PTR_T
11f60 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26 20  O_INT(pSpace) & 
11f70 37 29 29 20 26 20 37 3b 0a 20 20 70 53 70 61 63  7)) & 7;.  pSpac
11f80 65 20 2b 3d 20 6e 4f 66 66 3b 0a 20 20 73 7a 53  e += nOff;.  szS
11f90 70 61 63 65 20 2d 3d 20 6e 4f 66 66 3b 0a 20 20  pace -= nOff;.  
11fa0 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73  nByte = ROUND8(s
11fb0 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
11fc0 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28  cord)) + sizeof(
11fd0 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e  Mem)*(pKeyInfo->
11fe0 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28  nField+1);.  if(
11ff0 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 20 29   nByte>szSpace )
12000 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
12010 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65  3DbMallocRaw(pKe
12020 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65  yInfo->db, nByte
12030 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
12040 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
12050 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43  p->flags = UNPAC
12060 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20  KED_NEED_FREE | 
12070 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45  UNPACKED_NEED_DE
12080 53 54 52 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  STROY;.  }else{.
12090 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
120a0 64 52 65 63 6f 72 64 2a 29 70 53 70 61 63 65 3b  dRecord*)pSpace;
120b0 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20  .    p->flags = 
120c0 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45  UNPACKED_NEED_DE
120d0 53 54 52 4f 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e  STROY;.  }.  p->
120e0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
120f0 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  nfo;.  p->nField
12100 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
12110 65 6c 64 20 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d  eld + 1;.  p->aM
12120 65 6d 20 3d 20 70 4d 65 6d 20 3d 20 28 4d 65 6d  em = pMem = (Mem
12130 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f  *)&((char*)p)[RO
12140 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
12150 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20  ckedRecord))];. 
12160 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
12170 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d  YTE_ALIGNMENT(pM
12180 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67  em) );.  idx = g
12190 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
121a0 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73   szHdr);.  d = s
121b0 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20  zHdr;.  u = 0;. 
121c0 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64   while( idx<szHd
121d0 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64  r && u<p->nField
121e0 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20   && d<=nKey ){. 
121f0 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
12200 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20  pe;..    idx += 
12210 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
12220 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74  y[idx], serial_t
12230 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  ype);.    pMem->
12240 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
12250 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64  enc;.    pMem->d
12260 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
12270 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ;.    pMem->flag
12280 73 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d  s = 0;.    pMem-
12290 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  >zMalloc = 0;.  
122a0 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    d += sqlite3Vd
122b0 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
122c0 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  y[d], serial_typ
122d0 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d  e, pMem);.    pM
122e0 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20  em++;.    u++;. 
122f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d   }.  assert( u<=
12300 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
12310 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69   + 1 );.  p->nFi
12320 65 6c 64 20 3d 20 75 3b 0a 20 20 72 65 74 75 72  eld = u;.  retur
12330 6e 20 28 76 6f 69 64 2a 29 70 3b 0a 7d 0a 0a 2f  n (void*)p;.}../
12340 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12350 65 20 64 65 73 74 72 6f 79 73 20 61 20 55 6e 70  e destroys a Unp
12360 61 63 6b 65 64 52 65 63 6f 72 64 20 6f 62 6a 65  ackedRecord obje
12370 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ct..*/.void sqli
12380 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
12390 61 63 6b 65 64 52 65 63 6f 72 64 28 55 6e 70 61  ackedRecord(Unpa
123a0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a  ckedRecord *p){.
123b0 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a    int i;.  Mem *
123c0 70 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  pMem;..  assert(
123d0 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
123e0 74 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e  t( p->flags & UN
123f0 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54  PACKED_NEED_DEST
12400 52 4f 59 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ROY );.  for(i=0
12410 2c 20 70 4d 65 6d 3d 70 2d 3e 61 4d 65 6d 3b 20  , pMem=p->aMem; 
12420 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b  i<p->nField; i++
12430 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 2f  , pMem++){.    /
12440 2a 20 54 68 65 20 75 6e 70 61 63 6b 65 64 20 72  * The unpacked r
12450 65 63 6f 72 64 20 69 73 20 61 6c 77 61 79 73 20  ecord is always 
12460 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
12470 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  he.    ** sqlite
12480 33 56 64 62 65 55 6e 70 61 63 6b 52 65 63 6f 72  3VdbeUnpackRecor
12490 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f  d() function abo
124a0 76 65 2c 20 77 68 69 63 68 20 6d 61 6b 65 73 20  ve, which makes 
124b0 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e  all.    ** strin
124c0 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 73 74 61  gs and blobs sta
124d0 74 69 63 2e 20 20 41 6e 64 20 6e 6f 6e 65 20 6f  tic.  And none o
124e0 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 61  f the elements a
124f0 72 65 0a 20 20 20 20 2a 2a 20 65 76 65 72 20 74  re.    ** ever t
12500 72 61 6e 73 66 6f 72 6d 65 64 2c 20 73 6f 20 74  ransformed, so t
12510 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e  here is never an
12520 79 74 68 69 6e 67 20 74 6f 20 64 65 6c 65 74 65  ything to delete
12530 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
12540 20 4e 45 56 45 52 28 70 4d 65 6d 2d 3e 7a 4d 61   NEVER(pMem->zMa
12550 6c 6c 6f 63 29 20 29 20 73 71 6c 69 74 65 33 56  lloc) ) sqlite3V
12560 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d  dbeMemRelease(pM
12570 65 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  em);.  }.  if( p
12580 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
12590 45 44 5f 4e 45 45 44 5f 46 52 45 45 20 29 7b 0a  ED_NEED_FREE ){.
125a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
125b0 65 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  e(p->pKeyInfo->d
125c0 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b, p);.  }.}../*
125d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
125e0 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
125f0 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
12600 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a   index records.*
12610 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b  * specified by {
12620 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
12630 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65  d pPKey2.  It re
12640 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65  turns a negative
12650 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
12660 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66  itive integer if
12670 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
12680 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
12690 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
126a0 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65   key2.  The {nKe
126b0 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d  y1, pKey1} key m
126c0 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a  ust be a blob.**
126d0 20 63 72 65 61 74 65 64 20 62 79 20 74 68 20 4f   created by th O
126e0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
126f0 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
12700 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20    The pPKey2.** 
12710 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61  key must be a pa
12720 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73  rsed key such as
12730 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
12740 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72  * sqlite3VdbePar
12750 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  seRecord..**.** 
12760 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f  Key1 and Key2 do
12770 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e   not have to con
12780 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  tain the same nu
12790 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a  mber of fields..
127a0 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74 68 20  ** The key with 
127b0 66 65 77 65 72 20 66 69 65 6c 64 73 20 69 73 20  fewer fields is 
127c0 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73  usually compares
127d0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a   less than the .
127e0 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20  ** longer key.  
127f0 48 6f 77 65 76 65 72 20 69 66 20 74 68 65 20 55  However if the U
12800 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20  NPACKED_INCRKEY 
12810 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20  flags in pPKey2 
12820 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68  is set.** and th
12830 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65  e common prefixe
12840 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65  s are equal, the
12850 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  n key1 is less t
12860 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20  han key2..** Or 
12870 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  if the UNPACKED_
12880 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61  MATCH_PREFIX fla
12890 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
128a0 20 70 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a   prefixes are.**
128b0 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65   equal, then the
128c0 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64   keys are consid
128d0 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c  ered to be equal
128e0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74   and.** the part
128f0 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d  s beyond the com
12900 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65 20 69  mon prefix are i
12910 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
12920 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 47   the UNPACKED_IG
12930 4e 4f 52 45 5f 52 4f 57 49 44 20 66 6c 61 67 20  NORE_ROWID flag 
12940 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
12950 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a   last byte of.**
12960 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 70   the header of p
12970 4b 65 79 31 20 69 73 20 69 67 6e 6f 72 65 64 2e  Key1 is ignored.
12980 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
12990 74 68 61 74 20 70 4b 65 79 31 20 69 73 0a 2a 2a  that pKey1 is.**
129a0 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 2c 20 61   an index key, a
129b0 6e 64 20 74 68 75 73 20 65 6e 64 73 20 77 69 74  nd thus ends wit
129c0 68 20 61 20 72 6f 77 69 64 20 76 61 6c 75 65 2e  h a rowid value.
129d0 20 20 54 68 65 20 6c 61 73 74 20 62 79 74 65 0a    The last byte.
129e0 2a 2a 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ** of the header
129f0 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20   will therefore 
12a00 62 65 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  be the serial ty
12a10 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 3a  pe of the rowid:
12a20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c 20 32 2c  .** one of 1, 2,
12a30 20 33 2c 20 34 2c 20 35 2c 20 36 2c 20 38 2c 20   3, 4, 5, 6, 8, 
12a40 6f 72 20 39 20 2d 20 74 68 65 20 69 6e 74 65 67  or 9 - the integ
12a50 65 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  er serial types.
12a60 0a 2a 2a 20 54 68 65 20 73 65 72 69 61 6c 20 74  .** The serial t
12a70 79 70 65 20 6f 66 20 74 68 65 20 66 69 6e 61 6c  ype of the final
12a80 20 72 6f 77 69 64 20 77 69 6c 6c 20 61 6c 77 61   rowid will alwa
12a90 79 73 20 62 65 20 61 20 73 69 6e 67 6c 65 20 62  ys be a single b
12aa0 79 74 65 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f 72  yte..** By ignor
12ab0 69 6e 67 20 74 68 69 73 20 6c 61 73 74 20 62 79  ing this last by
12ac0 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
12ad0 2c 20 77 65 20 66 6f 72 63 65 20 74 68 65 20 63  , we force the c
12ae0 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f 20  omparison.** to 
12af0 69 67 6e 6f 72 65 20 74 68 65 20 72 6f 77 69 64  ignore the rowid
12b00 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 6b   at the end of k
12b10 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ey1..*/.int sqli
12b20 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
12b30 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79  pare(.  int nKey
12b40 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
12b50 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
12b60 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
12b70 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
12b80 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
12b90 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31  y */.){.  int d1
12ba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
12bb0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
12bc0 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
12bd0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
12be0 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
12bf0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
12c00 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
12c10 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
12c20 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
12c30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12c40 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
12c50 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
12c60 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a  ;.  int nField;.
12c70 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
12c80 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
12c90 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
12ca0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
12cb0 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
12cc0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
12cd0 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
12ce0 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
12cf0 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65  ->pKeyInfo;.  me
12d00 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
12d10 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64  o->enc;.  mem1.d
12d20 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
12d30 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d  ;.  mem1.flags =
12d40 20 30 3b 0a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d   0;.  mem1.u.i =
12d50 20 30 3b 20 20 2f 2a 20 6e 6f 74 20 6e 65 65 64   0;  /* not need
12d60 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65  ed, here to sile
12d70 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  nce compiler war
12d80 6e 69 6e 67 20 2a 2f 0a 20 20 6d 65 6d 31 2e 7a  ning */.  mem1.z
12d90 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 0a 20  Malloc = 0;.  . 
12da0 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
12db0 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
12dc0 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72  1);.  d1 = szHdr
12dd0 31 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d  1;.  if( pPKey2-
12de0 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
12df0 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29  D_IGNORE_ROWID )
12e00 7b 0a 20 20 20 20 73 7a 48 64 72 31 2d 2d 3b 0a  {.    szHdr1--;.
12e10 20 20 7d 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70    }.  nField = p
12e20 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
12e30 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73  .  while( idx1<s
12e40 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79  zHdr1 && i<pPKey
12e50 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20  2->nField ){.   
12e60 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
12e70 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  1;..    /* Read 
12e80 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  the serial types
12e90 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c   for the next el
12ea0 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65  ement in each ke
12eb0 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b  y. */.    idx1 +
12ec0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61  = getVarint32( a
12ed0 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61  Key1+idx1, seria
12ee0 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69  l_type1 );.    i
12ef0 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20  f( d1>=nKey1 && 
12f00 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
12f10 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
12f20 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b  type1)>0 ) break
12f30 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  ;..    /* Extrac
12f40 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  t the values to 
12f50 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20  be compared..   
12f60 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71   */.    d1 += sq
12f70 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
12f80 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
12f90 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
12fa0 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  m1);..    /* Do 
12fb0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  the comparison. 
12fc0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
12fd0 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
12fe0 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d  (&mem1, &pPKey2-
12ff0 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20  >aMem[i],.      
13000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13010 20 20 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20       i<nField ? 
13020 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
13030 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28  i] : 0);.    if(
13040 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
13050 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
13060 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   i++;.  }..  /* 
13070 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  No memory alloca
13080 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65  tion is ever use
13090 64 20 6f 6e 20 6d 65 6d 31 2e 20 2a 2f 0a 20 20  d on mem1. */.  
130a0 69 66 28 20 4e 45 56 45 52 28 6d 65 6d 31 2e 7a  if( NEVER(mem1.z
130b0 4d 61 6c 6c 6f 63 29 20 29 20 73 71 6c 69 74 65  Malloc) ) sqlite
130c0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
130d0 26 6d 65 6d 31 29 3b 0a 0a 20 20 2f 2a 20 49 66  &mem1);..  /* If
130e0 20 74 68 65 20 50 52 45 46 49 58 5f 53 45 41 52   the PREFIX_SEAR
130f0 43 48 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  CH flag is set a
13100 6e 64 20 61 6c 6c 20 66 69 65 6c 64 73 20 65 78  nd all fields ex
13110 63 65 70 74 20 74 68 65 20 66 69 6e 61 6c 0a 20  cept the final. 
13120 20 2a 2a 20 72 6f 77 69 64 20 66 69 65 6c 64 20   ** rowid field 
13130 77 65 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e  were equal, then
13140 20 63 6c 65 61 72 20 74 68 65 20 50 52 45 46 49   clear the PREFI
13150 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20 61 6e  X_SEARCH flag an
13160 64 20 73 65 74 20 0a 20 20 2a 2a 20 70 50 4b 65  d set .  ** pPKe
13170 79 32 2d 3e 72 6f 77 69 64 20 74 6f 20 74 68 65  y2->rowid to the
13180 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f   value of the ro
13190 77 69 64 20 66 69 65 6c 64 20 69 6e 20 28 70 4b  wid field in (pK
131a0 65 79 31 2c 20 6e 4b 65 79 31 29 2e 0a 20 20 2a  ey1, nKey1)..  *
131b0 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62  * This is used b
131c0 79 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75  y the OP_IsUniqu
131d0 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
131e0 20 69 66 28 20 28 70 50 4b 65 79 32 2d 3e 66 6c   if( (pPKey2->fl
131f0 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50  ags & UNPACKED_P
13200 52 45 46 49 58 5f 53 45 41 52 43 48 29 20 26 26  REFIX_SEARCH) &&
13210 20 69 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e 46 69   i==(pPKey2->nFi
13220 65 6c 64 2d 31 29 20 29 7b 0a 20 20 20 20 61 73  eld-1) ){.    as
13230 73 65 72 74 28 20 69 64 78 31 3d 3d 73 7a 48 64  sert( idx1==szHd
13240 72 31 20 26 26 20 72 63 20 29 3b 0a 20 20 20 20  r1 && rc );.    
13250 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61  assert( mem1.fla
13260 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a  gs & MEM_Int );.
13270 20 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67      pPKey2->flag
13280 73 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44 5f 50  s &= ~UNPACKED_P
13290 52 45 46 49 58 5f 53 45 41 52 43 48 3b 0a 20 20  REFIX_SEARCH;.  
132a0 20 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20    pPKey2->rowid 
132b0 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 7d 0a  = mem1.u.i;.  }.
132c0 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
132d0 20 20 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72      /* rc==0 her
132e0 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
132f0 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
13300 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61   out of fields a
13310 6e 64 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68  nd.    ** all th
13320 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
13330 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65  hat point were e
13340 71 75 61 6c 2e 20 49 66 20 74 68 65 20 55 4e 50  qual. If the UNP
13350 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a 20 20  ACKED_INCRKEY.  
13360 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
13370 2c 20 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65  , then break the
13380 20 74 69 65 20 62 79 20 74 72 65 61 74 69 6e 67   tie by treating
13390 20 6b 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e   key2 as larger.
133a0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 55  .    ** If the U
133b0 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41  PACKED_PREFIX_MA
133c0 54 43 48 20 66 6c 61 67 20 69 73 20 73 65 74 2c  TCH flag is set,
133d0 20 74 68 65 6e 20 6b 65 79 73 20 77 69 74 68 20   then keys with 
133e0 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a  common prefixes.
133f0 20 20 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69      ** are consi
13400 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61  dered to be equa
13410 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74  l.  Otherwise, t
13420 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73  he longer key is
13430 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 6c 61 72   the .    ** lar
13440 67 65 72 2e 20 20 41 73 20 69 74 20 68 61 70 70  ger.  As it happ
13450 65 6e 73 2c 20 74 68 65 20 70 50 4b 65 79 32 20  ens, the pPKey2 
13460 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74  will always be t
13470 68 65 20 6c 6f 6e 67 65 72 0a 20 20 20 20 2a 2a  he longer.    **
13480 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64   if there is a d
13490 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a  ifference..    *
134a0 2f 0a 20 20 20 20 69 66 28 20 70 50 4b 65 79 32  /.    if( pPKey2
134b0 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
134c0 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20  ED_INCRKEY ){.  
134d0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
134e0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79   }else if( pPKey
134f0 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  2->flags & UNPAC
13500 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48  KED_PREFIX_MATCH
13510 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61   ){.      /* Lea
13520 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 20 20  ve rc==0 */.    
13530 7d 65 6c 73 65 20 69 66 28 20 69 64 78 31 3c 73  }else if( idx1<s
13540 7a 48 64 72 31 20 29 7b 0a 20 20 20 20 20 20 72  zHdr1 ){.      r
13550 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
13560 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66  else if( pKeyInf
13570 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
13580 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   i<pKeyInfo->nFi
13590 65 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  eld.            
135a0 20 20 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e     && pKeyInfo->
135b0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
135c0 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20  .    rc = -rc;. 
135d0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
135e0 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  .}. ../*.** pCur
135f0 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
13600 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65  dex entry create
13610 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
13620 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
13630 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f  ..** Read the ro
13640 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69  wid (the last fi
13650 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72  eld in the recor
13660 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  d) and store it 
13670 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65  in *rowid..** Re
13680 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
13690 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
136a0 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ks, or an error 
136b0 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
136c0 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74  **.** pCur might
136d0 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   be pointing to 
136e0 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72  text obtained fr
136f0 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  om a corrupt dat
13700 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53  abase file..** S
13710 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61  o the content ca
13720 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
13730 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65    Do appropriate
13740 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63   checks on the c
13750 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  ontent..*/.int s
13760 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
13770 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  id(sqlite3 *db, 
13780 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
13790 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69  i64 *rowid){.  i
137a0 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
137b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
137c0 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
137d0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
137e0 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
137f0 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
13800 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
13810 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32  e rowid */.  u32
13820 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f   lenRowid;     /
13830 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f  * Size of the ro
13840 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20  wid */.  Mem m, 
13850 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  v;..  /* Get the
13860 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
13870 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20  ex entry.  Only 
13880 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20  indices entries 
13890 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61  of less.  ** tha
138a0 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f  n 2GiB are suppo
138b0 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61  rt - anything la
138c0 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61  rge must be data
138d0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
138e0 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70  .  ** Any corrup
138f0 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
13900 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65   in sqlite3Btree
13910 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
13920 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20  though, so.  ** 
13930 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61  this code can sa
13940 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74  fely assume that
13950 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d   nCellKey is 32-
13960 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73  bits  .  */.  as
13970 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
13980 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
13990 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
139a0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
139b0 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
139c0 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
139d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
139e0 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20       /* pCur is 
139f0 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
13a00 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
13a10 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ail */.  assert(
13a20 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c   (nCellKey & SQL
13a30 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75  ITE_MAX_U32)==(u
13a40 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a  64)nCellKey );..
13a50 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
13a60 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
13a70 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  t of the index e
13a80 6e 74 72 79 20 2a 2f 0a 20 20 6d 2e 66 6c 61 67  ntry */.  m.flag
13a90 73 20 3d 20 30 3b 0a 20 20 6d 2e 64 62 20 3d 20  s = 0;.  m.db = 
13aa0 64 62 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f 63 20  db;.  m.zMalloc 
13ab0 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
13ac0 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
13ad0 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 69 6e  ree(pCur, 0, (in
13ae0 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  t)nCellKey, 1, &
13af0 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
13b00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13b10 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64   }..  /* The ind
13b20 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65  ex entry must be
13b30 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65  gin with a heade
13b40 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69  r size */.  (voi
13b50 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
13b60 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a  8*)m.z, szHdr);.
13b70 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
13b80 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  r==3 );.  testca
13b90 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29  se( szHdr==m.n )
13ba0 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
13bb0 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74  (szHdr<3 || (int
13bc0 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20  )szHdr>m.n) ){. 
13bd0 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
13be0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
13bf0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74  }..  /* The last
13c00 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e   field of the in
13c10 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  dex should be an
13c20 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52   integer - the R
13c30 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66  OWID..  ** Verif
13c40 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  y that the last 
13c50 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20  entry really is 
13c60 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  an integer. */. 
13c70 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
13c80 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
13c90 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
13ca0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
13cb0 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20  ypeRowid==1 );. 
13cc0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
13cd0 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73  owid==2 );.  tes
13ce0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
13cf0 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
13d00 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20  e( typeRowid==4 
13d10 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
13d20 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20  ypeRowid==5 );. 
13d30 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
13d40 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73  owid==6 );.  tes
13d50 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
13d60 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==8 );.  testcas
13d70 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20  e( typeRowid==9 
13d80 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
13d90 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c  y(typeRowid<1 ||
13da0 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20   typeRowid>9 || 
13db0 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b  typeRowid==7) ){
13dc0 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
13dd0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
13de0 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
13df0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
13e00 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f  alTypeLen(typeRo
13e10 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
13e20 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64  ( (u32)m.n==szHd
13e30 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20  r+lenRowid );.  
13e40 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33  if( unlikely((u3
13e50 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52  2)m.n<szHdr+lenR
13e60 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  owid) ){.    got
13e70 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
13e80 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
13e90 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65  * Fetch the inte
13ea0 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ger off the end 
13eb0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63  of the index rec
13ec0 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
13ed0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
13ee0 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
13ef0 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
13f00 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
13f10 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
13f20 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
13f30 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
13f40 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
13f50 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74  Jump here if dat
13f60 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
13f70 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74   is detected aft
13f80 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20  er m has been.  
13f90 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46  ** allocated.  F
13fa0 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74  ree the m object
13fb0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
13fc0 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69  TE_CORRUPT. */.i
13fd0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
13fe0 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28  ion:.  testcase(
13ff0 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b   m.zMalloc!=0 );
14000 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
14010 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
14020 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
14030 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f  RRUPT_BKPT;.}../
14040 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
14050 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65   key of the inde
14060 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  x entry that cur
14070 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69  sor pC is pointi
14080 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a  ng to against.**
14090 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20   the key string 
140a0 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57  in pUnpacked.  W
140b0 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20  rite into *pRes 
140c0 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74  a number.** that
140d0 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65   is negative, ze
140e0 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
140f0 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68  if pC is less th
14100 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a  an, equal to,.**
14110 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
14120 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74   pUnpacked.  Ret
14130 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
14140 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
14150 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74  pUnpacked is eit
14160 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68  her created with
14170 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69  out a rowid or i
14180 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74  s truncated so t
14190 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20  hat it.** omits 
141a0 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  the rowid at the
141b0 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64   end.  The rowid
141c0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
141d0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a  he index entry.*
141e0 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20  * is ignored as 
141f0 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68  well.  Hence, th
14200 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
14210 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65  compares the pre
14220 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65  fixes .** of the
14230 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74   keys prior to t
14240 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20  he final rowid, 
14250 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b  not the entire k
14260 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
14270 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70  e3VdbeIdxKeyComp
14280 61 72 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f  are(.  VdbeCurso
14290 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
142a0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
142b0 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
142c0 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  nst */.  Unpacke
142d0 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b  dRecord *pUnpack
142e0 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  ed,  /* Unpacked
142f0 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20   version of key 
14300 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
14310 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73  st */.  int *res
14320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14330 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
14340 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75   comparison resu
14350 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  lt here */.){.  
14360 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
14370 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  ;.  int rc;.  Bt
14380 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70  Cursor *pCur = p
14390 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65  C->pCursor;.  Me
143a0 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  m m;..  assert( 
143b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
143c0 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20  orIsValid(pCur) 
143d0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
143e0 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
143f0 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
14400 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
14410 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a  LITE_OK );    /*
14420 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20   pCur is always 
14430 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65  valid so KeySize
14440 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
14450 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69    /* nCellKey wi
14460 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74  ll always be bet
14470 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66  ween 0 and 0xfff
14480 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66  fffff because of
14490 20 74 68 65 20 73 61 79 0a 20 20 2a 2a 20 74 68   the say.  ** th
144a0 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  at btreeParseCel
144b0 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74  lPtr() and sqlit
144c0 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20  e3GetVarint32() 
144d0 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
144e0 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  */.  if( nCellKe
144f0 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79  y<=0 || nCellKey
14500 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20  >0x7fffffff ){. 
14510 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
14520 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
14530 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 6d 65  ORRUPT;.  }.  me
14540 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65  mset(&m, 0, size
14550 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73  of(m));.  rc = s
14560 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
14570 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73  mBtree(pC->pCurs
14580 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c  or, 0, (int)nCel
14590 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
145a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
145b0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
145c0 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65 64  ssert( pUnpacked
145d0 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
145e0 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20  ED_IGNORE_ROWID 
145f0 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69  );.  *res = sqli
14600 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
14610 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70  pare(m.n, m.z, p
14620 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c  Unpacked);.  sql
14630 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
14640 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
14650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
14660 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14670 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65  e sets the value
14680 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
14690 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
146a0 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
146b0 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74  3_changes() on t
146c0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
146d0 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69  le 'db'. .*/.voi
146e0 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
146f0 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
14700 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65  *db, int nChange
14710 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
14720 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
14730 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
14740 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43  db->nChange = nC
14750 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f  hange;.  db->nTo
14760 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68  talChange += nCh
14770 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ange;.}../*.** S
14780 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65  et a flag in the
14790 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20   vdbe to update 
147a0 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
147b0 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69  er when it is fi
147c0 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65  nalised.** or re
147d0 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
147e0 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61  ite3VdbeCountCha
147f0 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20  nges(Vdbe *v){. 
14800 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   v->changeCntOn 
14810 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  = 1;.}../*.** Ma
14820 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65  rk every prepare
14830 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f  d statement asso
14840 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
14850 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
14860 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e  n.** as expired.
14870 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65  .**.** An expire
14880 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e  d statement mean
14890 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61  s that recompila
148a0 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
148b0 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f  ement is.** reco
148c0 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e  mmend.  Statemen
148d0 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74  ts expire when t
148e0 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61  hings happen tha
148f0 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20  t make their.** 
14900 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74  programs obsolet
14910 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65  e.  Removing use
14920 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
14930 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67  ons or collating
14940 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f  .** sequences, o
14950 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75  r changing an au
14960 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63  thorization func
14970 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70  tion are the typ
14980 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20  es of.** things 
14990 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72  that make prepar
149a0 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62  ed statements ob
149b0 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  solete..*/.void 
149c0 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
149d0 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
149e0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
149f0 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Vdbe *p;.  for(p
14a00 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b   = db->pVdbe; p;
14a10 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
14a20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31    p->expired = 1
14a30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
14a40 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61  eturn the databa
14a50 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  se associated wi
14a60 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a  th the Vdbe..*/.
14a70 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
14a80 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b  VdbeDb(Vdbe *v){
14a90 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b  .  return v->db;
14aa0 0a 7d 0a                                         .}.