/ Hex Artifact Content
Login

Artifact 1cc9dd48848059d1c1cd05775659323e0a8654dc:


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: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20  *pMaxFuncArgs;. 
1ce0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20   Op *pOp;.  int 
1cf0: 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61  *aLabel = p->aLa
1d00: 62 65 6c 3b 0a 20 20 69 6e 74 20 64 6f 65 73 53  bel;.  int doesS
1d10: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
1d20: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 53   = 0;.  int hasS
1d30: 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20  tatementBegin = 
1d40: 30 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  0;.  p->readOnly
1d50: 20 3d 20 31 3b 0a 20 20 70 2d 3e 75 73 65 73 53   = 1;.  p->usesS
1d60: 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  tmtJournal = 0;.
1d70: 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70    for(pOp=p->aOp
1d80: 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e  , i=p->nOp-1; i>
1d90: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b  =0; i--, pOp++){
1da0: 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d  .    u8 opcode =
1db0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20   pOp->opcode;.. 
1dc0: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
1dd0: 50 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70  P_Function || op
1de0: 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70  code==OP_AggStep
1df0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
1e00: 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29  p->p5>nMaxArgs )
1e10: 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d   nMaxArgs = pOp-
1e20: 3e 70 35 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  >p5;.#ifndef SQL
1e30: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1e40: 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20  TABLE.    }else 
1e50: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56  if( opcode==OP_V
1e60: 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20 20  Update ){.      
1e70: 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78  if( pOp->p2>nMax
1e80: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
1e90: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 23 65 6e 64 69  = pOp->p2;.#endi
1ea0: 66 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  f.    }.    if( 
1eb0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20  opcode==OP_Halt 
1ec0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
1ed0: 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  ->p1==SQLITE_CON
1ee0: 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e  STRAINT && pOp->
1ef0: 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  p2==OE_Abort ){.
1f00: 20 20 20 20 20 20 20 20 64 6f 65 73 53 74 61 74          doesStat
1f10: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20  ementRollback = 
1f20: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1f30: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
1f40: 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b  =OP_Statement ){
1f50: 0a 20 20 20 20 20 20 68 61 73 53 74 61 74 65 6d  .      hasStatem
1f60: 65 6e 74 42 65 67 69 6e 20 3d 20 31 3b 0a 20 20  entBegin = 1;.  
1f70: 20 20 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a      p->usesStmtJ
1f80: 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
1f90: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
1fa0: 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 29 7b 0a  ==OP_Destroy ){.
1fb0: 20 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d        doesStatem
1fc0: 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  entRollback = 1;
1fd0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
1fe0: 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e 73 61  pcode==OP_Transa
1ff0: 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d 3e 70 32  ction && pOp->p2
2000: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  !=0 ){.      p->
2010: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 23 69  readOnly = 0;.#i
2020: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2030: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
2040: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
2050: 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20  ode==OP_VUpdate 
2060: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52  || opcode==OP_VR
2070: 65 6e 61 6d 65 20 7c 7c 20 6f 70 63 6f 64 65 3d  ename || opcode=
2080: 3d 4f 50 5f 50 72 6f 67 72 61 6d 20 29 7b 0a 20  =OP_Program ){. 
2090: 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65       doesStateme
20a0: 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ntRollback = 1;.
20b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
20c0: 63 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72  code==OP_VFilter
20d0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b   ){.      int n;
20e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20f0: 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29  ->nOp - i >= 3 )
2100: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2110: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
2120: 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20  OP_Integer );.  
2130: 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e      n = pOp[-1].
2140: 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  p1;.      if( n>
2150: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
2160: 72 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a  rgs = n;.#endif.
2170: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73      }..    if( s
2180: 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65  qlite3VdbeOpcode
2190: 48 61 73 50 72 6f 70 65 72 74 79 28 6f 70 63 6f  HasProperty(opco
21a0: 64 65 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 20  de, OPFLG_JUMP) 
21b0: 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a  && pOp->p2<0 ){.
21c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31        assert( -1
21d0: 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62  -pOp->p2<p->nLab
21e0: 65 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d  el );.      pOp-
21f0: 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d  >p2 = aLabel[-1-
2200: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a  pOp->p2];.    }.
2210: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
2220: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c  ree(p->db, p->aL
2230: 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62  abel);.  p->aLab
2240: 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78  el = 0;..  *pMax
2250: 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41  FuncArgs = nMaxA
2260: 72 67 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  rgs;..  /* If we
2270: 20 6e 65 76 65 72 20 72 6f 6c 6c 62 61 63 6b 20   never rollback 
2280: 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
2290: 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 73 74  saction, then st
22a0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61  atement.  ** tra
22b0: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
22c0: 74 20 6e 65 65 64 65 64 2e 20 20 53 6f 20 63 68  t needed.  So ch
22d0: 61 6e 67 65 20 65 76 65 72 79 20 4f 50 5f 53 74  ange every OP_St
22e0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6f 70 63  atement.  ** opc
22f0: 6f 64 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e  ode into an OP_N
2300: 6f 6f 70 2e 20 20 54 68 69 73 20 61 76 6f 69 64  oop.  This avoid
2310: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
2320: 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
2330: 65 28 29 0a 20 20 2a 2a 20 77 68 69 63 68 20 63  e().  ** which c
2340: 61 6e 20 62 65 20 65 78 70 65 6e 73 69 76 65 20  an be expensive 
2350: 6f 6e 20 73 6f 6d 65 20 70 6c 61 74 66 6f 72 6d  on some platform
2360: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61  s..  */.  if( ha
2370: 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20  sStatementBegin 
2380: 26 26 20 21 64 6f 65 73 53 74 61 74 65 6d 65 6e  && !doesStatemen
2390: 74 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tRollback ){.   
23a0: 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
23b0: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  nal = 0;.    for
23c0: 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70  (pOp=p->aOp, i=p
23d0: 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69  ->nOp-1; i>=0; i
23e0: 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  --, pOp++){.    
23f0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
2400: 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20  e==OP_Statement 
2410: 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  ){.        pOp->
2420: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
2430: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2440: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
2450: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
2460: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
2470: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  ruction to be in
2480: 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
2490: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
24a0: 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a  tAddr(Vdbe *p){.
24b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
24c0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
24d0: 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NIT );.  return 
24e0: 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 56 64 62 65 4f  p->nOp;.}..VdbeO
24f0: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61  p *sqlite3VdbeTa
2500: 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  keOpArray(Vdbe *
2510: 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e  p, int *pnOp, in
2520: 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20  t *pnMaxArg){.  
2530: 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d  VdbeOp *aOp = p-
2540: 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >aOp;.  assert( 
2550: 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d  aOp && !p->db->m
2560: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
2570: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
2580: 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20  (p, pnMaxArg);. 
2590: 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b   *pnOp = p->nOp;
25a0: 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20  .  p->aOp = 0;. 
25b0: 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a   return aOp;.}..
25c0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c  /*.** Add a whol
25d0: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74  e list of operat
25e0: 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72  ions to the oper
25f0: 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65  ation stack.  Re
2600: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72  turn the.** addr
2610: 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74  ess of the first
2620: 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64   operation added
2630: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2640: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64  VdbeAddOpList(Vd
2650: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20  be *p, int nOp, 
2660: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
2670: 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64   *aOp){.  int ad
2680: 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  dr;.  assert( p-
2690: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
26a0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
26b0: 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20   p->nOp + nOp > 
26c0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67  p->nOpAlloc && g
26d0: 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b  rowOpArray(p) ){
26e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
26f0: 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e   }.  addr = p->n
2700: 4f 70 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  Op;.  if( ALWAYS
2710: 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20 20 69  (nOp>0) ){.    i
2720: 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70  nt i;.    VdbeOp
2730: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20  List const *pIn 
2740: 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69  = aOp;.    for(i
2750: 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20  =0; i<nOp; i++, 
2760: 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  pIn++){.      in
2770: 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a  t p2 = pIn->p2;.
2780: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
2790: 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61  ut = &p->aOp[i+a
27a0: 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74  ddr];.      pOut
27b0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e  ->opcode = pIn->
27c0: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f  opcode;.      pO
27d0: 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31  ut->p1 = pIn->p1
27e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c 30  ;.      if( p2<0
27f0: 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 4f   && sqlite3VdbeO
2800: 70 63 6f 64 65 48 61 73 50 72 6f 70 65 72 74 79  pcodeHasProperty
2810: 28 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 2c 20 4f  (pOut->opcode, O
2820: 50 46 4c 47 5f 4a 55 4d 50 29 20 29 7b 0a 20 20  PFLG_JUMP) ){.  
2830: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d        pOut->p2 =
2840: 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32 29   addr + ADDR(p2)
2850: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2860: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
2870: 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = p2;.      }.  
2880: 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70      pOut->p3 = p
2890: 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f  In->p3;.      pO
28a0: 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  ut->p4type = P4_
28b0: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70  NOTUSED;.      p
28c0: 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  Out->p4.p = 0;. 
28d0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20       pOut->p5 = 
28e0: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
28f0: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f 75  _DEBUG.      pOu
2900: 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  t->zComment = 0;
2910: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2920: 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  e3VdbeAddopTrace
2930: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2940: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
2950: 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f  , i+addr, &p->aO
2960: 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20  p[i+addr]);.    
2970: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
2980: 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e  .    p->nOp += n
2990: 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Op;.  }.  return
29a0: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
29b0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
29c0: 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61   of the P1 opera
29d0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
29e0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
29f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2a00: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
2a10: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
2a20: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
2a30: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
2a40: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
2a50: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
2a60: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
2a70: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
2a80: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
2a90: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
2aa0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
2ab0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
2ac0: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
2ad0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
2ae0: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d    assert( addr>=
2af0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  0 );.  if( p->nO
2b00: 70 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d  p>addr ){.    p-
2b10: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20  >aOp[addr].p1 = 
2b20: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
2b30: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
2b40: 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65  ue of the P2 ope
2b50: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
2b60: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
2b70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2b80: 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73   is useful for s
2b90: 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65  etting a jump de
2ba0: 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  stination..*/.vo
2bb0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
2bc0: 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20  angeP2(Vdbe *p, 
2bd0: 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61  int addr, int va
2be0: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
2bf0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2c00: 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28  addr>=0 );.  if(
2c10: 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a   p->nOp>addr ){.
2c20: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
2c30: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p2 = val;.  }.}
2c40: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
2c50: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2c60: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P3 operand for a
2c70: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
2c80: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
2c90: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2ca0: 50 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P3(Vdbe *p, int 
2cb0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
2cc0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
2cd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ;.  assert( addr
2ce0: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  >=0 );.  if( p->
2cf0: 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  nOp>addr ){.    
2d00: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20  p->aOp[addr].p3 
2d10: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
2d20: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
2d30: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35 20 6f  alue of the P5 o
2d40: 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65 20 6d  perand for the m
2d50: 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  ost recently.** 
2d60: 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e  added operation.
2d70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2d80: 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62  VdbeChangeP5(Vdb
2d90: 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20  e *p, u8 val){. 
2da0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
2db0: 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b  .  if( p->aOp ){
2dc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
2dd0: 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e  nOp>0 );.    p->
2de0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35  aOp[p->nOp-1].p5
2df0: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
2e00: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2e10: 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  P2 operand of in
2e20: 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73  struction addr s
2e30: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
2e40: 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65   to.** the addre
2e50: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
2e60: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
2e70: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20   coded..*/.void 
2e80: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2e90: 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ere(Vdbe *p, int
2ea0: 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65   addr){.  sqlite
2eb0: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c  3VdbeChangeP2(p,
2ec0: 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a   addr, p->nOp);.
2ed0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
2ee0: 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73   input FuncDef s
2ef0: 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65  tructure is ephe
2f00: 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65  meral, then free
2f10: 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
2f20: 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65  FuncDef is not e
2f30: 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f  phermal, then do
2f40: 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61   nothing..*/.sta
2f50: 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68  tic void freeEph
2f60: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73  emeralFunction(s
2f70: 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63  qlite3 *db, Func
2f80: 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66  Def *pDef){.  if
2f90: 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20 26  ( ALWAYS(pDef) &
2fa0: 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26  & (pDef->flags &
2fb0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48   SQLITE_FUNC_EPH
2fc0: 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  EM)!=0 ){.    sq
2fd0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2fe0: 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pDef);.  }.}../*
2ff0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20  .** Delete a P4 
3000: 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61  value if necessa
3010: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
3020: 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 65  id freeP4(sqlite
3030: 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70  3 *db, int p4typ
3040: 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20  e, void *p4){.  
3050: 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 73 77  if( p4 ){.    sw
3060: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a  itch( p4type ){.
3070: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52 45        case P4_RE
3080: 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  AL:.      case P
3090: 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63  4_INT64:.      c
30a0: 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 0a  ase P4_MPRINTF:.
30b0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 44 59        case P4_DY
30c0: 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73  NAMIC:.      cas
30d0: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20  e P4_KEYINFO:.  
30e0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
30f0: 52 52 41 59 3a 0a 20 20 20 20 20 20 63 61 73 65  RRAY:.      case
3100: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
3110: 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  OFF: {.        s
3120: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3130: 20 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72   p4);.        br
3140: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3150: 20 20 20 63 61 73 65 20 50 34 5f 56 44 42 45 46     case P4_VDBEF
3160: 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56  UNC: {.        V
3170: 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75  dbeFunc *pVdbeFu
3180: 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a  nc = (VdbeFunc *
3190: 29 70 34 3b 0a 20 20 20 20 20 20 20 20 66 72 65  )p4;.        fre
31a0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
31b0: 6f 6e 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63  on(db, pVdbeFunc
31c0: 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20  ->pFunc);.      
31d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
31e0: 65 74 65 41 75 78 44 61 74 61 28 70 56 64 62 65  eteAuxData(pVdbe
31f0: 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20  Func, 0);.      
3200: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3210: 64 62 2c 20 70 56 64 62 65 46 75 6e 63 29 3b 0a  db, pVdbeFunc);.
3220: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3230: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
3240: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P4_FUNCDEF: {.
3250: 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65          freeEphe
3260: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
3270: 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b  , (FuncDef*)p4);
3280: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3290: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
32a0: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
32b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
32c0: 65 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76  eFree((sqlite3_v
32d0: 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20  alue*)p4);.     
32e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
32f0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
3300: 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20 20  VTAB : {.       
3310: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
3320: 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29  ck((VTable *)p4)
3330: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3340: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
3350: 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  ase P4_SUBPROGRA
3360: 4d 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  M : {.        sq
3370: 6c 69 74 65 33 56 64 62 65 50 72 6f 67 72 61 6d  lite3VdbeProgram
3380: 44 65 6c 65 74 65 28 64 62 2c 20 28 53 75 62 50  Delete(db, (SubP
3390: 72 6f 67 72 61 6d 20 2a 29 70 34 2c 20 31 29 3b  rogram *)p4, 1);
33a0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
33b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
33c0: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
33d0: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
33e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70  (sqlite3 *db, Op
33f0: 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b   *aOp, int nOp){
3400: 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20  .  if( aOp ){.  
3410: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66    Op *pOp;.    f
3420: 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c  or(pOp=aOp; pOp<
3430: 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b  &aOp[nOp]; pOp++
3440: 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28  ){.      freeP4(
3450: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
3460: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66   pOp->p4.p);.#if
3470: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3480: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
3490: 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43  Free(db, pOp->zC
34a0: 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20  omment);.#endif 
34b0: 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20      .    }.  }. 
34c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
34d0: 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 76 6f 69 64  b, aOp);.}..void
34e0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 6f 67   sqlite3VdbeProg
34f0: 72 61 6d 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ramDelete(sqlite
3500: 33 20 2a 64 62 2c 20 53 75 62 50 72 6f 67 72 61  3 *db, SubProgra
3510: 6d 20 2a 70 2c 20 69 6e 74 20 66 72 65 65 6f 70  m *p, int freeop
3520: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
3530: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
3540: 66 3e 30 20 29 3b 0a 20 20 20 20 69 66 28 20 66  f>0 );.    if( f
3550: 72 65 65 6f 70 20 7c 7c 20 70 2d 3e 6e 52 65 66  reeop || p->nRef
3560: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 4f 70 20  ==1 ){.      Op 
3570: 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20  *aOp = p->aOp;. 
3580: 20 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b       p->aOp = 0;
3590: 0a 20 20 20 20 20 20 76 64 62 65 46 72 65 65 4f  .      vdbeFreeO
35a0: 70 41 72 72 61 79 28 64 62 2c 20 61 4f 70 2c 20  pArray(db, aOp, 
35b0: 70 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 20 20 70  p->nOp);.      p
35c0: 2d 3e 6e 4f 70 20 3d 20 30 3b 0a 20 20 20 20 7d  ->nOp = 0;.    }
35d0: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a  .    p->nRef--;.
35e0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
35f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
3600: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
3610: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  ;.    }.  }.}...
3620: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f  /*.** Change N o
3630: 70 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20  pcodes starting 
3640: 61 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70  at addr to No-op
3650: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
3660: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
3670: 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  op(Vdbe *p, int 
3680: 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  addr, int N){.  
3690: 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20  if( p->aOp ){.  
36a0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
36b0: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
36c0: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
36d0: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 77 68 69 6c   p->db;.    whil
36e0: 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20  e( N-- ){.      
36f0: 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e  freeP4(db, pOp->
3700: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
3710: 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  p);.      memset
3720: 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (pOp, 0, sizeof(
3730: 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  pOp[0]));.      
3740: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
3750: 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f 70  _Noop;.      pOp
3760: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ++;.    }.  }.}.
3770: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
3780: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
3790: 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  4 operand for a 
37a0: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
37b0: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
37c0: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
37d0: 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f  when a large pro
37e0: 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66  gram is loaded f
37f0: 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20  rom a.** static 
3800: 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69  array using sqli
3810: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
3820: 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   but we want to 
3830: 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69  make a.** few mi
3840: 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74  nor changes to t
3850: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a  he program..**.*
3860: 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74  * If n>=0 then t
3870: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73  he P4 operand is
3880: 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e   dynamic, meanin
3890: 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66  g that a copy of
38a0: 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69  .** the string i
38b0: 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f  s made into memo
38c0: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
38d0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
38e0: 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66  )..** A value of
38f0: 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79   n==0 means copy
3900: 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70   bytes of zP4 up
3910: 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e   to and includin
3920: 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e  g the.** first n
3930: 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e  ull byte.  If n>
3940: 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20  0 then copy n+1 
3950: 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a  bytes of zP4..**
3960: 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45 59  .** If n==P4_KEY
3970: 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68  INFO it means th
3980: 61 74 20 7a 50 34 20 69 73 20 61 20 70 6f 69 6e  at zP4 is a poin
3990: 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  ter to a KeyInfo
39a0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41   structure..** A
39b0: 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
39c0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
39d0: 75 63 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f  ucture into memo
39e0: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
39f0: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
3a00: 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20  oc, to be freed 
3a10: 77 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73  when the Vdbe is
3a20: 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e   finalized..** n
3a30: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  ==P4_KEYINFO_HAN
3a40: 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73 20 74  DOFF indicates t
3a50: 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 20 74  hat zP4 points t
3a60: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  o a KeyInfo stru
3a70: 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20  cture.** stored 
3a80: 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74  in memory that t
3a90: 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62  he caller has ob
3aa0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
3ab0: 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20  te3_malloc. The 
3ac0: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
3ad0: 64 20 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61  d not free the a
3ae0: 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69  llocation, it wi
3af0: 6c 6c 20 62 65 20 66 72 65 65 64 20 77 68 65 6e  ll be freed when
3b00: 20 74 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20   the Vdbe is.** 
3b10: 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a  finalized..** .*
3b20: 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  * Other values o
3b30: 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20  f n (P4_STATIC, 
3b40: 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29  P4_COLLSEQ etc.)
3b50: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a   indicate that z
3b60: 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  P4 points.** to 
3b70: 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75  a string or stru
3b80: 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75  cture that is gu
3b90: 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73  aranteed to exis
3ba0: 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69  t for the lifeti
3bb0: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62  me of.** the Vdb
3bc0: 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  e. In these case
3bd0: 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f  s we can just co
3be0: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a  py the pointer..
3bf0: 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20  **.** If addr<0 
3c00: 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f  then change P4 o
3c10: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
3c20: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73  tly inserted ins
3c30: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
3c40: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
3c50: 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69  ngeP4(Vdbe *p, i
3c60: 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63  nt addr, const c
3c70: 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29  har *zP4, int n)
3c80: 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73  {.  Op *pOp;.  s
3c90: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73  qlite3 *db;.  as
3ca0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
3cb0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
3cc0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
3cd0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3ce0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d  );.  if( p->aOp=
3cf0: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
3d00: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66  Failed ){.    if
3d10: 20 28 20 6e 21 3d 50 34 5f 4b 45 59 49 4e 46 4f   ( n!=P4_KEYINFO
3d20: 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42 20 29   && n!=P4_VTAB )
3d30: 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28   {.      freeP4(
3d40: 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28  db, n, (void*)*(
3d50: 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20  char**)&zP4);.  
3d60: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a    }.    return;.
3d70: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
3d80: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65  >nOp>0 );.  asse
3d90: 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20  rt( addr<p->nOp 
3da0: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
3db0: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
3dc0: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  >nOp - 1;.  }.  
3dd0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
3de0: 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 64 62  dr];.  freeP4(db
3df0: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
3e00: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70  Op->p4.p);.  pOp
3e10: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66  ->p4.p = 0;.  if
3e20: 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b  ( n==P4_INT32 ){
3e30: 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68  .    /* Note: th
3e40: 69 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c  is cast is safe,
3e50: 20 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69   because the ori
3e60: 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77  gin data point w
3e70: 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a  as an int.    **
3e80: 20 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74   that was cast t
3e90: 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20  o a (const char 
3ea0: 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e  *). */.    pOp->
3eb0: 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54  p4.i = SQLITE_PT
3ec0: 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20  R_TO_INT(zP4);. 
3ed0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3ee0: 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c   P4_INT32;.  }el
3ef0: 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b  se if( zP4==0 ){
3f00: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
3f10: 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74   0;.    pOp->p4t
3f20: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
3f30: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  ;.  }else if( n=
3f40: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20  =P4_KEYINFO ){. 
3f50: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
3f60: 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46  Info;.    int nF
3f70: 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20  ield, nByte;..  
3f80: 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65 79    nField = ((Key
3f90: 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69 65  Info*)zP4)->nFie
3fa0: 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  ld;.    nByte = 
3fb0: 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
3fc0: 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73  ) + (nField-1)*s
3fd0: 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e  izeof(pKeyInfo->
3fe0: 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65  aColl[0]) + nFie
3ff0: 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  ld;.    pKeyInfo
4000: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
4010: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 70  ( nByte );.    p
4020: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20  Op->p4.pKeyInfo 
4030: 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  = pKeyInfo;.    
4040: 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
4050: 20 20 20 20 20 20 75 38 20 2a 61 53 6f 72 74 4f        u8 *aSortO
4060: 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63  rder;.      memc
4070: 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 34  py(pKeyInfo, zP4
4080: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
4090: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65  aSortOrder = pKe
40a0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
40b0: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 6f  r;.      if( aSo
40c0: 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20  rtOrder ){.     
40d0: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f     pKeyInfo->aSo
40e0: 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69 67  rtOrder = (unsig
40f0: 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79 49  ned char*)&pKeyI
4100: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c  nfo->aColl[nFiel
4110: 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  d];.        memc
4120: 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  py(pKeyInfo->aSo
4130: 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f 72  rtOrder, aSortOr
4140: 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20  der, nField);.  
4150: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 2d      }.      pOp-
4160: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59  >p4type = P4_KEY
4170: 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  INFO;.    }else{
4180: 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61  .      p->db->ma
4190: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
41a0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70        pOp->p4typ
41b0: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
41c0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
41d0: 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f  ( n==P4_KEYINFO_
41e0: 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20 70  HANDOFF ){.    p
41f0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
4200: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
4210: 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49  p4type = P4_KEYI
4220: 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NFO;.  }else if(
4230: 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20   n==P4_VTAB ){. 
4240: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
4250: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
4260: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
4270: 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65  VTAB;.    sqlite
4280: 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c  3VtabLock((VTabl
4290: 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73  e *)zP4);.    as
42a0: 73 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a  sert( ((VTable *
42b0: 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62  )zP4)->db==p->db
42c0: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
42d0: 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  n<0 ){.    pOp->
42e0: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
42f0: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
4300: 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  pe = (signed cha
4310: 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r)n;.  }else{.  
4320: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d    if( n==0 ) n =
4330: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
4340: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
4350: 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62  p4.z = sqlite3Db
4360: 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a  StrNDup(p->db, z
4370: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d  P4, n);.    pOp-
4380: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
4390: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  AMIC;.  }.}..#if
43a0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
43b0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d  * Change the com
43c0: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74 68 65 20  ment on the the 
43d0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f  most recently co
43e0: 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ded instruction.
43f0: 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61    Or.** insert a
4400: 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74   No-op and add t
4410: 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68  he comment to th
4420: 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69  at new instructi
4430: 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b  on.  This.** mak
4440: 65 73 20 74 68 65 20 63 6f 64 65 20 65 61 73 69  es the code easi
4450: 65 72 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e  er to read durin
4460: 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f  g debugging.  No
4470: 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70 70 65  ne of this happe
4480: 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75  ns.** in a produ
4490: 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a  ction build..*/.
44a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
44b0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
44c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
44d0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
44e0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
44f0: 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  !p ) return;.  a
4500: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
4510: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a  || p->aOp==0 );.
4520: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
4530: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d  ==0 || p->aOp[p-
4540: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
4550: 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  ==0 || p->db->ma
4560: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
4570: 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  if( p->nOp ){.  
4580: 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70    char **pz = &p
4590: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
45a0: 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61  zComment;.    va
45b0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
45c0: 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  at);.    sqlite3
45d0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a 70  DbFree(p->db, *p
45e0: 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71  z);.    *pz = sq
45f0: 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d  lite3VMPrintf(p-
4600: 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  >db, zFormat, ap
4610: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
4620: 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
4630: 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d  lite3VdbeNoopCom
4640: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
4650: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
4660: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
4670: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 21 70 20  st ap;.  if( !p 
4680: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
4690: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c  te3VdbeAddOp0(p,
46a0: 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 61 73 73   OP_Noop);.  ass
46b0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c  ert( p->nOp>0 ||
46c0: 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20   p->aOp==0 );.  
46d0: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d  assert( p->aOp==
46e0: 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  0 || p->aOp[p->n
46f0: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d  Op-1].zComment==
4700: 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  0 || p->db->mall
4710: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
4720: 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20  ( p->nOp ){.    
4730: 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e  char **pz = &p->
4740: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
4750: 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73  omment;.    va_s
4760: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
4770: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
4780: 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a 29  Free(p->db, *pz)
4790: 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69  ;.    *pz = sqli
47a0: 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64  te3VMPrintf(p->d
47b0: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  b, zFormat, ap);
47c0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
47d0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f  .  }.}.#endif  /
47e0: 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  * NDEBUG */../*.
47f0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  ** Return the op
4800: 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e  code for a given
4810: 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68   address.  If th
4820: 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c  e address is -1,
4830: 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20   then.** return 
4840: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
4850: 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64  y inserted opcod
4860: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  e..**.** If a me
4870: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
4880: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
4890: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
48a0: 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a  calling of this.
48b0: 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  ** routine, then
48c0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
48d0: 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c  dummy VdbeOp wil
48e0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  l be returned.  
48f0: 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69  That opcode.** i
4900: 73 20 72 65 61 64 61 62 6c 65 20 61 6e 64 20 77  s readable and w
4910: 72 69 74 61 62 6c 65 2c 20 62 75 74 20 69 74 20  ritable, but it 
4920: 68 61 73 20 6e 6f 20 65 66 66 65 63 74 2e 20 20  has no effect.  
4930: 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20  The return of a 
4940: 64 75 6d 6d 79 0a 2a 2a 20 6f 70 63 6f 64 65 20  dummy.** opcode 
4950: 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20  allows the call 
4960: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63  to continue func
4970: 74 69 6f 6e 69 6e 67 20 61 66 74 65 72 20 61 20  tioning after a 
4980: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
4990: 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 63  t.** having to c
49a0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
49b0: 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  he return from t
49c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
49d0: 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a   valid pointer..
49e0: 2a 2a 0a 2a 2a 20 41 62 6f 75 74 20 74 68 65 20  **.** About the 
49f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
4a00: 49 54 5f 54 52 41 43 45 3a 20 20 4e 6f 72 6d 61  IT_TRACE:  Norma
4a10: 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lly, this routin
4a20: 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
4a30: 64 0a 2a 2a 20 75 6e 6c 65 73 73 20 70 2d 3e 6e  d.** unless p->n
4a40: 4f 70 3e 30 2e 20 20 54 68 69 73 20 69 73 20 62  Op>0.  This is b
4a50: 65 63 61 75 73 65 20 69 6e 20 74 68 65 20 61 62  ecause in the ab
4a60: 73 65 6e 73 65 20 6f 66 20 53 51 4c 49 54 45 5f  sense of SQLITE_
4a70: 4f 4d 49 54 5f 54 52 41 43 45 2c 0a 2a 2a 20 61  OMIT_TRACE,.** a
4a80: 6e 20 4f 50 5f 54 72 61 63 65 20 69 6e 73 74 72  n OP_Trace instr
4a90: 75 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  uction is always
4aa0: 20 69 6e 73 65 72 74 65 64 20 62 79 20 73 71 6c   inserted by sql
4ab0: 69 74 65 33 56 64 62 65 47 65 74 28 29 20 61 73  ite3VdbeGet() as
4ac0: 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e 65   soon as.** a ne
4ad0: 77 20 56 44 42 45 20 69 73 20 63 72 65 61 74 65  w VDBE is create
4ae0: 64 2e 20 20 53 6f 20 77 65 20 61 72 65 20 66 72  d.  So we are fr
4af0: 65 65 20 74 6f 20 73 65 74 20 61 64 64 72 20 74  ee to set addr t
4b00: 6f 20 70 2d 3e 6e 4f 70 2d 31 20 77 69 74 68 6f  o p->nOp-1 witho
4b10: 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20  ut.** having to 
4b20: 64 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 6f 20  double-check to 
4b30: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
4b40: 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 6e  he result is non
4b50: 2d 6e 65 67 61 74 69 76 65 2e 20 42 75 74 0a 2a  -negative. But.*
4b60: 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  * if SQLITE_OMIT
4b70: 5f 54 52 41 43 45 20 69 73 20 64 65 66 69 6e 65  _TRACE is define
4b80: 64 2c 20 74 68 65 20 4f 50 5f 54 72 61 63 65 20  d, the OP_Trace 
4b90: 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 77  is omitted and w
4ba0: 65 20 64 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a 20  e do need to.** 
4bb0: 63 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65 20  check the value 
4bc0: 6f 66 20 70 2d 3e 6e 4f 70 2d 31 20 62 65 66 6f  of p->nOp-1 befo
4bd0: 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a  re continuing..*
4be0: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
4bf0: 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20  3VdbeGetOp(Vdbe 
4c00: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
4c10: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64   static VdbeOp d
4c20: 75 6d 6d 79 3b 0a 20 20 61 73 73 65 72 74 28 20  ummy;.  assert( 
4c30: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
4c40: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
4c50: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 23 69 66  f( addr<0 ){.#if
4c60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4c70: 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 70 2d  TRACE.    if( p-
4c80: 3e 6e 4f 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  >nOp==0 ) return
4c90: 20 26 64 75 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a   &dummy;.#endif.
4ca0: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
4cb0: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  p - 1;.  }.  ass
4cc0: 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26  ert( (addr>=0 &&
4cd0: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c   addr<p->nOp) ||
4ce0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
4cf0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
4d00: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
4d10: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
4d20: 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b  &dummy;.  }else{
4d30: 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e  .    return &p->
4d40: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d  aOp[addr];.  }.}
4d50: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
4d60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
4d70: 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  IN) || !defined(
4d80: 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c  NDEBUG) \.     |
4d90: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
4da0: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
4db0: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
4dc0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
4dd0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
4de0: 63 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61  cribes the P4 pa
4df0: 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f  rameter for an o
4e00: 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54  pcode..** Use zT
4e10: 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75  emp for any requ
4e20: 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62  ired temporary b
4e30: 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a  uffer space..*/.
4e40: 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73  static char *dis
4e50: 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20  playP4(Op *pOp, 
4e60: 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74  char *zTemp, int
4e70: 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20   nTemp){.  char 
4e80: 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  *zP4 = zTemp;.  
4e90: 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32  assert( nTemp>=2
4ea0: 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  0 );.  switch( p
4eb0: 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20  Op->p4type ){.  
4ec0: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
4ed0: 4f 5f 53 54 41 54 49 43 3a 0a 20 20 20 20 63 61  O_STATIC:.    ca
4ee0: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
4ef0: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  .      int i, j;
4f00: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
4f10: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
4f20: 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
4f30: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
4f40: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4f50: 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20  , "keyinfo(%d", 
4f60: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
4f70: 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c  );.      i = sql
4f80: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
4f90: 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  mp);.      for(j
4fa0: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
4fb0: 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  nField; j++){.  
4fc0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
4fd0: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
4fe0: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
4ff0: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
5000: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20            int n 
5010: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
5020: 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  0(pColl->zName);
5030: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
5040: 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20  +n>nTemp-6 ){.  
5050: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
5060: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e  (&zTemp[i],",...
5070: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",4);.          
5080: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5090: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
50a0: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b  Temp[i++] = ',';
50b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
50c0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
50d0: 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d  der && pKeyInfo-
50e0: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29  >aSortOrder[j] )
50f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
5100: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a  emp[i++] = '-';.
5110: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5120: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
5130: 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a  emp[i], pColl->z
5140: 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20  Name,n+1);.     
5150: 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20       i += n;.   
5160: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
5170: 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20  +4<nTemp-6 ){.  
5180: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
5190: 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c  zTemp[i],",nil",
51a0: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  4);.          i 
51b0: 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += 4;.        }.
51c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
51d0: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a  emp[i++] = ')';.
51e0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d        zTemp[i] =
51f0: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
5200: 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20  ( i<nTemp );.   
5210: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5220: 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c      case P4_COLL
5230: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
5240: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f  lSeq *pColl = pO
5250: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20  p->p4.pColl;.   
5260: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
5270: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
5280: 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73  , "collseq(%.20s
5290: 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  )", pColl->zName
52a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
52b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
52c0: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
52d0: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
52e0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63   = pOp->p4.pFunc
52f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5300: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
5310: 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c  zTemp, "%s(%d)",
5320: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
5330: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
5340: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5350: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a    case P4_INT64:
5360: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
5370: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
5380: 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20   zTemp, "%lld", 
5390: 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a  *pOp->p4.pI64);.
53a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
53b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
53c0: 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT32: {.      sq
53d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
53e0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64  Temp, zTemp, "%d
53f0: 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20  ", pOp->p4.i);. 
5400: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5410: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45  }.    case P4_RE
5420: 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AL: {.      sqli
5430: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
5440: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36  mp, zTemp, "%.16
5450: 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65  g", *pOp->p4.pRe
5460: 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  al);.      break
5470: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
5480: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
5490: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70   Mem *pMem = pOp
54a0: 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20  ->p4.pMem;.     
54b0: 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e   assert( (pMem->
54c0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
54d0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
54e0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
54f0: 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20  MEM_Str ){.     
5500: 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a     zP4 = pMem->z
5510: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
5520: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
5530: 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20  MEM_Int ){.     
5540: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
5550: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
5560: 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e  , "%lld", pMem->
5570: 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.i);.      }els
5580: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
5590: 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  s & MEM_Real ){.
55a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
55b0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
55c0: 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20  zTemp, "%.16g", 
55d0: 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20  pMem->r);.      
55e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
55f0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61  ssert( pMem->fla
5600: 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
5610: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22  .        zP4 = "
5620: 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d  (blob)";.      }
5630: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5640: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
5650: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
5660: 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34  ABLE.    case P4
5670: 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
5680: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
5690: 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74  ab = pOp->p4.pVt
56a0: 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20  ab->pVtab;.     
56b0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
56c0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
56d0: 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56  "vtab:%p:%p", pV
56e0: 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64  tab, pVtab->pMod
56f0: 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ule);.      brea
5700: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
5710: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
5720: 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71  RRAY: {.      sq
5730: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
5740: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e  Temp, zTemp, "in
5750: 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20  tarray");.      
5760: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5770: 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47   case P4_SUBPROG
5780: 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RAM: {.      sql
5790: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
57a0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f  emp, zTemp, "pro
57b0: 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72  gram");.      br
57c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
57d0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
57e0: 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  zP4 = pOp->p4.z;
57f0: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d  .      if( zP4==
5800: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  0 ){.        zP4
5810: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
5820: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
5830: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5840: 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21  }.  assert( zP4!
5850: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  =0 );.  return z
5860: 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  P4;.}.#endif../*
5870: 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74  .** Declare to t
5880: 68 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65  he Vdbe that the
5890: 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74   BTree object at
58a0: 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75   db->aDb[i] is u
58b0: 73 65 64 2e 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20  sed..**.*/.void 
58c0: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
58d0: 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  tree(Vdbe *p, in
58e0: 74 20 69 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b  t i){.  int mask
58f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ;.  assert( i>=0
5900: 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62   && i<p->db->nDb
5910: 20 26 26 20 69 3c 73 69 7a 65 6f 66 28 75 33 32   && i<sizeof(u32
5920: 29 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28  )*8 );.  assert(
5930: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70   i<(int)sizeof(p
5940: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29  ->btreeMask)*8 )
5950: 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 28 75 33 32  ;.  mask = ((u32
5960: 29 31 29 3c 3c 69 3b 0a 20 20 69 66 28 20 28 70  )1)<<i;.  if( (p
5970: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 6d 61  ->btreeMask & ma
5980: 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  sk)==0 ){.    p-
5990: 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 6d 61  >btreeMask |= ma
59a0: 73 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  sk;.    sqlite3B
59b0: 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 49 6e  treeMutexArrayIn
59c0: 73 65 72 74 28 26 70 2d 3e 61 4d 75 74 65 78 2c  sert(&p->aMutex,
59d0: 20 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70   p->db->aDb[i].p
59e0: 42 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66  Bt);.  }.}...#if
59f0: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
5a00: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
5a10: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
5a20: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69  /*.** Print a si
5a30: 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68  ngle opcode.  Th
5a40: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
5a50: 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
5a60: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73   only..*/.void s
5a70: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
5a80: 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e  p(FILE *pOut, in
5a90: 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a  t pc, Op *pOp){.
5aa0: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63    char *zP4;.  c
5ab0: 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20  har zPtr[50];.  
5ac0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5ad0: 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25  r *zFormat1 = "%
5ae0: 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64  4d %-13s %4d %4d
5af0: 20 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20 25   %4d %-4s %.2X %
5b00: 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74  s\n";.  if( pOut
5b10: 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64  ==0 ) pOut = std
5b20: 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73  out;.  zP4 = dis
5b30: 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72  playP4(pOp, zPtr
5b40: 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b  , sizeof(zPtr));
5b50: 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c  .  fprintf(pOut,
5b60: 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a   zFormat1, pc, .
5b70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63        sqlite3Opc
5b80: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
5b90: 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  ode), pOp->p1, p
5ba0: 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c  Op->p2, pOp->p3,
5bb0: 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23   zP4, pOp->p5,.#
5bc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
5bd0: 55 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43  UG.      pOp->zC
5be0: 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43  omment ? pOp->zC
5bf0: 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73  omment : "".#els
5c00: 65 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64 69  e.      "".#endi
5c10: 66 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28  f.  );.  fflush(
5c20: 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pOut);.}.#endif.
5c30: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
5c40: 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d  n array of N Mem
5c50: 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61   elements.*/.sta
5c60: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
5c70: 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c  MemArray(Mem *p,
5c80: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70   int N){.  if( p
5c90: 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d   && N ){.    Mem
5ca0: 20 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69   *pEnd;.    sqli
5cb0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
5cc0: 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66  .    u8 malloc_f
5cd0: 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c  ailed = db->mall
5ce0: 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 66 6f  ocFailed;.    fo
5cf0: 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c  r(pEnd=&p[N]; p<
5d00: 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20  pEnd; p++){.    
5d10: 20 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d    assert( (&p[1]
5d20: 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e  )==pEnd || p[0].
5d30: 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a  db==p[1].db );..
5d40: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
5d50: 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e  ock is really an
5d60: 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e   inlined version
5d70: 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d   of sqlite3VdbeM
5d80: 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20  emRelease().    
5d90: 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20    ** that takes 
5da0: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65  advantage of the
5db0: 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d   fact that the m
5dc0: 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65  emory cell value
5dd0: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65   is .      ** be
5de0: 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20  ing set to NULL 
5df0: 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20  after releasing 
5e00: 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f  any dynamic reso
5e10: 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a  urces..      **.
5e20: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73        ** The jus
5e30: 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64  tification for d
5e40: 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20  uplicating code 
5e50: 69 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e  is that accordin
5e60: 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63  g to .      ** c
5e70: 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63  allgrind, this c
5e80: 61 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20  auses a certain 
5e90: 74 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74  test case to hit
5ea0: 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20   the CPU 4.7 .  
5eb0: 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c      ** percent l
5ec0: 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20  ess (x86 linux, 
5ed0: 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e  gcc version 4.1.
5ee0: 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20  2, -O6) than if 
5ef0: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
5f00: 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65  3MemRelease() we
5f10: 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68  re called from h
5f20: 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74  ere. With -O2, t
5f30: 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20  his jumps.      
5f40: 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e  ** to 6.6 percen
5f50: 74 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65  t. The test case
5f60: 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30   is inserting 10
5f70: 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74  00 rows into a t
5f80: 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77  able .      ** w
5f90: 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75  ith no indexes u
5fa0: 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72  sing a single pr
5fb0: 65 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74  epared INSERT st
5fc0: 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20  atement, bind() 
5fd0: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
5fe0: 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61  set(). Inserts a
5ff0: 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20  re grouped into 
6000: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  a transaction.. 
6010: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
6020: 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f  ( p->flags&(MEM_
6030: 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f  Agg|MEM_Dyn|MEM_
6040: 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74  Frame|MEM_RowSet
6050: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
6060: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
6070: 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  se(p);.      }el
6080: 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f  se if( p->zMallo
6090: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  c ){.        sql
60a0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
60b0: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
60c0: 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d      p->zMalloc =
60d0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
60e0: 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45     p->flags = ME
60f0: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  M_Null;.    }.  
6100: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
6110: 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ed = malloc_fail
6120: 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20  ed;.  }.}..void 
6130: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
6140: 44 65 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65  Delete(VdbeFrame
6150: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
6160: 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62   Mem *aMem = Vdb
6170: 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20  eFrameMem(p);.  
6180: 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43  VdbeCursor **apC
6190: 73 72 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72  sr = (VdbeCursor
61a0: 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68   **)&aMem[p->nCh
61b0: 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69  ildMem];.  for(i
61c0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43  =0; i<p->nChildC
61d0: 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  sr; i++){.    sq
61e0: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
61f0: 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b  sor(p->v, apCsr[
6200: 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  i]);.  }.  relea
6210: 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c  seMemArray(aMem,
6220: 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a   p->nChildMem);.
6230: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6240: 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a  p->v->db, p);.}.
6250: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
6260: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
6270: 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c  NAGEMENT.int sql
6280: 69 74 65 33 56 64 62 65 52 65 6c 65 61 73 65 42  ite3VdbeReleaseB
6290: 75 66 66 65 72 73 28 56 64 62 65 20 2a 70 29 7b  uffers(Vdbe *p){
62a0: 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
62b0: 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 61 73   nFree = 0;.  as
62c0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
62d0: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
62e0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28  mutex) );.  for(
62f0: 69 69 3d 31 3b 20 69 69 3c 3d 70 2d 3e 6e 4d 65  ii=1; ii<=p->nMe
6300: 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  m; ii++){.    Me
6310: 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d  m *pMem = &p->aM
6320: 65 6d 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  em[ii];.    if( 
6330: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
6340: 4d 5f 52 6f 77 53 65 74 20 29 7b 0a 20 20 20 20  M_RowSet ){.    
6350: 20 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74 43    sqlite3RowSetC
6360: 6c 65 61 72 28 70 4d 65 6d 2d 3e 75 2e 70 52 6f  lear(pMem->u.pRo
6370: 77 53 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  wSet);.    }.   
6380: 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 20 26 26 20   if( pMem->z && 
6390: 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pMem->flags&MEM_
63a0: 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Dyn ){.      ass
63b0: 65 72 74 28 20 21 70 4d 65 6d 2d 3e 78 44 65 6c  ert( !pMem->xDel
63c0: 20 29 3b 0a 20 20 20 20 20 20 6e 46 72 65 65 20   );.      nFree 
63d0: 2b 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  += sqlite3DbMall
63e0: 6f 63 53 69 7a 65 28 70 4d 65 6d 2d 3e 64 62 2c  ocSize(pMem->db,
63f0: 20 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20   pMem->z);.     
6400: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
6410: 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20  elease(pMem);.  
6420: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6430: 20 6e 46 72 65 65 3b 0a 7d 0a 23 65 6e 64 69 66   nFree;.}.#endif
6440: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
6450: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
6460: 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69  .** Give a listi
6470: 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ng of the progra
6480: 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  m in the virtual
6490: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   machine..**.** 
64a0: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73  The interface is
64b0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
64c0: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
64d0: 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   But instead of.
64e0: 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  ** running the c
64f0: 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20  ode, it invokes 
6500: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63  the callback onc
6510: 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72  e for each instr
6520: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
6530: 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20  feature is used 
6540: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58  to implement "EX
6550: 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68  PLAIN"..**.** Wh
6560: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
6570: 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  , each instructi
6580: 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57  on is listed.  W
6590: 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69  hen.** p->explai
65a0: 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78  n==2, only OP_Ex
65b0: 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
65c0: 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e  ns are listed an
65d0: 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73  d these.** are s
65e0: 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72  hown in a differ
65f0: 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e  ent format.  p->
6600: 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73  explain==2 is us
6610: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a  ed to implement.
6620: 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  ** EXPLAIN QUERY
6630: 20 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   PLAN..*/.int sq
6640: 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20  lite3VdbeList(. 
6650: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
6660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
6670: 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69  e VDBE */.){.  i
6680: 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20  nt nRow;        
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66a0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
66b0: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 72  ber of rows to r
66c0: 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  eturn */.  int n
66d0: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
66e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62  /* Number of sub
6700: 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66  -vdbes seen so f
6710: 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72  ar */.  SubProgr
6720: 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20  am **apSub = 0; 
6730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6740: 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62  Array of sub-vdb
6750: 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75  es */.  Mem *pSu
6760: 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  b = 0;.  sqlite3
6770: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
6780: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
6790: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
67a0: 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 70 52  em *pMem = p->pR
67b0: 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61  esultSet = &p->a
67c0: 4d 65 6d 5b 31 5d 3b 0a 0a 20 20 61 73 73 65 72  Mem[1];..  asser
67d0: 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b  t( p->explain );
67e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
67f0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
6800: 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RUN );.  assert(
6810: 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49   db->magic==SQLI
6820: 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 3b  TE_MAGIC_BUSY );
6830: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
6840: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
6850: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
6860: 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  Y || p->rc==SQLI
6870: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f  TE_NOMEM );..  /
6880: 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
6890: 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e  is opcode does n
68a0: 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73  ot use dynamic s
68b0: 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20  trings for.  ** 
68c0: 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75  the result, resu
68d0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62  lt columns may b
68e0: 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66  ecome dynamic if
68f0: 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a   the user calls.
6900: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
6910: 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61  umn_text16(), ca
6920: 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74  using a translat
6930: 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e  ion to UTF-16 en
6940: 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72  coding..  */.  r
6950: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
6960: 4d 65 6d 2c 20 38 29 3b 0a 0a 20 20 69 66 28 20  Mem, 8);..  if( 
6970: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
6980: 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  MEM ){.    /* Th
6990: 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20  is happens if a 
69a0: 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20  malloc() inside 
69b0: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
69c0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20  3_column_text() 
69d0: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
69e0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
69f0: 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20  ) failed.  */.  
6a00: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
6a10: 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ed = 1;.    retu
6a20: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
6a30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
6a40: 65 20 6f 75 74 20 74 6f 74 61 6c 20 6e 75 6d 62  e out total numb
6a50: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
6a60: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
6a70: 20 62 79 20 74 68 69 73 20 0a 20 20 2a 2a 20 45   by this .  ** E
6a80: 58 50 4c 41 49 4e 20 70 72 6f 67 72 61 6d 2e 20  XPLAIN program. 
6a90: 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e   */.  nRow = p->
6aa0: 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78  nOp;.  if( p->ex
6ab0: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
6ac0: 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pSub = &p->aMem[
6ad0: 39 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62  9];.    if( pSub
6ae0: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62  ->flags&MEM_Blob
6af0: 20 29 7b 0a 20 20 20 20 20 20 6e 53 75 62 20 3d   ){.      nSub =
6b00: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28   pSub->n/sizeof(
6b10: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70  Vdbe*);.      ap
6b20: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
6b30: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
6b40: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
6b50: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20   i<nSub; i++){. 
6b60: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53       nRow += apS
6b70: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[i]->nOp;.    
6b80: 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  }.  }..  do{.   
6b90: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
6ba0: 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26  }while( i<nRow &
6bb0: 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  & p->explain==2 
6bc0: 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  && p->aOp[i].opc
6bd0: 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20  ode!=OP_Explain 
6be0: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77  );.  if( i>=nRow
6bf0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
6c00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
6c10: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
6c20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
6c30: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
6c40: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
6c50: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
6c60: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
6c70: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
6c80: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
6c90: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
6ca0: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
6cb0: 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d  Str(p->rc));.  }
6cc0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
6cd0: 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  z;.    Op *pOp;.
6ce0: 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70      if( i<p->nOp
6cf0: 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20   ){.      pOp = 
6d00: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  &p->aOp[i];.    
6d10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
6d20: 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70   j;.      i -= p
6d30: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72  ->nOp;.      for
6d40: 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a  (j=0; i>=apSub[j
6d50: 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20  ]->nOp; j++){.  
6d60: 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62        i -= apSub
6d70: 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20  [j]->nOp;.      
6d80: 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61  }.      pOp = &a
6d90: 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b  pSub[j]->aOp[i];
6da0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
6db0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
6dc0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
6dd0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
6de0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
6df0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
6e00: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
6e10: 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  = i;            
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e30: 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63      /* Program c
6e40: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
6e50: 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20  pMem++;.  .     
6e60: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
6e70: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74  EM_Static|MEM_St
6e80: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
6e90: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
6ea0: 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  r*)sqlite3Opcode
6eb0: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
6ec0: 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f  );  /* Opcode */
6ed0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
6ee0: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
6ef0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
6f00: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
6f10: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
6f20: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
6f30: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65  _TEXT;.      pMe
6f40: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
6f50: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  UTF8;.      pMem
6f60: 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  ++;..      if( p
6f70: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  Op->p4type==P4_S
6f80: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
6f90: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
6fa0: 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66   (nSub+1)*sizeof
6fb0: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
6fc0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
6fd0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
6fe0: 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nSub; j++){.   
6ff0: 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62         if( apSub
7000: 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72  [j]==pOp->p4.pPr
7010: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
7020: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7030: 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20   if( j==nSub && 
7040: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74  SQLITE_OK==sqlit
7050: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53  e3VdbeMemGrow(pS
7060: 75 62 2c 20 6e 42 79 74 65 2c 20 31 29 20 29 7b  ub, nByte, 1) ){
7070: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
7080: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
7090: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20  *)pSub->z;.     
70a0: 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b       apSub[nSub+
70b0: 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72  +] = pOp->p4.pPr
70c0: 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20  ogram;.         
70d0: 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20   pSub->flags |= 
70e0: 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20  MEM_Blob;.      
70f0: 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53      pSub->n = nS
7100: 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  ub*sizeof(SubPro
7110: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
7120: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
7130: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
7140: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
7150: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
7160: 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p1;            
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7180: 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d   P1 */.    pMem-
7190: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
71a0: 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d  NTEGER;.    pMem
71b0: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  ++;..    pMem->f
71c0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
71d0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
71e0: 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20  pOp->p2;        
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7200: 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70    /* P2 */.    p
7210: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
7220: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
7230: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
7240: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
7250: 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  {.      pMem->fl
7260: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
7270: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
7280: 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20   pOp->p3;       
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72a0: 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20     /* P3 */.    
72b0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
72c0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
72d0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20       pMem++;.   
72e0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69   }..    if( sqli
72f0: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
7300: 4d 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20  Mem, 32, 0) ){  
7310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20            /* P4 
7320: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
7330: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
7340: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
7350: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
7360: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  R;.    }.    pMe
7370: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44  m->flags = MEM_D
7380: 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  yn|MEM_Str|MEM_T
7390: 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73  erm;.    z = dis
73a0: 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d  playP4(pOp, pMem
73b0: 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66  ->z, 32);.    if
73c0: 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a  ( z!=pMem->z ){.
73d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
73e0: 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c  eMemSetStr(pMem,
73f0: 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55   z, -1, SQLITE_U
7400: 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  TF8, 0);.    }el
7410: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
7420: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
7430: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
7440: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
7450: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
7460: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
7470: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20  TE_UTF8;.    }. 
7480: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
7490: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
74a0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66   pMem++;..    if
74b0: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
74c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
74d0: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
74e0: 70 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20  pMem, 4, 0) ){. 
74f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7500: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
7510: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ed );.        re
7520: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
7530: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
7540: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
7550: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d  EM_Dyn|MEM_Str|M
7560: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
7570: 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20  Mem->n = 2;.    
7580: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7590: 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22  tf(3, pMem->z, "
75a0: 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b  %.2x", pOp->p5);
75b0: 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20     /* P5 */.    
75c0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
75d0: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
75e0: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
75f0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
7600: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64   pMem++;.  .#ifd
7610: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
7620: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a        if( pOp->z
7630: 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  Comment ){.     
7640: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
7650: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
7660: 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  m;.        pMem-
7670: 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  >z = pOp->zComme
7680: 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  nt;.        pMem
7690: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
76a0: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
76b0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e          pMem->en
76c0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
76d0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  .        pMem->t
76e0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
76f0: 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  T;.      }else.#
7700: 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
7710: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
7720: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20  s = MEM_Null;   
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a      /* Comment *
7750: 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /.        pMem->
7760: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55  type = SQLITE_NU
7770: 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
7780: 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f  }..    p->nResCo
7790: 6c 75 6d 6e 20 3d 20 38 20 2d 20 35 2a 28 70 2d  lumn = 8 - 5*(p-
77a0: 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20  >explain-1);.   
77b0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
77c0: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
77d0: 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72  ITE_ROW;.  }.  r
77e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
77f0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
7800: 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69  T_EXPLAIN */..#i
7810: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
7820: 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  G./*.** Print th
7830: 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75  e SQL that was u
7840: 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  sed to generate 
7850: 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a  a VDBE program..
7860: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
7870: 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65  dbePrintSql(Vdbe
7880: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
7890: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
78a0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e  Op *pOp;.  if( n
78b0: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
78c0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30   pOp = &p->aOp[0
78d0: 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  ];.  if( pOp->op
78e0: 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26  code==OP_Trace &
78f0: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
7900: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
7910: 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b   *z = pOp->p4.z;
7920: 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69  .    while( sqli
7930: 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29  te3Isspace(*z) )
7940: 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66   z++;.    printf
7950: 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20  ("SQL: [%s]\n", 
7960: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
7970: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
7980: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
7990: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
79a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
79b0: 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  CE)./*.** Print 
79c0: 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61  an IOTRACE messa
79d0: 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63  ge showing SQL c
79e0: 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ontent..*/.void 
79f0: 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61  sqlite3VdbeIOTra
7a00: 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ceSql(Vdbe *p){.
7a10: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e    int nOp = p->n
7a20: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  Op;.  VdbeOp *pO
7a30: 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  p;.  if( sqlite3
7a40: 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74  IoTrace==0 ) ret
7a50: 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31  urn;.  if( nOp<1
7a60: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70   ) return;.  pOp
7a70: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
7a80: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
7a90: 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f  ==OP_Trace && pO
7aa0: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
7ab0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
7ac0: 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20  char z[1000];.  
7ad0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7ae0: 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
7af0: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a   "%s", pOp->p4.z
7b00: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
7b10: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
7b20: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
7b30: 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20   for(j=0; z[i]; 
7b40: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
7b50: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
7b60: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
7b70: 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20  if( z[i-1]!=' ' 
7b80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  ){.          z[j
7b90: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
7ba0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
7bb0: 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  {.        z[j++]
7bc0: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d   = z[i];.      }
7bd0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20  .    }.    z[j] 
7be0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
7bf0: 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c  IoTrace("SQL %s\
7c00: 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65  n", z);.  }.}.#e
7c10: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
7c20: 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51  OMIT_TRACE && SQ
7c30: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
7c40: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ACE */../*.** Al
7c50: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 72 6f  locate space fro
7c60: 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65 20 62  m a fixed size b
7c70: 75 66 66 65 72 2e 20 20 4d 61 6b 65 20 2a 70 70  uffer.  Make *pp
7c80: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
7c90: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
7ca0: 2e 20 20 28 4e 6f 74 65 3a 20 20 70 70 20 69 73  .  (Note:  pp is
7cb0: 20 61 20 63 68 61 72 2a 20 72 61 74 68 65 72 20   a char* rather 
7cc0: 74 68 61 6e 20 61 20 76 6f 69 64 2a 2a 20 74 6f  than a void** to
7cd0: 0a 2a 2a 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20  .** work around 
7ce0: 74 68 65 20 70 6f 69 6e 74 65 72 20 61 6c 69 61  the pointer alia
7cf0: 73 69 6e 67 20 72 75 6c 65 73 20 6f 66 20 43 2e  sing rules of C.
7d00: 29 20 20 2a 70 70 20 73 68 6f 75 6c 64 20 69 6e  )  *pp should in
7d10: 69 74 69 61 6c 6c 79 0a 2a 2a 20 62 65 20 7a 65  itially.** be ze
7d20: 72 6f 2e 20 20 49 66 20 2a 70 70 20 69 73 20 6e  ro.  If *pp is n
7d30: 6f 74 20 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65  ot zero, that me
7d40: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 70 61  ans that the spa
7d50: 63 65 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  ce has already.*
7d60: 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  * been allocated
7d70: 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
7d80: 65 20 69 73 20 61 20 6e 6f 6f 70 2e 0a 2a 2a 0a  e is a noop..**.
7d90: 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65 20  ** nByte is the 
7da0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
7db0: 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e  of space needed.
7dc0: 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70  .**.** *ppFrom p
7dd0: 6f 69 6e 74 20 74 6f 20 61 76 61 69 6c 61 62 6c  oint to availabl
7de0: 65 20 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64  e space and pEnd
7df0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65   points to the e
7e00: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61  nd of the.** ava
7e10: 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 0a 2a 2a  ilable space..**
7e20: 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61  .** *pnByte is a
7e30: 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20   counter of the 
7e40: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
7e50: 6f 66 20 73 70 61 63 65 20 74 68 61 74 20 68 61  of space that ha
7e60: 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20  ve failed.** to 
7e70: 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68  allocate.  If th
7e80: 65 72 65 20 69 73 20 69 6e 73 75 66 66 69 63 69  ere is insuffici
7e90: 65 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70  ent space in *pp
7ea0: 46 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20  From to satisfy 
7eb0: 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20  the.** request, 
7ec0: 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a  then increment *
7ed0: 70 6e 42 79 74 65 20 62 79 20 74 68 65 20 61 6d  pnByte by the am
7ee0: 6f 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75  ount of the requ
7ef0: 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  est..*/.static v
7f00: 6f 69 64 20 61 6c 6c 6f 63 53 70 61 63 65 28 0a  oid allocSpace(.
7f10: 20 20 63 68 61 72 20 2a 70 70 2c 20 20 20 20 20    char *pp,     
7f20: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
7f30: 3a 20 53 65 74 20 2a 70 70 20 74 6f 20 70 6f 69  : Set *pp to poi
7f40: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 64 20  nt to allocated 
7f50: 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
7f60: 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
7f70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
7f80: 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
7f90: 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d  */.  u8 **ppFrom
7fa0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ,         /* IN/
7fb0: 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72  OUT: Allocate fr
7fc0: 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20  om *ppFrom */.  
7fd0: 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  u8 *pEnd,       
7fe0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
7ff0: 74 6f 20 31 20 62 79 74 65 20 70 61 73 74 20 74  to 1 byte past t
8000: 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f  he end of *ppFro
8010: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  m buffer */.  in
8020: 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20  t *pnByte       
8030: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74     /* If allocat
8040: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61  ion cannot be ma
8050: 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  de, increment *p
8060: 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  nByte */.){.  as
8070: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
8080: 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72  _ALIGNMENT(*ppFr
8090: 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 28 2a 28  om) );.  if( (*(
80a0: 76 6f 69 64 2a 2a 29 70 70 29 3d 3d 30 20 29 7b  void**)pp)==0 ){
80b0: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  .    nByte = ROU
80c0: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 20 20  ND8(nByte);.    
80d0: 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e  if( &(*ppFrom)[n
80e0: 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b  Byte] <= pEnd ){
80f0: 0a 20 20 20 20 20 20 2a 28 76 6f 69 64 2a 2a 29  .      *(void**)
8100: 70 70 20 3d 20 28 76 6f 69 64 20 2a 29 2a 70 70  pp = (void *)*pp
8110: 46 72 6f 6d 3b 0a 20 20 20 20 20 20 2a 70 70 46  From;.      *ppF
8120: 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  rom += nByte;.  
8130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
8140: 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b  pnByte += nByte;
8150: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
8160: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69  .** Prepare a vi
8170: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f  rtual machine fo
8180: 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54 68  r execution.  Th
8190: 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e  is involves thin
81a0: 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c  gs such.** as al
81b0: 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73  locating stack s
81c0: 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  pace and initial
81d0: 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61  izing the progra
81e0: 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66  m counter..** Af
81f0: 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73  ter the VDBE has
8200: 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20   be prepped, it 
8210: 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20  can be executed 
8220: 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a  by one or more.*
8230: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
8240: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a  e3VdbeExec().  .
8250: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  **.** This is th
8260: 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f  e only way to mo
8270: 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20 56  ve a VDBE from V
8280: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74  DBE_MAGIC_INIT t
8290: 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
82a0: 52 55 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  RUN..**.** This 
82b0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
82c0: 63 61 6c 6c 65 64 20 6d 6f 72 65 20 74 68 61 6e  called more than
82d0: 20 6f 6e 63 65 20 6f 6e 20 61 20 73 69 6e 67 6c   once on a singl
82e0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
82f0: 65 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  e..** The first 
8300: 63 61 6c 6c 20 69 73 20 6d 61 64 65 20 77 68 69  call is made whi
8310: 6c 65 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65  le compiling the
8320: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
8330: 53 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 63 61  Subsequent.** ca
8340: 6c 6c 73 20 61 72 65 20 6d 61 64 65 20 61 73 20  lls are made as 
8350: 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 6f 63  part of the proc
8360: 65 73 73 20 6f 66 20 72 65 73 65 74 74 69 6e 67  ess of resetting
8370: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20   a statement to 
8380: 62 65 0a 2a 2a 20 72 65 2d 65 78 65 63 75 74 65  be.** re-execute
8390: 64 20 28 66 72 6f 6d 20 61 20 63 61 6c 6c 20 74  d (from a call t
83a0: 6f 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  o sqlite3_reset(
83b0: 29 29 2e 20 54 68 65 20 6e 56 61 72 2c 20 6e 4d  )). The nVar, nM
83c0: 65 6d 2c 20 6e 43 75 72 73 6f 72 20 0a 2a 2a 20  em, nCursor .** 
83d0: 61 6e 64 20 69 73 45 78 70 6c 61 69 6e 20 70 61  and isExplain pa
83e0: 72 61 6d 65 74 65 72 73 20 61 72 65 20 6f 6e 6c  rameters are onl
83f0: 79 20 70 61 73 73 65 64 20 63 6f 72 72 65 63 74  y passed correct
8400: 20 76 61 6c 75 65 73 20 74 68 65 20 66 69 72 73   values the firs
8410: 74 20 74 69 6d 65 0a 2a 2a 20 74 68 65 20 66 75  t time.** the fu
8420: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
8430: 2e 20 4f 6e 20 73 75 62 73 65 71 75 65 6e 74 20  . On subsequent 
8440: 63 61 6c 6c 73 2c 20 66 72 6f 6d 20 73 71 6c 69  calls, from sqli
8450: 74 65 33 5f 72 65 73 65 74 28 29 2c 20 6e 56 61  te3_reset(), nVa
8460: 72 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 2d  r.** is passed -
8470: 31 20 61 6e 64 20 6e 4d 65 6d 2c 20 6e 43 75 72  1 and nMem, nCur
8480: 73 6f 72 20 61 6e 64 20 69 73 45 78 70 6c 61 69  sor and isExplai
8490: 6e 20 61 72 65 20 61 6c 6c 20 70 61 73 73 65 64  n are all passed
84a0: 20 7a 65 72 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73   zero..*/.void s
84b0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
84c0: 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ady(.  Vdbe *p, 
84d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
84f0: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c  E */.  int nVar,
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8520: 6f 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68  of '?' see in th
8530: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
8540: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20  */.  int nMem,  
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8560: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8570: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f   memory cells to
8580: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69   allocate */.  i
8590: 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20  nt nCursor,     
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
85b0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   Number of curso
85c0: 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
85d0: 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85f0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
8600: 6d 62 65 72 20 6f 66 20 61 72 67 73 20 69 6e 20  mber of args in 
8610: 53 75 62 50 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  SubPrograms */. 
8620: 20 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 20 20   int isExplain  
8630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8640: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 45  /* True if the E
8650: 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73 20  XPLAIN keywords 
8660: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b  is present */.){
8670: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
8680: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
8690: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
86a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
86b0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
86c0: 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a  IC_INIT );..  /*
86d0: 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   There should be
86e0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70   at least one op
86f0: 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  code..  */.  ass
8700: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
8710: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d  ..  /* Set the m
8720: 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47  agic to VDBE_MAG
8730: 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61  IC_RUN sooner ra
8740: 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e  ther than later.
8750: 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   */.  p->magic =
8760: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
8770: 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20  ..  /* For each 
8780: 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c  cursor required,
8790: 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61   also allocate a
87a0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65   memory cell. Me
87b0: 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  mory.  ** cells 
87c0: 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29  (nMem+1-nCursor)
87d0: 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76  ..nMem, inclusiv
87e0: 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  e, will never be
87f0: 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68   used by.  ** th
8800: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20  e vdbe program. 
8810: 49 6e 73 74 65 61 64 20 74 68 65 79 20 61 72 65  Instead they are
8820: 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
8830: 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a  e space for.  **
8840: 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75   VdbeCursor/BtCu
8850: 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e  rsor structures.
8860: 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   The blob of mem
8870: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
8880: 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72  ith .  ** cursor
8890: 20 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   0 is stored in 
88a0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d  memory cell nMem
88b0: 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e  . Memory cell (n
88c0: 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72  Mem-1).  ** stor
88d0: 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d  es the blob of m
88e0: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
88f0: 20 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20   with cursor 1, 
8900: 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  etc..  **.  ** S
8910: 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74  ee also: allocat
8920: 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a  eCursor()..  */.
8930: 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f    nMem += nCurso
8940: 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  r;..  /* Allocat
8950: 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f  e space for memo
8960: 72 79 20 72 65 67 69 73 74 65 72 73 2c 20 53 51  ry registers, SQ
8970: 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42  L variables, VDB
8980: 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20  E cursors and . 
8990: 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20   ** an array to 
89a0: 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63  marshal SQL func
89b0: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69  tion arguments i
89c0: 6e 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20  n. This is only 
89d0: 64 6f 6e 65 20 74 68 65 0a 20 20 2a 2a 20 66 69  done the.  ** fi
89e0: 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 66 75  rst time this fu
89f0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
8a00: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 56 44 42   for a given VDB
8a10: 45 2c 20 6e 6f 74 20 77 68 65 6e 20 69 74 20 69  E, not when it i
8a20: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 63 61 6c  s.  ** being cal
8a30: 6c 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  led from sqlite3
8a40: 5f 72 65 73 65 74 28 29 20 74 6f 20 72 65 73 65  _reset() to rese
8a50: 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  t the virtual ma
8a60: 63 68 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  chine..  */.  if
8a70: 28 20 6e 56 61 72 3e 3d 30 20 26 26 20 41 4c 57  ( nVar>=0 && ALW
8a80: 41 59 53 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  AYS(db->mallocFa
8a90: 69 6c 65 64 3d 3d 30 29 20 29 7b 0a 20 20 20 20  iled==0) ){.    
8aa0: 75 38 20 2a 7a 43 73 72 20 3d 20 28 75 38 20 2a  u8 *zCsr = (u8 *
8ab0: 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d  )&p->aOp[p->nOp]
8ac0: 3b 0a 20 20 20 20 75 38 20 2a 7a 45 6e 64 20 3d  ;.    u8 *zEnd =
8ad0: 20 28 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70   (u8 *)&p->aOp[p
8ae0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 0a 20 20 20  ->nOpAlloc];.   
8af0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20   int nByte;.    
8b00: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
8b10: 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20 20 69  p, &nArg);.    i
8b20: 66 28 20 69 73 45 78 70 6c 61 69 6e 20 26 26 20  f( isExplain && 
8b30: 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 20  nMem<10 ){.     
8b40: 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 20 20   nMem = 10;.    
8b50: 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 43 73  }.    memset(zCs
8b60: 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29  r, 0, zEnd-zCsr)
8b70: 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 28 7a  ;.    zCsr += (z
8b80: 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26 37 3b  Csr - (u8*)0)&7;
8b90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 45 49 47  .    assert( EIG
8ba0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
8bb0: 54 28 7a 43 73 72 29 20 29 3b 0a 0a 20 20 20 20  T(zCsr) );..    
8bc0: 64 6f 20 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  do {.      nByte
8bd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 6c 6c 6f   = 0;.      allo
8be0: 63 53 70 61 63 65 28 28 63 68 61 72 2a 29 26 70  cSpace((char*)&p
8bf0: 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a  ->aMem, nMem*siz
8c00: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
8c10: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
8c20: 20 20 20 20 20 20 61 6c 6c 6f 63 53 70 61 63 65        allocSpace
8c30: 28 28 63 68 61 72 2a 29 26 70 2d 3e 61 56 61 72  ((char*)&p->aVar
8c40: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65  , nVar*sizeof(Me
8c50: 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  m), &zCsr, zEnd,
8c60: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20   &nByte);.      
8c70: 61 6c 6c 6f 63 53 70 61 63 65 28 28 63 68 61 72  allocSpace((char
8c80: 2a 29 26 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72  *)&p->apArg, nAr
8c90: 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20  g*sizeof(Mem*), 
8ca0: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
8cb0: 79 74 65 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f  yte);.      allo
8cc0: 63 53 70 61 63 65 28 28 63 68 61 72 2a 29 26 70  cSpace((char*)&p
8cd0: 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69  ->azVar, nVar*si
8ce0: 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43  zeof(char*), &zC
8cf0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
8d00: 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 53 70  );.      allocSp
8d10: 61 63 65 28 28 63 68 61 72 2a 29 26 70 2d 3e 61  ace((char*)&p->a
8d20: 70 43 73 72 2c 20 0a 20 20 20 20 20 20 20 20 20  pCsr, .         
8d30: 20 20 20 20 20 20 20 20 6e 43 75 72 73 6f 72 2a          nCursor*
8d40: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
8d50: 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  r*), &zCsr, zEnd
8d60: 2c 20 26 6e 42 79 74 65 0a 20 20 20 20 20 20 29  , &nByte.      )
8d70: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 42 79 74  ;.      if( nByt
8d80: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  e ){.        p->
8d90: 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  pFree = sqlite3D
8da0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
8db0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nByte);.      }.
8dc0: 20 20 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e        zCsr = p->
8dd0: 70 46 72 65 65 3b 0a 20 20 20 20 20 20 7a 45 6e  pFree;.      zEn
8de0: 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d  d = &zCsr[nByte]
8df0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 42  ;.    }while( nB
8e00: 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  yte && !db->mall
8e10: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20  ocFailed );..   
8e20: 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75   p->nCursor = (u
8e30: 31 36 29 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20  16)nCursor;.    
8e40: 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20  if( p->aVar ){. 
8e50: 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28       p->nVar = (
8e60: 75 31 36 29 6e 56 61 72 3b 0a 20 20 20 20 20 20  u16)nVar;.      
8e70: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b  for(n=0; n<nVar;
8e80: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   n++){.        p
8e90: 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20  ->aVar[n].flags 
8ea0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
8eb0: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
8ec0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a  b = db;.      }.
8ed0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
8ee0: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 70  >aMem ){.      p
8ef0: 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20  ->aMem--;       
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8f10: 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72  * aMem[] goes fr
8f20: 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20  om 1..nMem */.  
8f30: 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
8f40: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
8f50: 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74      /*       not
8f60: 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20   from 0..nMem-1 
8f70: 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31  */.      for(n=1
8f80: 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b  ; n<=nMem; n++){
8f90: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  .        p->aMem
8fa0: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
8fb0: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d  Null;.        p-
8fc0: 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aMem[n].db = db
8fd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8fe0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
8ff0: 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 6e 3d  E_DEBUG.  for(n=
9000: 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b  1; n<p->nMem; n+
9010: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
9020: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64  p->aMem[n].db==d
9030: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
9040: 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20  .  p->pc = -1;. 
9050: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
9060: 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63  OK;.  p->errorAc
9070: 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
9080: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d  .  p->explain |=
9090: 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d   isExplain;.  p-
90a0: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
90b0: 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43  GIC_RUN;.  p->nC
90c0: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
90d0: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20  cacheCtr = 1;.  
90e0: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
90f0: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70  ormat = 255;.  p
9100: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
9110: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
9120: 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e  OFILE.  {.    in
9130: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
9140: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
9150: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69  {.      p->aOp[i
9160: 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  ].cnt = 0;.     
9170: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
9180: 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  s = 0;.    }.  }
9190: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
91a0: 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75   Close a VDBE cu
91b0: 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65  rsor and release
91c0: 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63   all the resourc
91d0: 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a  es that cursor .
91e0: 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f  ** happens to ho
91f0: 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
9200: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
9210: 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43  r(Vdbe *p, VdbeC
9220: 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69  ursor *pCx){.  i
9230: 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20  f( pCx==0 ){.   
9240: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
9250: 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20  f( pCx->pBt ){. 
9260: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
9270: 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a  lose(pCx->pBt);.
9280: 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e      /* The pCx->
9290: 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20  pCursor will be 
92a0: 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61  close automatica
92b0: 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74  lly, if it exist
92c0: 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65  s, by.    ** the
92d0: 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a   call above. */.
92e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d    }else if( pCx-
92f0: 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
9300: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
9310: 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75  eCursor(pCx->pCu
9320: 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  rsor);.  }.#ifnd
9330: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
9340: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
9350: 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  ( pCx->pVtabCurs
9360: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
9370: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
9380: 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78  VtabCursor = pCx
9390: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  ->pVtabCursor;. 
93a0: 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
93b0: 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
93c0: 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b   = pCx->pModule;
93d0: 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  .    p->inVtabMe
93e0: 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 28 76  thod = 1;.    (v
93f0: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
9400: 79 4f 66 66 28 70 2d 3e 64 62 29 3b 0a 20 20 20  yOff(p->db);.   
9410: 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
9420: 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20  (pVtabCursor);. 
9430: 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
9440: 53 61 66 65 74 79 4f 6e 28 70 2d 3e 64 62 29 3b  SafetyOn(p->db);
9450: 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  .    p->inVtabMe
9460: 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  thod = 0;.  }.#e
9470: 6e 64 69 66 0a 20 20 69 66 28 20 21 70 43 78 2d  ndif.  if( !pCx-
9480: 3e 65 70 68 65 6d 50 73 65 75 64 6f 54 61 62 6c  >ephemPseudoTabl
9490: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
94a0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 43  DbFree(p->db, pC
94b0: 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 7d  x->pData);.  }.}
94c0: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  ..int sqlite3Vdb
94d0: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64  eFrameRestore(Vd
94e0: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29  beFrame *pFrame)
94f0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46  {.  Vdbe *v = pF
9500: 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f  rame->v;.  v->aO
9510: 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b  p = pFrame->aOp;
9520: 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61  .  v->nOp = pFra
9530: 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d  me->nOp;.  v->aM
9540: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65  em = pFrame->aMe
9550: 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70  m;.  v->nMem = p
9560: 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76  Frame->nMem;.  v
9570: 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65  ->apCsr = pFrame
9580: 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43  ->apCsr;.  v->nC
9590: 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e  ursor = pFrame->
95a0: 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62  nCursor;.  v->db
95b0: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46  ->lastRowid = pF
95c0: 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b  rame->lastRowid;
95d0: 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  v->nChange = 
95e0: 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b  pFrame->nChange;
95f0: 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65  .  return pFrame
9600: 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ->pc;.}../*.** C
9610: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
9620: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c  ..**.** Also rel
9630: 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63  ease any dynamic
9640: 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
9650: 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64  the VM in the Vd
9660: 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a  be.aMem memory .
9670: 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54  ** cell array. T
9680: 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
9690: 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   as the memory c
96a0: 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f  ell array may co
96b0: 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72  ntain.** pointer
96c0: 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f  s to VdbeFrame o
96d0: 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61  bjects, which ma
96e0: 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69  y in turn contai
96f0: 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  n pointers to.**
9700: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a   open cursors..*
9710: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
9720: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64  oseAllCursors(Vd
9730: 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  be *p){.  if( p-
9740: 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  >pFrame ){.    V
9750: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
9760: 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20   = p->pFrame;.  
9770: 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e    for(pFrame=p->
9780: 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e  pFrame; pFrame->
9790: 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d  pParent; pFrame=
97a0: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29  pFrame->pParent)
97b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
97c0: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46  eFrameRestore(pF
97d0: 72 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rame);.  }.  p->
97e0: 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d  pFrame = 0;.  p-
97f0: 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20  >nFrame = 0;..  
9800: 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a  if( p->apCsr ){.
9810: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
9820: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
9830: 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rsor; i++){.    
9840: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
9850: 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a   = p->apCsr[i];.
9860: 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a        if( pC ){.
9870: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9880: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c  dbeFreeCursor(p,
9890: 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d   pC);.        p-
98a0: 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20  >apCsr[i] = 0;. 
98b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
98c0: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
98d0: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
98e0: 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31  Array(&p->aMem[1
98f0: 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d  ], p->nMem);.  }
9900: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
9910: 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20  up the VM after 
9920: 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  execution..**.**
9930: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
9940: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
9950: 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f   close any curso
9960: 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f  rs, lists, and/o
9970: 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61  r.** sorters tha
9980: 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e  t were left open
9990: 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74  .  It also delet
99a0: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
99b0: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e  .** variables in
99c0: 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61   the aVar[] arra
99d0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
99e0: 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a  d Cleanup(Vdbe *
99f0: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
9a00: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64  b = p->db;..#ifd
9a10: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9a20: 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73    /* Execute ass
9a30: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
9a40: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
9a50: 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d  the Vdbe.apCsr[]
9a60: 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e   and .  ** Vdbe.
9a70: 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61  aMem[] arrays ha
9a80: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
9a90: 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a  cleaned up.  */.
9aa0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
9ab0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
9ac0: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
9ad0: 2d 3e 61 70 43 73 72 3d 3d 30 20 7c 7c 20 70 2d  ->apCsr==0 || p-
9ae0: 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a  >apCsr[i]==0 );.
9af0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d    for(i=1; i<=p-
9b00: 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65  >nMem; i++) asse
9b10: 72 74 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20 7c  rt( p->aMem==0 |
9b20: 7c 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61  | p->aMem[i].fla
9b30: 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a  gs==MEM_Null );.
9b40: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
9b50: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
9b60: 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
9b70: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e  rrMsg = 0;.  p->
9b80: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
9b90: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
9ba0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
9bb0: 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  t columns that w
9bc0: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
9bd0: 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73  by this SQL.** s
9be0: 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69  tatement. This i
9bf0: 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d  s now set at com
9c00: 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65  pile time, rathe
9c10: 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a  r than during.**
9c20: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
9c30: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73  e vdbe program s
9c40: 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63  o that sqlite3_c
9c50: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61  olumn_count() ca
9c60: 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f  n.** be called o
9c70: 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  n an SQL stateme
9c80: 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  nt before sqlite
9c90: 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69  3_step()..*/.voi
9ca0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
9cb0: 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c  NumCols(Vdbe *p,
9cc0: 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29   int nResColumn)
9cd0: 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  {.  Mem *pColNam
9ce0: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  e;.  int n;.  sq
9cf0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
9d00: 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  b;..  releaseMem
9d10: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
9d20: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
9d30: 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73  *COLNAME_N);.  s
9d40: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9d50: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
9d60: 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a   n = nResColumn*
9d70: 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e  COLNAME_N;.  p->
9d80: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31  nResColumn = (u1
9d90: 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20  6)nResColumn;.  
9da0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43  p->aColName = pC
9db0: 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73  olName = (Mem*)s
9dc0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
9dd0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65  ro(db, sizeof(Me
9de0: 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  m)*n );.  if( p-
9df0: 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72  >aColName==0 ) r
9e00: 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20  eturn;.  while( 
9e10: 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70  n-- > 0 ){.    p
9e20: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d  ColName->flags =
9e30: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70   MEM_Null;.    p
9e40: 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d  ColName->db = p-
9e50: 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  >db;.    pColNam
9e60: 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e++;.  }.}../*.*
9e70: 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f  * Set the name o
9e80: 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c  f the idx'th col
9e90: 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e  umn to be return
9ea0: 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74  ed by the SQL st
9eb0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d  atement..** zNam
9ec0: 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e  e must be a poin
9ed0: 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72  ter to a nul ter
9ee0: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a  minated string..
9ef0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
9f00: 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74  must be made aft
9f10: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
9f20: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
9f30: 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ls()..**.** The 
9f40: 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c  final parameter,
9f50: 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f   xDel, must be o
9f60: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e  ne of SQLITE_DYN
9f70: 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41  AMIC, SQLITE_STA
9f80: 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  TIC.** or SQLITE
9f90: 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69  _TRANSIENT. If i
9fa0: 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41  t is SQLITE_DYNA
9fb0: 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75  MIC, then the bu
9fc0: 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  ffer pointed.** 
9fd0: 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c  to by zName will
9fe0: 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c   be freed by sql
9ff0: 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65  ite3DbFree() whe
a000: 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65  n the vdbe is de
a010: 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20  stroyed..*/.int 
a020: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
a030: 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70  lName(.  Vdbe *p
a040: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
a060: 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72  e being configur
a070: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c  ed */.  int idx,
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a090: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
a0a0: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d  x of column zNam
a0b0: 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a  e applies to */.
a0c0: 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20    int var,      
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0e0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
a0f0: 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74   COLNAME_* const
a100: 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ants */.  const 
a110: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
a120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
a130: 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
a140: 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20  containing name 
a150: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c  */.  void (*xDel
a160: 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20  )(void*)        
a170: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
a180: 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74  management strat
a190: 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f  egy for zName */
a1a0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
a1b0: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
a1c0: 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e   assert( idx<p->
a1d0: 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  nResColumn );.  
a1e0: 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e  assert( var<COLN
a1f0: 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70  AME_N );.  if( p
a200: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
a210: 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
a220: 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c  ( !zName || xDel
a230: 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  !=SQLITE_DYNAMIC
a240: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
a250: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
a260: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43  .  assert( p->aC
a270: 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  olName!=0 );.  p
a280: 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61  ColName = &(p->a
a290: 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a  ColName[idx+var*
a2a0: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b  p->nResColumn]);
a2b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
a2c0: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f  dbeMemSetStr(pCo
a2d0: 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31  lName, zName, -1
a2e0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78  , SQLITE_UTF8, x
a2f0: 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Del);.  assert( 
a300: 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20  rc!=0 || !zName 
a310: 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c  || (pColName->fl
a320: 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30  ags&MEM_Term)!=0
a330: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
a340: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64  .}../*.** A read
a350: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
a360: 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79  ction may or may
a370: 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f   not be active o
a380: 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
a390: 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72  e.** db. If a tr
a3a0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
a3b0: 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20  ive, commit it. 
a3c0: 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a  If there is a.**
a3d0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
a3e0: 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65  on spanning more
a3f0: 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
a400: 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f  se file, this ro
a410: 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63  utine.** takes c
a420: 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65  are of the maste
a430: 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65  r journal tricke
a440: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
a450: 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c  t vdbeCommit(sql
a460: 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
a470: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
a480: 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20  nt nTrans = 0;  
a490: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74  /* Number of dat
a4a0: 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61  abases with an a
a4b0: 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e  ctive write-tran
a4c0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  saction */.  int
a4d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a4e0: 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d  .  int needXcomm
a4f0: 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  it = 0;..#ifdef 
a500: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
a510: 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69  UALTABLE.  /* Wi
a520: 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20  th this option, 
a530: 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
a540: 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  ) is defined to 
a550: 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20  be simply .  ** 
a560: 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69  SQLITE_OK so p i
a570: 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a  s not used. .  *
a580: 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
a590: 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a  ETER(p);.#endif.
a5a0: 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69  .  /* Before doi
a5b0: 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ng anything else
a5c0: 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63  , call the xSync
a5d0: 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  () callback for 
a5e0: 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  any.  ** virtual
a5f0: 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77   module tables w
a600: 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74  ritten in this t
a610: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
a620: 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20   has to.  ** be 
a630: 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65  done before dete
a640: 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20  rmining whether 
a650: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
a660: 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72   file is .  ** r
a670: 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78  equired, as an x
a680: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
a690: 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63  may add an attac
a6a0: 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a  hed database.  *
a6b0: 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  * to the transac
a6c0: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tion..  */.  rc 
a6d0: 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  = sqlite3VtabSyn
a6e0: 63 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73  c(db, &p->zErrMs
a6f0: 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  g);.  if( rc!=SQ
a700: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
a710: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
a720: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
a730: 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
a740: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
a750: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
a760: 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
a770: 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
a780: 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
a790: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
a7a0: 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
a7b0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
a7c0: 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
a7d0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
a7e0: 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
a7f0: 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
a800: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
a810: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
a820: 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
a830: 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
a840: 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
a850: 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
a860: 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
a870: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
a880: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72  ; i++){ .    Btr
a890: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
a8a0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
a8b0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
a8c0: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
a8d0: 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69        needXcommi
a8e0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  t = 1;.      if(
a8f0: 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b   i!=1 ) nTrans++
a900: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
a910: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
a920: 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ny write-transac
a930: 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e  tions at all, in
a940: 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20  voke the commit 
a950: 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65  hook */.  if( ne
a960: 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d  edXcommit && db-
a970: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
a980: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 73 71   ){.    (void)sq
a990: 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64  lite3SafetyOff(d
a9a0: 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d  b);.    rc = db-
a9b0: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
a9c0: 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29  (db->pCommitArg)
a9d0: 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69  ;.    (void)sqli
a9e0: 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b  te3SafetyOn(db);
a9f0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
aa00: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
aa10: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
aa20: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
aa30: 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d  he simple case -
aa40: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
aa50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
aa60: 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68  (not counting th
aa70: 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61  e.  ** TEMP data
aa80: 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e  base) has a tran
aa90: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20  saction active. 
aaa0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
aab0: 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
aac0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a  master-journal..
aad0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
aae0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
aaf0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
ab00: 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20  Filename() is a 
ab10: 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a  zero length.  **
ab20: 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e   string, it mean
ab30: 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
ab40: 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20  ase is :memory: 
ab50: 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  or a temp file. 
ab60: 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63   In .  ** that c
ab70: 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75  ase we do not su
ab80: 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c  pport atomic mul
ab90: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c  ti-file commits,
aba0: 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a   so use the .  *
abb0: 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68  * simple case th
abc0: 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  en too..  */.  i
abd0: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
abe0: 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72  len30(sqlite3Btr
abf0: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
ac00: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20  ->aDb[0].pBt)). 
ac10: 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20    || nTrans<=1. 
ac20: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
ac30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
ac40: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
ac50: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
ac60: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
ac70: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
ac80: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
ac90: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
aca0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
acb0: 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
acc0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f      }..    /* Do
acd0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79   the commit only
ace0: 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65   if all database
acf0: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
ad00: 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e  omplete phase 1.
ad10: 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20   .    ** If one 
ad20: 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d  of the BtreeComm
ad30: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
ad40: 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69  ls fails, this i
ad50: 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20  ndicates an.    
ad60: 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c  ** IO error whil
ad70: 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  e deleting or tr
ad80: 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e  uncating a journ
ad90: 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75  al file. It is u
ada0: 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20  nlikely,.    ** 
adb0: 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  but could happen
adc0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
add0: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
ade0: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
adf0: 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20   error..    */. 
ae00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
ae10: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
ae20: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
ae30: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
ae40: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
ae50: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
ae60: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
ae70: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
ae80: 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a  tPhaseTwo(pBt);.
ae90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
aea0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
aeb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
aec0: 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
aed0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
aee0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20   /* The complex 
aef0: 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20  case - There is 
af00: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69  a multi-file wri
af10: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
af20: 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73  ctive..  ** This
af30: 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74   requires a mast
af40: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
af50: 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72  to ensure the tr
af60: 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
af70: 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d  * committed atom
af80: 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  icly..  */.#ifnd
af90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
afa0: 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20  ISKIO.  else{.  
afb0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
afc0: 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a  Vfs = db->pVfs;.
afd0: 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
afe0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
aff0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f  zMaster = 0;   /
b000: 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20  * File-name for 
b010: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
b020: 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  al */.    char c
b030: 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20  onst *zMainFile 
b040: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
b050: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
b060: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73  b[0].pBt);.    s
b070: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
b080: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36  ster = 0;.    i6
b090: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
b0a0: 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20    int res;..    
b0b0: 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74  /* Select a mast
b0c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
b0d0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  name */.    do {
b0e0: 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64  .      u32 iRand
b0f0: 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  om;.      sqlite
b100: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
b110: 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
b120: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
b130: 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20  izeof(iRandom), 
b140: 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20  &iRandom);.     
b150: 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   zMaster = sqlit
b160: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
b170: 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e  s-mj%08X", zMain
b180: 46 69 6c 65 2c 20 69 52 61 6e 64 6f 6d 26 30 78  File, iRandom&0x
b190: 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20  7fffffff);.     
b1a0: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b   if( !zMaster ){
b1b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b1c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
b1e0: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
b1f0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
b200: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
b210: 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
b220: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
b230: 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
b240: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
b250: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b260: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
b270: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
b280: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b290: 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
b2a0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
b2b0: 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
b2c0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
b2d0: 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
b2e0: 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
b2f0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
b300: 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
b310: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
b320: 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
b330: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
b340: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b350: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
b360: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
b370: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
b380: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
b390: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
b3a0: 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
b3b0: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
b3c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
b3d0: 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
b3e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
b3f0: 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
b400: 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
b410: 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
b420: 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
b430: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b440: 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
b450: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
b460: 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
b470: 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
b480: 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
b490: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
b4a0: 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
b4b0: 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
b4c0: 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
b4d0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
b4e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
b4f0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
b500: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
b510: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
b520: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
b530: 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e  f( i==1 ) contin
b540: 75 65 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  ue;   /* Ignore 
b550: 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73  the TEMP databas
b560: 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  e */.      if( s
b570: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
b580: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
b590: 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20       char const 
b5a0: 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *zFile = sqlite3
b5b0: 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
b5c0: 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ame(pBt);.      
b5d0: 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d    if( zFile[0]==
b5e0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f  0 ) continue;  /
b5f0: 2a 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79  * Ignore :memory
b600: 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  : databases */. 
b610: 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64         if( !need
b620: 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33  Sync && !sqlite3
b630: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
b640: 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  d(pBt) ){.      
b650: 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
b660: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b670: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b680: 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c  OsWrite(pMaster,
b690: 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53   zFile, sqlite3S
b6a0: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
b6b0: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
b6c0: 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c     offset += sql
b6d0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
b6e0: 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  le)+1;.        i
b6f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b700: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
b710: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
b720: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
b730: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
b740: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
b750: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
b760: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
b770: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
b780: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
b790: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
b7a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
b7b0: 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74  /* Sync the mast
b7c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
b7d0: 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
b7e0: 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a  QUENTIAL device.
b7f0: 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
b800: 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72  et this is not r
b810: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
b820: 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
b830: 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71   .     && 0==(sq
b840: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
b850: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
b860: 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
b870: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20  AP_SEQUENTIAL). 
b880: 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
b890: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
b8a0: 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53  sSync(pMaster, S
b8b0: 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
b8c0: 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  L)).    ){.     
b8d0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
b8e0: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
b8f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
b900: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
b910: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
b920: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
b930: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
b940: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
b950: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c  .    /* Sync all
b960: 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e   the db files in
b970: 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72  volved in the tr
b980: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
b990: 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ame call.    ** 
b9a0: 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20  sets the master 
b9b0: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
b9c0: 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  in each individu
b9d0: 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  al journal. If. 
b9e0: 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f     ** an error o
b9f0: 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e  ccurs here, do n
ba00: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
ba10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ba20: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
ba30: 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63   If the error oc
ba40: 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
ba50: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20  first call to.  
ba60: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
ba70: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
ba80: 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ), then there is
ba90: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
baa0: 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  he.    ** master
bab0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
bac0: 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20  ll be orphaned. 
bad0: 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  But we cannot de
bae0: 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20  lete it,.    ** 
baf0: 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
bb00: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
bb10: 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e  name was written
bb20: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
bb30: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65  l.    ** file be
bb40: 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
bb50: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a   occurred..    *
bb60: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
bb70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
bb80: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
bb90: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
bba0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
bbb0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
bbc0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
bbd0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
bbe0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
bbf0: 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  t, zMaster);.   
bc00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
bc10: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
bc20: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
bc30: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
bc40: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
bc50: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
bc60: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
bc70: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
bc80: 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65     /* Delete the
bc90: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
bca0: 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69  file. This commi
bcb0: 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ts the transacti
bcc0: 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a  on. After.    **
bcd0: 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20   doing this the 
bce0: 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e  directory is syn
bcf0: 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65  ced again before
bd00: 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a   any individual.
bd10: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
bd20: 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c  on files are del
bd30: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
bd40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
bd50: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
bd60: 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ter, 1);.    sql
bd70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
bd80: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61  Master);.    zMa
bd90: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66  ster = 0;.    if
bda0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
bdb0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
bdc0: 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73      /* All files
bdd0: 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73   and directories
bde0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
bdf0: 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68  en synced, so th
be00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
be10: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
be20: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
be30: 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c  aseTwo() are onl
be40: 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20  y closing files 
be50: 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74  and.    ** delet
be60: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
be70: 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73  g journals. If s
be80: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
be90: 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a  ong while.    **
bea0: 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
beb0: 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c  ng we don't real
bec0: 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74  ly care. The int
bed0: 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20  egrity of the.  
bee0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
bef0: 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72   is already guar
bf00: 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65  anteed, but some
bf10: 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f   stray 'cold' jo
bf20: 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61  urnals.    ** ma
bf30: 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e  y be lying aroun
bf40: 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20  d. Returning an 
bf50: 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74  error code won't
bf60: 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20   help matters.. 
bf70: 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c     */.    disabl
bf80: 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
bf90: 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c  rrors();.    sql
bfa0: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
bfb0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72  alloc();.    for
bfc0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
bfd0: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
bfe0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
bff0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
c000: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
c010: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
c020: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
c030: 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Bt);.      }.   
c040: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e   }.    sqlite3En
c050: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
c060: 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  .    enable_simu
c070: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
c080: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  );..    sqlite3V
c090: 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
c0a0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
c0b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
c0c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
c0d0: 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73  hecks that the s
c0e0: 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64 62  qlite3.activeVdb
c0f0: 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61  eCnt count varia
c100: 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74  ble.** matches t
c110: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  he number of vdb
c120: 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  e's in the list 
c130: 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68  sqlite3.pVdbe th
c140: 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  at are.** curren
c150: 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61  tly active. An a
c160: 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
c170: 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73  f the two counts
c180: 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
c190: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74  * This is an int
c1a0: 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b  ernal self-check
c1b0: 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f   only - it is no
c1c0: 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70  t an essential p
c1d0: 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65  rocessing.** ste
c1e0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
c1f0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42   a no-op if NDEB
c200: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  UG is defined..*
c210: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
c220: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
c230: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
c240: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
c250: 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63  Vdbe *p;.  int c
c260: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57  nt = 0;.  int nW
c270: 72 69 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d 20  rite = 0;.  p = 
c280: 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69  db->pVdbe;.  whi
c290: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
c2a0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
c2b0: 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e  MAGIC_RUN && p->
c2c0: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  pc>=0 ){.      c
c2d0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
c2e0: 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
c2f0: 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 7d   nWrite++;.    }
c300: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
c310: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
c320: 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65   cnt==db->active
c330: 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 61 73 73  VdbeCnt );.  ass
c340: 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d  ert( nWrite==db-
c350: 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b  >writeVdbeCnt );
c360: 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
c370: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
c380: 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  Cnt(x).#endif../
c390: 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42  *.** For every B
c3a0: 74 72 65 65 20 74 68 61 74 20 69 6e 20 64 61 74  tree that in dat
c3b0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
c3c0: 20 64 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61   db which .** ha
c3d0: 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c  s been modified,
c3e0: 20 22 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c   "trip" or inval
c3f0: 69 64 61 74 65 20 65 61 63 68 20 63 75 72 73 6f  idate each curso
c400: 72 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72  r in.** that Btr
c410: 65 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  ee might have be
c420: 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74  en modified so t
c430: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  hat the cursor.*
c440: 2a 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75  * can never be u
c450: 73 65 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73  sed again.  This
c460: 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20   happens when a 
c470: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63  rollback.*** occ
c480: 75 72 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f  urs.  We have to
c490: 20 74 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74   trip all the ot
c4a0: 68 65 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65  her cursors, eve
c4b0: 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d  n.** cursor from
c4c0: 20 6f 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69   other VMs in di
c4d0: 66 66 65 72 65 6e 74 20 64 61 74 61 62 61 73 65  fferent database
c4e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a   connections,.**
c4f0: 20 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66   so that none of
c500: 20 74 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65   them try to use
c510: 20 74 68 65 20 64 61 74 61 20 61 74 20 77 68 69   the data at whi
c520: 63 68 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20  ch they.** were 
c530: 70 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69  pointing and whi
c540: 63 68 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20  ch now may have 
c550: 62 65 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65  been changed due
c560: 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62  .** to the rollb
c570: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d  ack..**.** Remem
c580: 62 65 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62  ber that a rollb
c590: 61 63 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74  ack can delete t
c5a0: 61 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61  ables complete a
c5b0: 6e 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f  nd.** reorder ro
c5c0: 6f 74 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20  otpages.  So it 
c5d0: 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e  is not sufficien
c5e0: 74 20 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a  t just to save.*
c5f0: 2a 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  * the state of t
c600: 68 65 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68  he cursor.  We h
c610: 61 76 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74  ave to invalidat
c620: 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  e the cursor.** 
c630: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 65  so that it is ne
c640: 76 65 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a  ver used again..
c650: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
c660: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
c670: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
c680: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
c690: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
c6a0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
c6b0: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
c6c0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
c6d0: 74 3b 0a 20 20 20 20 69 66 28 20 70 20 26 26 20  t;.    if( p && 
c6e0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
c6f0: 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20  Trans(p) ){.    
c700: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72    sqlite3BtreeTr
c710: 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
c720: 53 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20  SQLITE_ABORT);. 
c730: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
c740: 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61  * If the Vdbe pa
c750: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
c760: 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65  t argument opene
c770: 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  d a statement-tr
c780: 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c  ansaction,.** cl
c790: 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75  ose it now. Argu
c7a0: 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65  ment eOp must be
c7b0: 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e   either SAVEPOIN
c7c0: 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a  T_ROLLBACK or.**
c7d0: 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
c7e0: 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56  SE. If it is SAV
c7f0: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
c800: 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d   then the statem
c810: 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
c820: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
c830: 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56  k. If eOp is SAV
c840: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
c850: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61  then the .** sta
c860: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
c870: 6f 6e 20 69 73 20 63 6f 6d 6d 74 74 65 64 2e 0a  on is commtted..
c880: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
c890: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
c8a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
c8b0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
c8c0: 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
c8d0: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
c8e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c8f0: 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
c900: 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  nt(Vdbe *p, int 
c910: 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  eOp){.  sqlite3 
c920: 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64  *const db = p->d
c930: 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  b;.  int rc = SQ
c940: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
c950: 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20  f p->iStatement 
c960: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
c970: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
c980: 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20  Vdbe opened a . 
c990: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72   ** statement tr
c9a0: 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73  ansaction that s
c9b0: 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
c9c0: 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65  here. The only e
c9d0: 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  xception.  ** is
c9e0: 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f   that an IO erro
c9f0: 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72  r may have occur
ca00: 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65  ed, causing an e
ca10: 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63  mergency rollbac
ca20: 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  k..  ** In this 
ca30: 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65  case (db->nState
ca40: 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68  ment==0), and th
ca50: 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
ca60: 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o do..  */.  if(
ca70: 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
ca80: 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  && p->iStatement
ca90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
caa0: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61     const int iSa
cab0: 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74  vepoint = p->iSt
cac0: 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20  atement-1;..    
cad0: 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56  assert( eOp==SAV
cae0: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
caf0: 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  || eOp==SAVEPOIN
cb00: 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20  T_RELEASE);.    
cb10: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
cb20: 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20  tement>0 );.    
cb30: 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74  assert( p->iStat
cb40: 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61  ement==(db->nSta
cb50: 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65  tement+db->nSave
cb60: 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66  point) );..    f
cb70: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
cb80: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
cb90: 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
cba0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65  _OK;.      Btree
cbb0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
cbc0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
cbd0: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
cbe0: 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
cbf0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
cc00: 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
cc10: 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
cc20: 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
cc30: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
cc40: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
cc50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
cc60: 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
cc70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
cc80: 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
cc90: 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
cca0: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
ccb0: 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
ccc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ccd0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
cce0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
ccf0: 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
cd00: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
cd10: 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65  }.    db->nState
cd20: 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69  ment--;.    p->i
cd30: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
cd40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
cd50: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  }../*.** If SQLi
cd60: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
cd70: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
cd80: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
cd90: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
cda0: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
cdb0: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
cdc0: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
cdd0: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
cde0: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
cdf0: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
ce00: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
ce10: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
ce20: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
ce30: 20 69 74 0a 2a 2a 20 73 65 74 73 20 74 68 65 20   it.** sets the 
ce40: 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62  BtShared.db memb
ce50: 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68  er of each of th
ce60: 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
ce70: 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a  tures, ensuring.
ce80: 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  ** that the corr
ce90: 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  ect busy-handler
cea0: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76   callback is inv
ceb0: 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64  oked if required
cec0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ..**.** If SQLit
ced0: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
cee0: 61 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70  afe but does sup
cef0: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
cf00: 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20  e mode, then.** 
cf10: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
cf20: 72 41 6c 6c 28 29 20 69 73 20 69 6e 76 6f 6b 65  rAll() is invoke
cf30: 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53  d to set the BtS
cf40: 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c  hared.db variabl
cf50: 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  es.** of all of 
cf60: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
cf70: 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76  res accessible v
cf80: 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ia the database 
cf90: 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63  handle .** assoc
cfa0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
cfb0: 4d 2e 20 4f 66 20 63 6f 75 72 73 65 20 6f 6e 6c  M. Of course onl
cfc0: 79 20 61 20 73 75 62 73 65 74 20 6f 66 20 74 68  y a subset of th
cfd0: 65 73 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a  ese structures.*
cfe0: 2a 20 77 69 6c 6c 20 62 65 20 61 63 63 65 73 73  * will be access
cff0: 65 64 20 62 79 20 74 68 65 20 56 4d 2c 20 61 6e  ed by the VM, an
d000: 64 20 77 65 20 63 6f 75 6c 64 20 75 73 65 20 56  d we could use V
d010: 64 62 65 2e 62 74 72 65 65 4d 61 73 6b 20 74 6f  dbe.btreeMask to
d020: 20 66 69 67 75 72 65 0a 2a 2a 20 74 68 61 74 20   figure.** that 
d030: 73 75 62 73 65 74 20 6f 75 74 2c 20 62 75 74 20  subset out, but 
d040: 74 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76 61  there is no adva
d050: 6e 74 61 67 65 20 74 6f 20 64 6f 69 6e 67 20 73  ntage to doing s
d060: 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  o..**.** If SQLi
d070: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  te is not thread
d080: 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f  safe and does no
d090: 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  t support shared
d0a0: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69  -cache mode, thi
d0b0: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
d0c0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69 66   a no-op..*/.#if
d0d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d0e0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 76 6f  _SHARED_CACHE.vo
d0f0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75  id sqlite3VdbeMu
d100: 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 56 64  texArrayEnter(Vd
d110: 62 65 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49  be *p){.#if SQLI
d120: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
d130: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
d140: 78 41 72 72 61 79 45 6e 74 65 72 28 26 70 2d 3e  xArrayEnter(&p->
d150: 61 4d 75 74 65 78 29 3b 0a 23 65 6c 73 65 0a 20  aMutex);.#else. 
d160: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
d170: 65 72 41 6c 6c 28 70 2d 3e 64 62 29 3b 0a 23 65  erAll(p->db);.#e
d180: 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ndif.}.#endif../
d190: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d1a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  e is called the 
d1b0: 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65  when a VDBE trie
d1c0: 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74  s to halt.  If t
d1d0: 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d  he VDBE.** has m
d1e0: 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ade changes and 
d1f0: 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
d200: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d   mode, then comm
d210: 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e  it those.** chan
d220: 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62  ges.  If a rollb
d230: 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74  ack is needed, t
d240: 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62  hen do the rollb
d250: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
d260: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f  routine is the o
d270: 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20  nly way to move 
d280: 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56  the state of a V
d290: 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45  M from.** SQLITE
d2a0: 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51  _MAGIC_RUN to SQ
d2b0: 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e  LITE_MAGIC_HALT.
d2c0: 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73    It is harmless
d2d0: 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73   to.** call this
d2e0: 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73   on a VM that is
d2f0: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
d300: 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e  AGIC_HALT state.
d310: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
d320: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66   error code.  If
d330: 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c   the commit coul
d340: 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62  d not complete b
d350: 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63  ecause of.** loc
d360: 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65  k contention, re
d370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
d380: 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53  .  If SQLITE_BUS
d390: 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69  Y is returned, i
d3a0: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63  t.** means the c
d3b0: 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70  lose did not hap
d3c0: 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  pen and needs to
d3d0: 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f   be repeated..*/
d3e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
d3f0: 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  Halt(Vdbe *p){. 
d400: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d420: 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72   /* Used to stor
d430: 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75  e transient retu
d440: 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71  rn codes */.  sq
d450: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
d460: 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  b;..  /* This fu
d470: 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  nction contains 
d480: 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64  the logic that d
d490: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73  etermines if a s
d4a0: 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a  tatement or.  **
d4b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
d4c0: 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  l be committed o
d4d0: 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  r rolled back as
d4e0: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
d4f0: 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  .  ** execution 
d500: 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  of this virtual 
d510: 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20  machine. .  **. 
d520: 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68   ** If any of th
d530: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f  e following erro
d540: 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20  rs occur:.  **. 
d550: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e   **     SQLITE_N
d560: 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51  OMEM.  **     SQ
d570: 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20  LITE_IOERR.  ** 
d580: 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a      SQLITE_FULL.
d590: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
d5a0: 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20  INTERRUPT.  **. 
d5b0: 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74   ** Then the int
d5c0: 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68  ernal cache migh
d5d0: 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74  t have been left
d5e0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
d5f0: 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20  ent.  ** state. 
d600: 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c   We need to roll
d610: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
d620: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
d630: 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a  if there is.  **
d640: 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d   one, or the com
d650: 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f  plete transactio
d660: 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  n if there is no
d670: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
d680: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20  action..  */..  
d690: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
d6a0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
d6b0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
d6c0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  MEM;.  }.  close
d6d0: 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
d6e0: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
d6f0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
d700: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d710: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65  TE_OK;.  }.  che
d720: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
d730: 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f  db);..  /* No co
d740: 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
d750: 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70   needed if the p
d760: 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61  rogram never sta
d770: 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  rted */.  if( p-
d780: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  >pc>=0 ){.    in
d790: 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
d7a0: 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
d7b0: 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20  rom p->rc */.   
d7c0: 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f   int eStatementO
d7d0: 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  p = 0;.    int i
d7e0: 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20  sSpecialError;  
d7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
d800: 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73   to true if a 's
d810: 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f  pecial' error */
d820: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c  ..    /* Lock al
d830: 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79  l btrees used by
d840: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
d850: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
d860: 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65 72  eMutexArrayEnter
d870: 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
d880: 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
d890: 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
d8a0: 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d   */.    mrc = p-
d8b0: 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >rc & 0xff;.    
d8c0: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
d8d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
d8e0: 4b 45 44 20 29 3b 20 20 2f 2a 20 54 68 69 73 20  KED );  /* This 
d8f0: 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20  error no longer 
d900: 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 73  exists */.    is
d910: 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d  SpecialError = m
d920: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
d930: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
d940: 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
d950: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72             || mr
d960: 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c==SQLITE_INTERR
d970: 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  UPT || mrc==SQLI
d980: 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28  TE_FULL;.    if(
d990: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
d9a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
d9b0: 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61  he query was rea
d9c0: 64 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65 65 64 20  d-only, we need 
d9d0: 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  do no rollback a
d9e0: 74 20 61 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65  t all. Otherwise
d9f0: 2c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65  ,.      ** proce
da00: 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ed with the spec
da10: 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  ial handling..  
da20: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
da30: 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c   !p->readOnly ||
da40: 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc!=SQLITE_INT
da50: 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20  ERRUPT ){.      
da60: 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49    if( (mrc==SQLI
da70: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
da80: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26  =SQLITE_FULL) &&
da90: 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
daa0: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nal ){.         
dab0: 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
dac0: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
dad0: 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  CK;.        }els
dae0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
daf0: 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f  We are forced to
db00: 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61   roll back the a
db10: 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
db20: 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a  n. Before doing.
db30: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c            ** so,
db40: 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72   abort any other
db50: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73   statements this
db60: 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c   handle currentl
db70: 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20  y has active..  
db80: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
db90: 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43       invalidateC
dba0: 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64  ursorsOnModified
dbb0: 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20  Btrees(db);.    
dbc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
dbd0: 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
dbe0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
dbf0: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
dc00: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  b);.          db
dc10: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
dc20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dc30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
dc40: 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
dc50: 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
dc60: 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74  et and this is t
dc70: 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77  he only active w
dc80: 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d  riter .    ** VM
dc90: 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74  , then we do eit
dca0: 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20  her a commit or 
dcb0: 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20  rollback of the 
dcc0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
dcd0: 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion. .    **.   
dce0: 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62   ** Note: This b
dcf0: 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69  lock also runs i
dd00: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  f one of the spe
dd10: 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64  cial errors hand
dd20: 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76  led .    ** abov
dd30: 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  e has occurred. 
dd40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
dd50: 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79  !sqlite3VtabInSy
dd60: 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20  nc(db) .     && 
dd70: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a  db->autoCommit .
dd80: 20 20 20 20 20 26 26 20 64 62 2d 3e 77 72 69 74       && db->writ
dd90: 65 56 64 62 65 43 6e 74 3d 3d 28 70 2d 3e 72 65  eVdbeCnt==(p->re
dda0: 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20  adOnly==0) .    
ddb0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
ddc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
ddd0: 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
dde0: 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
ddf0: 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
de00: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
de10: 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
de20: 20 69 73 20 74 72 75 65 2c 20 61 6e 64 20 74 68   is true, and th
de30: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77  e vdbe program w
de40: 61 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  as .        ** s
de50: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 68 69 74  uccessful or hit
de60: 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f   an 'OR FAIL' co
de70: 6e 73 74 72 61 69 6e 74 2e 20 54 68 69 73 20 6d  nstraint. This m
de80: 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20  eans a commit . 
de90: 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
dea0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  uired..        *
deb0: 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 76  /.        rc = v
dec0: 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29  dbeCommit(db, p)
ded0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
dee0: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
def0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
df00: 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61  e3BtreeMutexArra
df10: 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65  yLeave(&p->aMute
df20: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  x);.          re
df30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
df40: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
df50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
df60: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
df70: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
df80: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
df90: 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
dfa0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
dfb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
dfc0: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
dfd0: 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
dfe0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
dff0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
e000: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20  llbackAll(db);. 
e010: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d       }.      db-
e020: 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
e030: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
e040: 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29  StatementOp==0 )
e050: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
e060: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
e070: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
e080: 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
e090: 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
e0a0: 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  = SAVEPOINT_RELE
e0b0: 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ASE;.      }else
e0c0: 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74   if( p->errorAct
e0d0: 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ion==OE_Abort ){
e0e0: 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
e0f0: 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
e100: 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
e110: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e120: 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f   invalidateCurso
e130: 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65  rsOnModifiedBtre
e140: 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
e150: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
e160: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
e170: 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
e180: 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
e190: 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
e1a0: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  it = 1;.      }.
e1b0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
e1c0: 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  If eStatementOp 
e1d0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
e1e0: 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  n a statement tr
e1f0: 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20  ansaction needs 
e200: 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d  to.    ** be com
e210: 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
e220: 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69   back. Call sqli
e230: 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
e240: 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a  ement() to.    *
e250: 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73  * do so. If this
e260: 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72   operation retur
e270: 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64  ns an error, and
e280: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
e290: 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72  tement.    ** er
e2a0: 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
e2b0: 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f  TE_OK or SQLITE_
e2c0: 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e  CONSTRAINT, then
e2d0: 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 0a 20   set the error. 
e2e0: 20 20 20 2a 2a 20 63 6f 64 65 20 74 6f 20 74 68     ** code to th
e2f0: 65 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 20 20  e new value..   
e300: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61   */.    if( eSta
e310: 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20  tementOp ){.    
e320: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
e330: 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
e340: 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  (p, eStatementOp
e350: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
e360: 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  && (p->rc==SQLIT
e370: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
e380: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
e390: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
e3a0: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
e3b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e3c0: 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
e3d0: 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d          p->zErrM
e3e0: 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  sg = 0;.      }.
e3f0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
e400: 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49  If this was an I
e410: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
e420: 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73   DELETE and no s
e430: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
e440: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20  tion.    ** has 
e450: 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
e460: 2c 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74  , update the dat
e470: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
e480: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e   change-counter.
e490: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
e4a0: 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   p->changeCntOn 
e4b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74  ){.      if( eSt
e4c0: 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50  atementOp!=SAVEP
e4d0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
e4e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e4f0: 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
e500: 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
e510: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e520: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e530: 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30  SetChanges(db, 0
e540: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e550: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
e560: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
e570: 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d   Rollback or com
e580: 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63  mit any schema c
e590: 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75  hanges that occu
e5a0: 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  rred. */.    if(
e5b0: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
e5c0: 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53  K && db->flags&S
e5d0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
e5e0: 67 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ges ){.      sql
e5f0: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
e600: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
e610: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
e620: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53  = (db->flags | S
e630: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
e640: 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ges);.    }..   
e650: 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
e660: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
e670: 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72  ite3BtreeMutexAr
e680: 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75  rayLeave(&p->aMu
e690: 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tex);.  }..  /* 
e6a0: 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
e6b0: 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
e6c0: 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
e6d0: 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
e6e0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
e6f0: 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61  >=0 ){.    db->a
e700: 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a  ctiveVdbeCnt--;.
e710: 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
e720: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 64 62  Only ){.      db
e730: 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 2d 2d  ->writeVdbeCnt--
e740: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
e750: 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  rt( db->activeVd
e760: 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69 74 65  beCnt>=db->write
e770: 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d 0a 20  VdbeCnt );.  }. 
e780: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
e790: 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
e7a0: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
e7b0: 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e  t(db);.  if( p->
e7c0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e7d0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
e7e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e7f0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
e800: 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
e810: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20  is set to true, 
e820: 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74  then any locks t
e830: 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20  hat were held.  
e840: 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ** by connection
e850: 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65   db have now bee
e860: 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c  n released. Call
e870: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
e880: 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20  onUnlocked() .  
e890: 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79  ** to invoke any
e8a0: 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b   required unlock
e8b0: 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b  -notify callback
e8c0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
e8d0: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a  ->autoCommit ){.
e8e0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
e8f0: 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62  ctionUnlocked(db
e900: 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
e910: 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ( db->activeVdbe
e920: 43 6e 74 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74  Cnt>0 || db->aut
e930: 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
e940: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->nStatement==0 
e950: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
e960: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
e970: 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73   Each VDBE holds
e980: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
e990: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
e9a0: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
e9b0: 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20  ll.** in p->rc. 
e9c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
e9d0: 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62  ts that result b
e9e0: 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  ack to SQLITE_OK
e9f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ea00: 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65  3VdbeResetStepRe
ea10: 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  sult(Vdbe *p){. 
ea20: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
ea30: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  OK;.}../*.** Cle
ea40: 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
ea50: 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
ea60: 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
ea70: 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
ea80: 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
ea90: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
eaa0: 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
eab0: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
eac0: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
ead0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
eae0: 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
eaf0: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
eb00: 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
eb10: 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ** again..**.** 
eb20: 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e  To look at it an
eb30: 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20  other way, this 
eb40: 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74  routine resets t
eb50: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  he state of the.
eb60: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
eb70: 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  ne from VDBE_MAG
eb80: 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d  IC_RUN or VDBE_M
eb90: 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74  AGIC_HALT back t
eba0: 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
ebb0: 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  INIT..*/.int sql
ebc0: 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64  ite3VdbeReset(Vd
ebd0: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
ebe0: 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d  3 *db;.  db = p-
ebf0: 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  >db;..  /* If th
ec00: 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e  e VM did not run
ec10: 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f   to completion o
ec20: 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65  r if it encounte
ec30: 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f  red an.  ** erro
ec40: 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  r, then it might
ec50: 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68   not have been h
ec60: 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20  alted properly. 
ec70: 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74   So halt.  ** it
ec80: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f   now..  */.  (vo
ec90: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
eca0: 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  On(db);.  sqlite
ecb0: 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20  3VdbeHalt(p);.  
ecc0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
ecd0: 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f  etyOff(db);..  /
ece0: 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68 61  * If the VDBE ha
ecf0: 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61  s be run even pa
ed00: 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72  rtially, then tr
ed10: 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f 72  ansfer the error
ed20: 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65   code.  ** and e
ed30: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f  rror message fro
ed40: 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20  m the VDBE into 
ed50: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
ed60: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42 75  e structure.  Bu
ed70: 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44  t.  ** if the VD
ed80: 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  BE has just been
ed90: 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20   set to run but 
eda0: 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  has not actually
edb0: 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20   executed any.  
edc0: 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ** instructions 
edd0: 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d  yet, leave the m
ede0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72 72  ain database err
edf0: 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  or information u
ee00: 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20  nchanged..  */. 
ee10: 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
ee20: 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 45 72 72  .    if( p->zErr
ee30: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Msg ){.      sql
ee40: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
ee50: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73  alloc();.      s
ee60: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
ee70: 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d  r(db->pErr,-1,p-
ee80: 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45 5f  >zErrMsg,SQLITE_
ee90: 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e  UTF8,SQLITE_TRAN
eea0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 73 71  SIENT);.      sq
eeb0: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
eec0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 64 62  lloc();.      db
eed0: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72  ->errCode = p->r
eee0: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
eef0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
ef00: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 70 2d  rrMsg);.      p-
ef10: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
ef20: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72    }else if( p->r
ef30: 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
ef40: 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72  e3Error(db, p->r
ef50: 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, 0);.    }else
ef60: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
ef70: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
ef80: 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  OK, 0);.    }.  
ef90: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
efa0: 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  && p->expired ){
efb0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69  .    /* The expi
efc0: 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74  red flag was set
efd0: 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66   on the VDBE bef
efe0: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61  ore the first ca
eff0: 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
f000: 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72  ite3_step(). For
f010: 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69   consistency (si
f020: 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  nce sqlite3_step
f030: 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61  () was.    ** ca
f040: 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64  lled), set the d
f050: 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
f060: 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65   this case as we
f070: 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ll..    */.    s
f080: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
f090: 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73  p->rc, 0);.    s
f0a0: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
f0b0: 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
f0c0: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
f0d0: 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
f0e0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
f0f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f100: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
f110: 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
f120: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63  0;.  }..  /* Rec
f130: 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  laim all memory 
f140: 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45  used by the VDBE
f150: 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28  .  */.  Cleanup(
f160: 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70  p);..  /* Save p
f170: 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61  rofiling informa
f180: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56  tion from this V
f190: 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69  DBE run..  */.#i
f1a0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
f1b0: 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a  E.  {.    FILE *
f1c0: 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62  out = fopen("vdb
f1d0: 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20  e_profile.out", 
f1e0: 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75  "a");.    if( ou
f1f0: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
f200: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
f210: 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20  out, "---- ");. 
f220: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
f230: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
f240: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
f250: 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f  t, "%02x", p->aO
f260: 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20  p[i].opcode);.  
f270: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
f280: 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
f290: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
f2a0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
f2b0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
f2c0: 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20  ut, "%6d %10lld 
f2d0: 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20  %8lld ",.       
f2e0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
f2f0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  t,.           p-
f300: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a  >aOp[i].cycles,.
f310: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
f320: 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e  p[i].cnt>0 ? p->
f330: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d  aOp[i].cycles/p-
f340: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a  >aOp[i].cnt : 0.
f350: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
f360: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
f370: 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70  intOp(out, i, &p
f380: 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20  ->aOp[i]);.     
f390: 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28   }.      fclose(
f3a0: 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  out);.    }.  }.
f3b0: 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69  #endif.  p->magi
f3c0: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
f3d0: 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  NIT;.  return p-
f3e0: 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  >rc & db->errMas
f3f0: 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65  k;.}. ./*.** Cle
f400: 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65  an up and delete
f410: 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
f420: 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ecution.  Return
f430: 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
f440: 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  h is.** the resu
f450: 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20  lt code.  Write 
f460: 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
f470: 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45  e text into *pzE
f480: 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
f490: 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
f4a0: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
f4b0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
f4c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
f4d0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
f4e0: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
f4f0: 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b  BE_MAGIC_HALT ){
f500: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f510: 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20  3VdbeReset(p);. 
f520: 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26     assert( (rc &
f530: 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29   p->db->errMask)
f540: 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71  ==rc );.  }.  sq
f550: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
f560: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
f570: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74  .}../*.** Call t
f580: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
f590: 72 20 65 61 63 68 20 61 75 78 64 61 74 61 20 65  r each auxdata e
f5a0: 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e  ntry in pVdbeFun
f5b0: 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74  c for which.** t
f5c0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
f5d0: 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20   bit in mask is 
f5e0: 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 20  clear.  Auxdata 
f5f0: 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33  entries beyond 3
f600: 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20  1.** are always 
f610: 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64  destroyed.  To d
f620: 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61  estroy all auxda
f630: 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c  ta entries, call
f640: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
f650: 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a   with mask==0..*
f660: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
f670: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
f680: 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46  VdbeFunc *pVdbeF
f690: 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  unc, int mask){.
f6a0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
f6b0: 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d  =0; i<pVdbeFunc-
f6c0: 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAux; i++){.   
f6d0: 20 73 74 72 75 63 74 20 41 75 78 44 61 74 61 20   struct AuxData 
f6e0: 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 75  *pAux = &pVdbeFu
f6f0: 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20  nc->apAux[i];.  
f700: 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21    if( (i>31 || !
f710: 28 6d 61 73 6b 26 28 28 28 75 33 32 29 31 29 3c  (mask&(((u32)1)<
f720: 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70  <i))) && pAux->p
f730: 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Aux ){.      if(
f740: 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29   pAux->xDelete )
f750: 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e  {.        pAux->
f760: 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41  xDelete(pAux->pA
f770: 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ux);.      }.   
f780: 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20     pAux->pAux = 
f790: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
f7a0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
f7b0: 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a  entire VDBE..*/.
f7c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
f7d0: 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b  Delete(Vdbe *p){
f7e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
f7f0: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d  .  if( NEVER(p==
f800: 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
f810: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
f820: 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20   p->pPrev ){.   
f830: 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
f840: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
f850: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
f860: 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29  ( db->pVdbe==p )
f870: 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20  ;.    db->pVdbe 
f880: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
f890: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
f8a0: 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
f8b0: 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
f8c0: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
f8d0: 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
f8e0: 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c   p->nVar);.  rel
f8f0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
f900: 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
f910: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
f920: 4e 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f 70  N);.  vdbeFreeOp
f930: 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70  Array(db, p->aOp
f940: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c  , p->nOp);.  sql
f950: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
f960: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c  ->aLabel);.  sql
f970: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
f980: 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73  ->aColName);.  s
f990: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
f9a0: 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e   p->zSql);.  p->
f9b0: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
f9c0: 49 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69 74  IC_DEAD;.  sqlit
f9d0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
f9e0: 70 46 72 65 65 29 3b 0a 20 20 73 71 6c 69 74 65  pFree);.  sqlite
f9f0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
fa00: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
fa10: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20  re the cursor p 
fa20: 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64  is ready to read
fa30: 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f   or write the ro
fa40: 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a  w to which it.**
fa50: 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69   was last positi
fa60: 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e  oned.  Return an
fa70: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
fa80: 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49  n OOM fault or I
fa90: 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76  /O error.** prev
faa0: 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73  ents us from pos
fab0: 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72  itioning the cur
fac0: 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65  sor to its corre
fad0: 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a  ct position..**.
fae0: 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f  ** If a MoveTo o
faf0: 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64  peration is pend
fb00: 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ing on the given
fb10: 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f   cursor, then do
fb20: 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20   that.** MoveTo 
fb30: 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65  now.  If no move
fb40: 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65   is pending, che
fb50: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
fb60: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a   row has been.**
fb70: 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
fb80: 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
fb90: 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73  or and if it has
fba0: 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61  , mark the row a
fbb0: 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  s.** a NULL row.
fbc0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
fbd0: 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
fbe0: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
fbf0: 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20  correct row and 
fc00: 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20  that row has.** 
fc10: 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64  not been deleted
fc20: 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
fc30: 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  the cursor, then
fc40: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
fc50: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74   a no-op..*/.int
fc60: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
fc70: 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72  orMoveto(VdbeCur
fc80: 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  sor *p){.  if( p
fc90: 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
fca0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c   ){.    int res,
fcb0: 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
fcc0: 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65  TE_TEST.    exte
fcd0: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
fce0: 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e  earch_count;.#en
fcf0: 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
fd00: 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  p->isTable );.  
fd10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
fd20: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
fd30: 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  d(p->pCursor, 0,
fd40: 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
fd50: 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
fd60: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
fd70: 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52  rc;.    p->lastR
fd80: 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f  owid = p->moveto
fd90: 54 61 72 67 65 74 3b 0a 20 20 20 20 70 2d 3e 72  Target;.    p->r
fda0: 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 41 4c  owidIsValid = AL
fdb0: 57 41 59 53 28 72 65 73 3d 3d 30 29 20 3f 31 3a  WAYS(res==0) ?1:
fdc0: 30 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  0;.    if( NEVER
fdd0: 28 72 65 73 3c 30 29 20 29 7b 0a 20 20 20 20 20  (res<0) ){.     
fde0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
fdf0: 65 65 4e 65 78 74 28 70 2d 3e 70 43 75 72 73 6f  eeNext(p->pCurso
fe00: 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20  r, &res);.      
fe10: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
fe20: 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  rc;.    }.#ifdef
fe30: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
fe40: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
fe50: 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
fe60: 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d      p->deferredM
fe70: 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70  oveto = 0;.    p
fe80: 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
fe90: 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d  CACHE_STALE;.  }
fea0: 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
feb0: 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  p->pCursor) ){. 
fec0: 20 20 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b     int hasMoved;
fed0: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
fee0: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
fef0: 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72  HasMoved(p->pCur
ff00: 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b  sor, &hasMoved);
ff10: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
ff20: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
ff30: 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20   hasMoved ){.   
ff40: 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75     p->cacheStatu
ff50: 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
ff60: 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f  .      p->nullRo
ff70: 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  w = 1;.    }.  }
ff80: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ff90: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
ffa0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
ffb0: 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c  tions:.**.** sql
ffc0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
ffd0: 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  pe().** sqlite3V
ffe0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
fff0: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
10000 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20  eSerialLen().** 
10010 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
10020 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lPut().** sqlite
10030 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
10040 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61  .**.** encapsula
10050 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  te the code that
10060 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75   serializes valu
10070 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69  es for storage i
10080 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61  n SQLite.** data
10090 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72   and index recor
100a0 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69  ds. Each seriali
100b0 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73  zed value consis
100c0 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69  ts of a.** 'seri
100d0 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62  al-type' and a b
100e0 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65  lob of data. The
100f0 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
10100 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e  an 8-byte unsign
10110 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  ed.** integer, s
10120 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e  tored as a varin
10130 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53  t..**.** In an S
10140 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f  QLite index reco
10150 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74  rd, the serial t
10160 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69  ype is stored di
10170 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a  rectly before.**
10180 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74   the blob of dat
10190 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73  a that it corres
101a0 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74  ponds to. In a t
101b0 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c  able record, all
101c0 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73   serial.** types
101d0 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74   are stored at t
101e0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
101f0 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20  record, and the 
10200 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74  blobs of data at
10210 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e  .** the end. Hen
10220 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f  ce these functio
10230 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c  ns allow the cal
10240 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ler to handle th
10250 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65  e.** serial-type
10260 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73   and data blob s
10270 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  eperately..**.**
10280 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
10290 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
102a0 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61  he various stora
102b0 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64  ge classes for d
102c0 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72  ata:.**.**   ser
102d0 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20  ial type        
102e0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20  bytes of data   
102f0 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d     type.**   ---
10300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
10310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
10320 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
10330 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20  --.**      0    
10340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10350 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55   0            NU
10360 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20  LL.**      1    
10370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10380 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69   1            si
10390 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
103a0 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
103b0 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
103c0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
103d0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33  nteger.**      3
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103f0 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
10400 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
10410 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20  .**      4      
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
10430 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
10440 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
10450 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20     5            
10460 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
10470 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
10480 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20  eger.**      6  
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104a0 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
104b0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
104c0 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20  *      7        
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
104e0 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66            IEEE f
104f0 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20  loat.**      8  
10500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10510 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
10520 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
10530 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20   0.**      9    
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10550 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
10560 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31  teger constant 1
10570 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20  .**     10,11   
10580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10590 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65              rese
105a0 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69  rved for expansi
105b0 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61  on.**    N>=12 a
105c0 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e  nd even       (N
105d0 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c  -12)/2        BL
105e0 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61  OB.**    N>=13 a
105f0 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e  nd odd        (N
10600 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65  -13)/2        te
10610 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61  xt.**.** The 8 a
10620 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20  nd 9 types were 
10630 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20  added in 3.3.0, 
10640 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20  file format 4.  
10650 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a  Prior versions.*
10660 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c  * of SQLite will
10670 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20   not understand 
10680 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70  those serial typ
10690 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  es..*/../*.** Re
106a0 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d  turn the serial-
106b0 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c  type for the val
106c0 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
106d0 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  m..*/.u32 sqlite
106e0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
106f0 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
10700 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69  ile_format){.  i
10710 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d  nt flags = pMem-
10720 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b  >flags;.  int n;
10730 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  ..  if( flags&ME
10740 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65  M_Null ){.    re
10750 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
10760 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ( flags&MEM_Int 
10770 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ){.    /* Figure
10780 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20   out whether to 
10790 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f  use 1, 2, 4, 6 o
107a0 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20  r 8 bytes. */.# 
107b0 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59    define MAX_6BY
107c0 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30  TE ((((i64)0x000
107d0 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20  08000)<<32)-1). 
107e0 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d     i64 i = pMem-
107f0 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b  >u.i;.    u64 u;
10800 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f  .    if( file_fo
10810 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29  rmat>=4 && (i&1)
10820 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==i ){.      ret
10830 75 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20 20  urn 8+(u32)i;.  
10840 20 20 7d 0a 20 20 20 20 75 20 3d 20 69 3c 30 20    }.    u = i<0 
10850 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69 66  ? -i : i;.    if
10860 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72  ( u<=127 ) retur
10870 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 1;.    if( u<=
10880 33 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32  32767 ) return 2
10890 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38  ;.    if( u<=838
108a0 38 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b  8607 ) return 3;
108b0 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37  .    if( u<=2147
108c0 34 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20  483647 ) return 
108d0 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41  4;.    if( u<=MA
108e0 58 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e  X_6BYTE ) return
108f0 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   5;.    return 6
10900 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
10910 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
10920 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a    return 7;.  }.
10930 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
10940 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
10950 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53   || flags&(MEM_S
10960 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
10970 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20    n = pMem->n;. 
10980 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
10990 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
109a0 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pMem->u.nZero;
109b0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
109c0 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  >=0 );.  return 
109d0 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28  ((n*2) + 12 + ((
109e0 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d  flags&MEM_Str)!=
109f0 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  0));.}../*.** Re
10a00 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
10a10 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72  of the data corr
10a20 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
10a30 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c   supplied serial
10a40 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71  -type..*/.u32 sq
10a50 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
10a60 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61  ypeLen(u32 seria
10a70 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73  l_type){.  if( s
10a80 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
10a90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
10aa0 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
10ab0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
10ac0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
10ad0 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20  ize[] = { 0, 1, 
10ae0 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38  2, 3, 4, 6, 8, 8
10af0 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
10b00 20 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65      return aSize
10b10 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
10b20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77   }.}../*.** If w
10b30 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68  e are on an arch
10b40 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69  itecture with mi
10b50 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74  xed-endian float
10b60 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28  ing .** points (
10b70 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73  ex: ARM7) then s
10b80 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20  wap the lower 4 
10b90 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a  bytes with the .
10ba0 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73  ** upper 4 bytes
10bb0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
10bc0 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  sult..**.** For 
10bd0 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72  most architectur
10be0 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  es, this is a no
10bf0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65  -op..**.** (late
10c00 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72  r):  It is repor
10c10 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74  ted to me that t
10c20 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  he mixed-endian 
10c30 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52  problem.** on AR
10c40 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77  M7 is an issue w
10c50 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74  ith GCC, not wit
10c60 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e  h the ARM7 chip.
10c70 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68    It seems.** th
10c80 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e  at early version
10c90 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20  s of GCC stored 
10ca0 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66  the two words of
10cb0 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f   a 64-bit.** flo
10cc0 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20  at in the wrong 
10cd0 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74  order.  And that
10ce0 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
10cf0 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76  propagated.** ev
10d00 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62  er since.  The b
10d10 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  lame is not nece
10d20 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43  ssarily with GCC
10d30 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43  , though..** GCC
10d40 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74   might have just
10d50 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f   copying the pro
10d60 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f  blem from a prio
10d70 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49  r compiler..** I
10d80 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68   am also told th
10d90 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  at newer version
10da0 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f  s of GCC that fo
10db0 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74  llow a different
10dc0 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20  .** ABI get the 
10dd0 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74  byte order right
10de0 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65  ..**.** Develope
10df0 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20  rs using SQLite 
10e00 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c  on an ARM7 shoul
10e10 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75  d compile and ru
10e20 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69  n their.** appli
10e30 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53  cation using -DS
10e40 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74  QLITE_DEBUG=1 at
10e50 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69   least once.  Wi
10e60 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62  th DEBUG.** enab
10e70 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74  led, some assert
10e80 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73  s below will ens
10e90 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74  ure that the byt
10ea0 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c  e order of.** fl
10eb0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
10ec0 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ues is correct..
10ed0 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33  **.** (2007-08-3
10ee0 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75  0)  Frank van Vu
10ef0 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74  gt has studied t
10f00 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73  his problem clos
10f10 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73  ely.** and has s
10f20 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73  end his findings
10f30 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64   to the SQLite d
10f40 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e  evelopers.  Fran
10f50 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74  k.** writes that
10f60 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e   some Linux kern
10f70 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69  els offer floati
10f80 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72  ng point hardwar
10f90 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74  e.** emulation t
10fa0 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32  hat uses only 32
10fb0 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69  -bit mantissas i
10fc0 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c  nstead of a full
10fd0 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20   .** 48-bits as 
10fe0 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
10ff0 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20  IEEE standard.  
11000 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20  (This is the.** 
11010 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46  CONFIG_FPE_FASTF
11020 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20  PE option.)  On 
11030 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c  such systems, fl
11040 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
11050 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65  byte swapping be
11060 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c  comes very compl
11070 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69  icated.  To avoi
11080 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74  d problems,.** t
11090 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74  he necessary byt
110a0 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61  e swapping is ca
110b0 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20  rried out using 
110c0 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
110d0 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  .** rather than 
110e0 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20  a 64-bit float. 
110f0 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75   Frank assures u
11100 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  s that the code 
11110 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f  here.** works fo
11120 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20  r him.  We, the 
11130 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65  developers, have
11140 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70   no way to indep
11150 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69  endently.** veri
11160 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61  fy this, but Fra
11170 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77  nk seems to know
11180 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b   what he is talk
11190 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20  ing about.** so 
111a0 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f  we trust him..*/
111b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
111c0 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
111d0 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75  T_FLOAT.static u
111e0 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34  64 floatSwap(u64
111f0 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a   in){.  union {.
11200 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75      u64 r;.    u
11210 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a  32 i[2];.  } u;.
11220 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20    u32 t;..  u.r 
11230 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b  = in;.  t = u.i[
11240 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75  0];.  u.i[0] = u
11250 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20  .i[1];.  u.i[1] 
11260 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e  = t;.  return u.
11270 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77  r;.}.# define sw
11280 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
11290 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74  at(X)  X = float
112a0 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20  Swap(X).#else.# 
112b0 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
112c0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23  EndianFloat(X).#
112d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
112e0 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  te the serialize
112f0 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20  d data blob for 
11300 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
11310 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a   in pMem into .*
11320 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73  * buf. It is ass
11330 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
11340 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74  ller has allocat
11350 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ed sufficient sp
11360 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ace..** Return t
11370 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
11380 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a  es written..**.*
11390 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d  * nBuf is the am
113a0 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65  ount of space le
113b0 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42  ft in buf[].  nB
113c0 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  uf must always b
113d0 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67  e.** large enoug
113e0 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e  h to hold the en
113f0 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63  tire field.  Exc
11400 65 70 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c  ept, if the fiel
11410 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77  d is.** a blob w
11420 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65  ith a zero-fille
11430 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66  d tail, then buf
11440 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74  [] might be just
11450 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69   the right.** si
11460 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79  ze to hold every
11470 74 68 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72  thing except for
11480 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
11490 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d   tail.  If buf[]
114a0 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20  .** is only big 
114b0 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
114c0 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66  he non-zero pref
114d0 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72  ix, then only wr
114e0 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66  ite that.** pref
114f0 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  ix into buf[].  
11500 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20  But if buf[] is 
11510 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
11520 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a  hold both the.**
11530 20 70 72 65 66 69 78 20 61 6e 64 20 74 68 65 20   prefix and the 
11540 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20  tail then write 
11550 74 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73  the prefix and s
11560 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61  et the tail to a
11570 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a  ll.** zeros..**.
11580 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
11590 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
115a0 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  tually written i
115b0 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20  nto buf[].  The 
115c0 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74  number.** of byt
115d0 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66  es in the zero-f
115e0 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e  illed tail is in
115f0 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
11600 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a  turn value only.
11610 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65  ** if those byte
11620 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e  s were zeroed in
11630 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20   buf[]..*/ .u32 
11640 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
11650 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e  lPut(u8 *buf, in
11660 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65  t nBuf, Mem *pMe
11670 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d  m, int file_form
11680 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61  at){.  u32 seria
11690 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33  l_type = sqlite3
116a0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70  VdbeSerialType(p
116b0 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74  Mem, file_format
116c0 29 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20  );.  u32 len;.. 
116d0 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20   /* Integer and 
116e0 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65  Real */.  if( se
116f0 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20  rial_type<=7 && 
11700 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b  serial_type>0 ){
11710 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20  .    u64 v;.    
11720 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73  u32 i;.    if( s
11730 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
11740 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
11750 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66  izeof(v)==sizeof
11760 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20  (pMem->r) );.   
11770 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70     memcpy(&v, &p
11780 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76  Mem->r, sizeof(v
11790 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
117a0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
117b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
117c0 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
117d0 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
117e0 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64   = i = sqlite3Vd
117f0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
11800 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
11810 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 28    assert( len<=(
11820 75 33 32 29 6e 42 75 66 20 29 3b 0a 20 20 20 20  u32)nBuf );.    
11830 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20  while( i-- ){.  
11840 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 75 38      buf[i] = (u8
11850 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20  )(v&0xFF);.     
11860 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a   v >>= 8;.    }.
11870 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
11880 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67    }..  /* String
11890 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66   or blob */.  if
118a0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
118b0 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
118c0 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65   pMem->n + ((pMe
118d0 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
118e0 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  ero)?pMem->u.nZe
118f0 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20  ro:0).          
11900 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74     == (int)sqlit
11910 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
11920 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
11930 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11940 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b  pMem->n<=nBuf );
11950 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d  .    len = pMem-
11960 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62  >n;.    memcpy(b
11970 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e  uf, pMem->z, len
11980 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d  );.    if( pMem-
11990 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
119a0 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b  o ){.      len +
119b0 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pMem->u.nZero;
119c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
119d0 42 75 66 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  Buf>=0 );.      
119e0 69 66 28 20 6c 65 6e 20 3e 20 28 75 33 32 29 6e  if( len > (u32)n
119f0 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  Buf ){.        l
11a00 65 6e 20 3d 20 28 75 33 32 29 6e 42 75 66 3b 0a  en = (u32)nBuf;.
11a10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
11a20 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e  mset(&buf[pMem->
11a30 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d  n], 0, len-pMem-
11a40 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  >n);.    }.    r
11a50 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
11a60 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e    /* NULL or con
11a70 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f  stants 0 or 1 */
11a80 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
11a90 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
11aa0 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
11ab0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
11ac0 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
11ad0 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
11ae0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
11af0 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
11b00 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
11b10 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
11b20 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56  */ .u32 sqlite3V
11b30 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
11b40 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
11b50 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
11b60 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
11b70 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
11b80 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
11b90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
11ba0 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
11bb0 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
11bc0 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
11bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11be0 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
11bf0 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
11c00 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
11c10 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
11c20 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20  {.    case 10:  
11c30 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
11c40 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
11c50 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
11c60 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
11c70 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
11c80 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55  case 0: {  /* NU
11c90 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  LL */.      pMem
11ca0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
11cb0 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
11cc0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11cd0 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
11ce0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
11cf0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
11d00 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29   = (signed char)
11d10 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[0];.      pM
11d20 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
11d30 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
11d40 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
11d50 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
11d60 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
11d70 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
11d80 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  >u.i = (((signed
11d90 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38   char)buf[0])<<8
11da0 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  ) | buf[1];.    
11db0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
11dc0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
11dd0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
11de0 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
11df0 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
11e00 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
11e10 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69  Mem->u.i = (((si
11e20 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
11e30 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d  )<<16) | (buf[1]
11e40 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20  <<8) | buf[2];. 
11e50 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
11e60 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
11e70 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20    return 3;.    
11e80 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
11e90 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
11ea0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
11eb0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62    pMem->u.i = (b
11ec0 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
11ed0 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
11ee0 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
11ef0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
11f00 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
11f10 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
11f20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
11f30 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
11f40 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
11f50 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28       u64 x = (((
11f60 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
11f70 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
11f80 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d 20  ;.      u32 y = 
11f90 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28  (buf[2]<<24) | (
11fa0 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[3]<<16) | (b
11fb0 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[4]<<8) | buf[
11fc0 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  5];.      x = (x
11fd0 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20  <<32) | y;.     
11fe0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
11ff0 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d  64*)&x;.      pM
12000 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
12010 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
12020 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 6;.    }.    c
12030 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79  ase 6:   /* 8-by
12040 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
12050 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a  r */.    case 7:
12060 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74   { /* IEEE float
12070 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  ing point */.   
12080 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20     u64 x;.      
12090 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69  u32 y;.#if !defi
120a0 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
120b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
120c0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
120d0 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72  NT).      /* Ver
120e0 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
120f0 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
12100 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
12110 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a  the same.      *
12120 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f  * byte order.  O
12130 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54  r, that if SQLIT
12140 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
12150 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20  4BIT_FLOAT is.  
12160 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74      ** defined t
12170 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  hat 64-bit float
12180 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
12190 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65   really are mixe
121a0 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61  d.      ** endia
121b0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
121c0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
121d0 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78  64 t1 = ((u64)0x
121e0 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20  3ff00000)<<32;. 
121f0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
12200 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e  t double r1 = 1.
12210 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32 20  0;.      u64 t2 
12220 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70  = t1;.      swap
12230 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
12240 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65  (t2);.      asse
12250 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d  rt( sizeof(r1)==
12260 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65  sizeof(t2) && me
12270 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73  mcmp(&r1, &t2, s
12280 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b  izeof(r1))==0 );
12290 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78  .#endif..      x
122a0 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20   = (buf[0]<<24) 
122b0 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c  | (buf[1]<<16) |
122c0 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62   (buf[2]<<8) | b
122d0 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d  uf[3];.      y =
122e0 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20   (buf[4]<<24) | 
122f0 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28  (buf[5]<<16) | (
12300 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[6]<<8) | buf
12310 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  [7];.      x = (
12320 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20  x<<32) | y;.    
12330 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
12340 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  e==6 ){.        
12350 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
12360 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70  4*)&x;.        p
12370 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
12380 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _Int;.      }els
12390 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
123a0 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
123b0 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  && sizeof(pMem->
123c0 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20  r)==8 );.       
123d0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
123e0 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20  Float(x);.      
123f0 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e    memcpy(&pMem->
12400 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  r, &x, sizeof(x)
12410 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
12420 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  >flags = sqlite3
12430 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f  IsNaN(pMem->r) ?
12440 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f   MEM_Null : MEM_
12450 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Real;.      }.  
12460 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20      return 8;.  
12470 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
12480 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
12490 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
124a0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
124b0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
124c0 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
124d0 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
124e0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
124f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
12500 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
12510 74 3a 20 7b 0a 20 20 20 20 20 20 75 33 32 20 6c  t: {.      u32 l
12520 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  en = (serial_typ
12530 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  e-12)/2;.      p
12540 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Mem->z = (char *
12550 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d  )buf;.      pMem
12560 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  ->n = len;.     
12570 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b   pMem->xDel = 0;
12580 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
12590 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20  l_type&0x01 ){. 
125a0 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
125b0 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d  gs = MEM_Str | M
125c0 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
125d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
125e0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
125f0 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65  _Blob | MEM_Ephe
12600 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
12610 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20   return len;.   
12620 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
12630 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  0;.}.../*.** Giv
12640 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65  en the nKey-byte
12650 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72   encoding of a r
12660 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c  ecord in pKey[],
12670 20 70 61 72 73 65 20 74 68 65 0a 2a 2a 20 72 65   parse the.** re
12680 63 6f 72 64 20 69 6e 74 6f 20 61 20 55 6e 70 61  cord into a Unpa
12690 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63  ckedRecord struc
126a0 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 61 20  ture.  Return a 
126b0 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68  pointer to.** th
126c0 61 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  at structure..**
126d0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
126e0 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20 70  function might p
126f0 72 6f 76 69 64 65 20 73 7a 53 70 61 63 65 20 62  rovide szSpace b
12700 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  ytes of memory.*
12710 2a 20 73 70 61 63 65 20 61 74 20 70 53 70 61 63  * space at pSpac
12720 65 2e 20 20 54 68 69 73 20 73 70 61 63 65 20 63  e.  This space c
12730 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 68 6f  an be used to ho
12740 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  ld the returned.
12750 2a 2a 20 56 44 62 65 50 61 72 73 65 64 52 65 63  ** VDbeParsedRec
12760 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69 66  ord structure if
12770 20 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f   it is large eno
12780 75 67 68 2e 20 20 49 66 20 69 74 20 69 73 0a 2a  ugh.  If it is.*
12790 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f 75 67 68  * not big enough
127a0 2c 20 73 70 61 63 65 20 69 73 20 6f 62 74 61 69  , space is obtai
127b0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
127c0 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  _malloc()..**.**
127d0 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   The returned st
127e0 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20 62  ructure should b
127f0 65 20 63 6c 6f 73 65 64 20 62 79 20 61 20 63 61  e closed by a ca
12800 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ll to.** sqlite3
12810 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
12820 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a  edRecord()..*/ .
12830 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
12840 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
12850 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e  dUnpack(.  KeyIn
12860 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
12870 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
12880 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72   about the recor
12890 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e  d format */.  in
128a0 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
128b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
128c0 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  the binary recor
128d0 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
128e0 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a  d *pKey,      /*
128f0 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   The binary reco
12900 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53  rd */.  char *pS
12910 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 2f  pace,          /
12920 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63  * Unaligned spac
12930 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 68  e available to h
12940 6f 6c 64 20 74 68 65 20 6f 62 6a 65 63 74 20 2a  old the object *
12950 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 20  /.  int szSpace 
12960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
12970 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69  ze of pSpace[] i
12980 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20  n bytes */.){.  
12990 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
129a0 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
129b0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
129c0 20 2a 29 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63   *)pKey;.  Unpac
129d0 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 2f  kedRecord *p;  /
129e0 2a 20 54 68 65 20 75 6e 70 61 63 6b 65 64 20 72  * The unpacked r
129f0 65 63 6f 72 64 20 74 68 61 74 20 77 65 20 77 69  ecord that we wi
12a00 6c 6c 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  ll return */.  i
12a10 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
12a20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61     /* Memory spa
12a30 63 65 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  ce needed to hol
12a40 64 20 70 2c 20 69 6e 20 62 79 74 65 73 20 2a 2f  d p, in bytes */
12a50 0a 20 20 69 6e 74 20 64 3b 0a 20 20 75 33 32 20  .  int d;.  u32 
12a60 69 64 78 3b 0a 20 20 75 31 36 20 75 3b 20 20 20  idx;.  u16 u;   
12a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
12a80 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
12a90 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ter */.  u32 szH
12aa0 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b  dr;.  Mem *pMem;
12ab0 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20  .  int nOff;    
12ac0 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61         /* Increa
12ad0 73 65 20 70 53 70 61 63 65 20 62 79 20 74 68 69  se pSpace by thi
12ae0 73 20 6d 75 63 68 20 74 6f 20 38 2d 62 79 74 65  s much to 8-byte
12af0 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 0a   align it */.  .
12b00 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 77 61 6e    /*.  ** We wan
12b10 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70  t to shift the p
12b20 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70  ointer pSpace up
12b30 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73   such that it is
12b40 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e   8-byte aligned.
12b50 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e  .  ** Thus, we n
12b60 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65  eed to calculate
12b70 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20   a value, nOff, 
12b80 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c  between 0 and 7,
12b90 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20   to shift .  ** 
12ba0 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63  it by.  If pSpac
12bb0 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62  e is already 8-b
12bc0 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66  yte aligned, nOf
12bd0 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f  f should be zero
12be0 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20  ..  */.  nOff = 
12bf0 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52  (8 - (SQLITE_PTR
12c00 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20  _TO_INT(pSpace) 
12c10 26 20 37 29 29 20 26 20 37 3b 0a 20 20 70 53 70  & 7)) & 7;.  pSp
12c20 61 63 65 20 2b 3d 20 6e 4f 66 66 3b 0a 20 20 73  ace += nOff;.  s
12c30 7a 53 70 61 63 65 20 2d 3d 20 6e 4f 66 66 3b 0a  zSpace -= nOff;.
12c40 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
12c50 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
12c60 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f  Record)) + sizeo
12c70 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f  f(Mem)*(pKeyInfo
12c80 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69  ->nField+1);.  i
12c90 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65  f( nByte>szSpace
12ca0 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   ){.    p = sqli
12cb0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70  te3DbMallocRaw(p
12cc0 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79  KeyInfo->db, nBy
12cd0 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  te);.    if( p==
12ce0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
12cf0 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50    p->flags = UNP
12d00 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45 20  ACKED_NEED_FREE 
12d10 7c 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f  | UNPACKED_NEED_
12d20 44 45 53 54 52 4f 59 3b 0a 20 20 7d 65 6c 73 65  DESTROY;.  }else
12d30 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63  {.    p = (Unpac
12d40 6b 65 64 52 65 63 6f 72 64 2a 29 70 53 70 61 63  kedRecord*)pSpac
12d50 65 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  e;.    p->flags 
12d60 3d 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f  = UNPACKED_NEED_
12d70 44 45 53 54 52 4f 59 3b 0a 20 20 7d 0a 20 20 70  DESTROY;.  }.  p
12d80 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
12d90 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65  yInfo;.  p->nFie
12da0 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
12db0 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 70 2d 3e  Field + 1;.  p->
12dc0 61 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d 20 28 4d  aMem = pMem = (M
12dd0 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b  em*)&((char*)p)[
12de0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e  ROUND8(sizeof(Un
12df0 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b  packedRecord))];
12e00 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
12e10 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
12e20 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d  pMem) );.  idx =
12e30 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
12e40 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d  y, szHdr);.  d =
12e50 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b   szHdr;.  u = 0;
12e60 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a  .  while( idx<sz
12e70 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65  Hdr && u<p->nFie
12e80 6c 64 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b  ld && d<=nKey ){
12e90 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
12ea0 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b  type;..    idx +
12eb0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  = getVarint32(&a
12ec0 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c  Key[idx], serial
12ed0 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d  _type);.    pMem
12ee0 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  ->enc = pKeyInfo
12ef0 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d  ->enc;.    pMem-
12f00 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  >db = pKeyInfo->
12f10 64 62 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  db;.    pMem->fl
12f20 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65  ags = 0;.    pMe
12f30 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  m->zMalloc = 0;.
12f40 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33      d += sqlite3
12f50 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
12f60 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74  Key[d], serial_t
12f70 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  ype, pMem);.    
12f80 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b  pMem++;.    u++;
12f90 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75  .  }.  assert( u
12fa0 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  <=pKeyInfo->nFie
12fb0 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e  ld + 1 );.  p->n
12fc0 46 69 65 6c 64 20 3d 20 75 3b 0a 20 20 72 65 74  Field = u;.  ret
12fd0 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b 0a 7d 0a  urn (void*)p;.}.
12fe0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
12ff0 69 6e 65 20 64 65 73 74 72 6f 79 73 20 61 20 55  ine destroys a U
13000 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 6f 62  npackedRecord ob
13010 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ject..*/.void sq
13020 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55  lite3VdbeDeleteU
13030 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 55 6e  npackedRecord(Un
13040 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29  packedRecord *p)
13050 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d  {.  int i;.  Mem
13060 20 2a 70 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72   *pMem;..  asser
13070 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
13080 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 20 26 20  ert( p->flags & 
13090 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45  UNPACKED_NEED_DE
130a0 53 54 52 4f 59 20 29 3b 0a 20 20 66 6f 72 28 69  STROY );.  for(i
130b0 3d 30 2c 20 70 4d 65 6d 3d 70 2d 3e 61 4d 65 6d  =0, pMem=p->aMem
130c0 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69  ; i<p->nField; i
130d0 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20  ++, pMem++){.   
130e0 20 2f 2a 20 54 68 65 20 75 6e 70 61 63 6b 65 64   /* The unpacked
130f0 20 72 65 63 6f 72 64 20 69 73 20 61 6c 77 61 79   record is alway
13100 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  s constructed by
13110 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69   the.    ** sqli
13120 74 65 33 56 64 62 65 55 6e 70 61 63 6b 52 65 63  te3VdbeUnpackRec
13130 6f 72 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 61  ord() function a
13140 62 6f 76 65 2c 20 77 68 69 63 68 20 6d 61 6b 65  bove, which make
13150 73 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 74 72  s all.    ** str
13160 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 73  ings and blobs s
13170 74 61 74 69 63 2e 20 20 41 6e 64 20 6e 6f 6e 65  tatic.  And none
13180 20 6f 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 73   of the elements
13190 20 61 72 65 0a 20 20 20 20 2a 2a 20 65 76 65 72   are.    ** ever
131a0 20 74 72 61 6e 73 66 6f 72 6d 65 64 2c 20 73 6f   transformed, so
131b0 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20   there is never 
131c0 61 6e 79 74 68 69 6e 67 20 74 6f 20 64 65 6c 65  anything to dele
131d0 74 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  te..    */.    i
131e0 66 28 20 4e 45 56 45 52 28 70 4d 65 6d 2d 3e 7a  f( NEVER(pMem->z
131f0 4d 61 6c 6c 6f 63 29 20 29 20 73 71 6c 69 74 65  Malloc) ) sqlite
13200 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
13210 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pMem);.  }.  if(
13220 20 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41   p->flags & UNPA
13230 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45 20 29  CKED_NEED_FREE )
13240 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
13250 72 65 65 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  ree(p->pKeyInfo-
13260 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  >db, p);.  }.}..
13270 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
13280 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
13290 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
132a0 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
132b0 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
132c0 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
132d0 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20  and pPKey2.  It 
132e0 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
132f0 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
13300 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
13310 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  if key1 is less 
13320 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
13330 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
13340 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e  an key2.  The {n
13350 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
13360 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
13370 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
13380 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
13390 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42  pcode of the VDB
133a0 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a  E.  The pPKey2.*
133b0 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  * key must be a 
133c0 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20  parsed key such 
133d0 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
133e0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50  .** sqlite3VdbeP
133f0 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  arseRecord..**.*
13400 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
13410 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
13420 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
13430 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
13440 2e 0a 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74  ..** The key wit
13450 68 20 66 65 77 65 72 20 66 69 65 6c 64 73 20 69  h fewer fields i
13460 73 20 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72  s usually compar
13470 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  es less than the
13480 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e   .** longer key.
13490 20 20 48 6f 77 65 76 65 72 20 69 66 20 74 68 65    However if the
134a0 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45   UNPACKED_INCRKE
134b0 59 20 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79  Y flags in pPKey
134c0 32 20 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20  2 is set.** and 
134d0 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  the common prefi
134e0 78 65 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74  xes are equal, t
134f0 68 65 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73  hen key1 is less
13500 20 74 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f   than key2..** O
13510 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45  r if the UNPACKE
13520 44 5f 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66  D_MATCH_PREFIX f
13530 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
13540 68 65 20 70 72 65 66 69 78 65 73 20 61 72 65 0a  he prefixes are.
13550 2a 2a 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74  ** equal, then t
13560 68 65 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73  he keys are cons
13570 69 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75  idered to be equ
13580 61 6c 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61  al and.** the pa
13590 72 74 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63  rts beyond the c
135a0 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65  ommon prefix are
135b0 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
135c0 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  If the UNPACKED_
135d0 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 66 6c 61  IGNORE_ROWID fla
135e0 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
135f0 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a  he last byte of.
13600 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  ** the header of
13610 20 70 4b 65 79 31 20 69 73 20 69 67 6e 6f 72 65   pKey1 is ignore
13620 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
13630 64 20 74 68 61 74 20 70 4b 65 79 31 20 69 73 0a  d that pKey1 is.
13640 2a 2a 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 2c  ** an index key,
13650 20 61 6e 64 20 74 68 75 73 20 65 6e 64 73 20 77   and thus ends w
13660 69 74 68 20 61 20 72 6f 77 69 64 20 76 61 6c 75  ith a rowid valu
13670 65 2e 20 20 54 68 65 20 6c 61 73 74 20 62 79 74  e.  The last byt
13680 65 0a 2a 2a 20 6f 66 20 74 68 65 20 68 65 61 64  e.** of the head
13690 65 72 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72  er will therefor
136a0 65 20 62 65 20 74 68 65 20 73 65 72 69 61 6c 20  e be the serial 
136b0 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69  type of the rowi
136c0 64 3a 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c 20  d:.** one of 1, 
136d0 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36 2c 20 38  2, 3, 4, 5, 6, 8
136e0 2c 20 6f 72 20 39 20 2d 20 74 68 65 20 69 6e 74  , or 9 - the int
136f0 65 67 65 72 20 73 65 72 69 61 6c 20 74 79 70 65  eger serial type
13700 73 2e 0a 2a 2a 20 54 68 65 20 73 65 72 69 61 6c  s..** The serial
13710 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 69 6e   type of the fin
13720 61 6c 20 72 6f 77 69 64 20 77 69 6c 6c 20 61 6c  al rowid will al
13730 77 61 79 73 20 62 65 20 61 20 73 69 6e 67 6c 65  ways be a single
13740 20 62 79 74 65 2e 0a 2a 2a 20 42 79 20 69 67 6e   byte..** By ign
13750 6f 72 69 6e 67 20 74 68 69 73 20 6c 61 73 74 20  oring this last 
13760 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
13770 65 72 2c 20 77 65 20 66 6f 72 63 65 20 74 68 65  er, we force the
13780 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 74   comparison.** t
13790 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 72 6f 77  o ignore the row
137a0 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
137b0 20 6b 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71   key1..*/.int sq
137c0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
137d0 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b  ompare(.  int nK
137e0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
137f0 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
13800 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
13810 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
13820 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
13830 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  key */.){.  int 
13840 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  d1;            /
13850 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
13860 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
13870 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
13880 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
13890 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
138a0 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
138b0 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a  header element *
138c0 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
138d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
138e0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61   of bytes in hea
138f0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  der */.  int i =
13900 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   0;.  int nField
13910 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
13920 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
13930 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
13940 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
13950 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b  har *)pKey1;.  K
13960 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
13970 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
13980 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65   pKeyInfo = pPKe
13990 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
139a0 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
139b0 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31  nfo->enc;.  mem1
139c0 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
139d0 64 62 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61 67 73  db;.  mem1.flags
139e0 20 3d 20 30 3b 0a 20 20 6d 65 6d 31 2e 75 2e 69   = 0;.  mem1.u.i
139f0 20 3d 20 30 3b 20 20 2f 2a 20 6e 6f 74 20 6e 65   = 0;  /* not ne
13a00 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69  eded, here to si
13a10 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77  lence compiler w
13a20 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 6d 65 6d 31  arning */.  mem1
13a30 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  .zMalloc = 0;.  
13a40 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72  .  idx1 = getVar
13a50 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48  int32(aKey1, szH
13a60 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48  dr1);.  d1 = szH
13a70 64 72 31 3b 0a 20 20 69 66 28 20 70 50 4b 65 79  dr1;.  if( pPKey
13a80 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  2->flags & UNPAC
13a90 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44  KED_IGNORE_ROWID
13aa0 20 29 7b 0a 20 20 20 20 73 7a 48 64 72 31 2d 2d   ){.    szHdr1--
13ab0 3b 0a 20 20 7d 0a 20 20 6e 46 69 65 6c 64 20 3d  ;.  }.  nField =
13ac0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
13ad0 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31  d;.  while( idx1
13ae0 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  <szHdr1 && i<pPK
13af0 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20  ey2->nField ){. 
13b00 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
13b10 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  pe1;..    /* Rea
13b20 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  d the serial typ
13b30 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  es for the next 
13b40 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20  element in each 
13b50 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31  key. */.    idx1
13b60 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
13b70 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72   aKey1+idx1, ser
13b80 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20  ial_type1 );.   
13b90 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26   if( d1>=nKey1 &
13ba0 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  & sqlite3VdbeSer
13bb0 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
13bc0 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65  l_type1)>0 ) bre
13bd0 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72  ak;..    /* Extr
13be0 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  act the values t
13bf0 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20  o be compared.. 
13c00 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20     */.    d1 += 
13c10 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
13c20 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
13c30 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26   serial_type1, &
13c40 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  mem1);..    /* D
13c50 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
13c60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
13c70 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
13c80 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79  re(&mem1, &pPKey
13c90 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20  2->aMem[i],.    
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cb0 20 20 20 20 20 20 20 69 3c 6e 46 69 65 6c 64 20         i<nField 
13cc0 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ? pKeyInfo->aCol
13cd0 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69  l[i] : 0);.    i
13ce0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
13cf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13d00 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
13d10 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  * No memory allo
13d20 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75  cation is ever u
13d30 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 2a 2f 0a  sed on mem1. */.
13d40 20 20 69 66 28 20 4e 45 56 45 52 28 6d 65 6d 31    if( NEVER(mem1
13d50 2e 7a 4d 61 6c 6c 6f 63 29 20 29 20 73 71 6c 69  .zMalloc) ) sqli
13d60 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
13d70 65 28 26 6d 65 6d 31 29 3b 0a 0a 20 20 2f 2a 20  e(&mem1);..  /* 
13d80 49 66 20 74 68 65 20 50 52 45 46 49 58 5f 53 45  If the PREFIX_SE
13d90 41 52 43 48 20 66 6c 61 67 20 69 73 20 73 65 74  ARCH flag is set
13da0 20 61 6e 64 20 61 6c 6c 20 66 69 65 6c 64 73 20   and all fields 
13db0 65 78 63 65 70 74 20 74 68 65 20 66 69 6e 61 6c  except the final
13dc0 0a 20 20 2a 2a 20 72 6f 77 69 64 20 66 69 65 6c  .  ** rowid fiel
13dd0 64 20 77 65 72 65 20 65 71 75 61 6c 2c 20 74 68  d were equal, th
13de0 65 6e 20 63 6c 65 61 72 20 74 68 65 20 50 52 45  en clear the PRE
13df0 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20  FIX_SEARCH flag 
13e00 61 6e 64 20 73 65 74 20 0a 20 20 2a 2a 20 70 50  and set .  ** pP
13e10 4b 65 79 32 2d 3e 72 6f 77 69 64 20 74 6f 20 74  Key2->rowid to t
13e20 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
13e30 72 6f 77 69 64 20 66 69 65 6c 64 20 69 6e 20 28  rowid field in (
13e40 70 4b 65 79 31 2c 20 6e 4b 65 79 31 29 2e 0a 20  pKey1, nKey1).. 
13e50 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64   ** This is used
13e60 20 62 79 20 74 68 65 20 4f 50 5f 49 73 55 6e 69   by the OP_IsUni
13e70 71 75 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f  que opcode..  */
13e80 0a 20 20 69 66 28 20 28 70 50 4b 65 79 32 2d 3e  .  if( (pPKey2->
13e90 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
13ea0 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48 29 20  _PREFIX_SEARCH) 
13eb0 26 26 20 69 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e  && i==(pPKey2->n
13ec0 46 69 65 6c 64 2d 31 29 20 29 7b 0a 20 20 20 20  Field-1) ){.    
13ed0 61 73 73 65 72 74 28 20 69 64 78 31 3d 3d 73 7a  assert( idx1==sz
13ee0 48 64 72 31 20 26 26 20 72 63 20 29 3b 0a 20 20  Hdr1 && rc );.  
13ef0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 66    assert( mem1.f
13f00 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
13f10 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c  ;.    pPKey2->fl
13f20 61 67 73 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44  ags &= ~UNPACKED
13f30 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48 3b 0a  _PREFIX_SEARCH;.
13f40 20 20 20 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69      pPKey2->rowi
13f50 64 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20  d = mem1.u.i;.  
13f60 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  }..  if( rc==0 )
13f70 7b 0a 20 20 20 20 2f 2a 20 72 63 3d 3d 30 20 68  {.    /* rc==0 h
13f80 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ere means that o
13f90 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  ne of the keys r
13fa0 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
13fb0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 6c 6c 20   and.    ** all 
13fc0 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
13fd0 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
13fe0 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 55   equal. If the U
13ff0 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a  NPACKED_INCRKEY.
14000 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
14010 65 74 2c 20 74 68 65 6e 20 62 72 65 61 6b 20 74  et, then break t
14020 68 65 20 74 69 65 20 62 79 20 74 72 65 61 74 69  he tie by treati
14030 6e 67 20 6b 65 79 32 20 61 73 20 6c 61 72 67 65  ng key2 as large
14040 72 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  r..    ** If the
14050 20 55 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f   UPACKED_PREFIX_
14060 4d 41 54 43 48 20 66 6c 61 67 20 69 73 20 73 65  MATCH flag is se
14070 74 2c 20 74 68 65 6e 20 6b 65 79 73 20 77 69 74  t, then keys wit
14080 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65  h common prefixe
14090 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 63 6f 6e  s.    ** are con
140a0 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65 71  sidered to be eq
140b0 75 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ual.  Otherwise,
140c0 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20   the longer key 
140d0 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 6c  is the .    ** l
140e0 61 72 67 65 72 2e 20 20 41 73 20 69 74 20 68 61  arger.  As it ha
140f0 70 70 65 6e 73 2c 20 74 68 65 20 70 50 4b 65 79  ppens, the pPKey
14100 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  2 will always be
14110 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20 20 20   the longer.    
14120 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ** if there is a
14130 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 20   difference..   
14140 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 4b 65   */.    if( pPKe
14150 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41  y2->flags & UNPA
14160 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a  CKED_INCRKEY ){.
14170 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
14180 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b     }else if( pPK
14190 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ey2->flags & UNP
141a0 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54  ACKED_PREFIX_MAT
141b0 43 48 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c  CH ){.      /* L
141c0 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20  eave rc==0 */.  
141d0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64 78 31    }else if( idx1
141e0 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20 20 20 20  <szHdr1 ){.     
141f0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
14200 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49   }else if( pKeyI
14210 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
14220 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  && i<pKeyInfo->n
14230 46 69 65 6c 64 0a 20 20 20 20 20 20 20 20 20 20  Field.          
14240 20 20 20 20 20 26 26 20 70 4b 65 79 49 6e 66 6f       && pKeyInfo
14250 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
14260 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b  ){.    rc = -rc;
14270 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
14280 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70 43  c;.}. ../*.** pC
14290 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
142a0 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61  index entry crea
142b0 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  ted using the OP
142c0 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
142d0 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  de..** Read the 
142e0 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20  rowid (the last 
142f0 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63  field in the rec
14300 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69  ord) and store i
14310 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20  t in *rowid..** 
14320 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
14330 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
14340 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f  orks, or an erro
14350 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
14360 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67  ..**.** pCur mig
14370 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  ht be pointing t
14380 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20  o text obtained 
14390 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64  from a corrupt d
143a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
143b0 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   So the content 
143c0 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
143d0 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61  d.  Do appropria
143e0 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65  te checks on the
143f0 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74   content..*/.int
14400 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
14410 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
14420 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  , BtCursor *pCur
14430 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20  , i64 *rowid){. 
14440 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
14450 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
14460 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20  32 szHdr;       
14470 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
14480 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
14490 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a  typeRowid;    /*
144a0 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   Serial type of 
144b0 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75  the rowid */.  u
144c0 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20  32 lenRowid;    
144d0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
144e0 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d  rowid */.  Mem m
144f0 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  , v;..  /* Get t
14500 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  he size of the i
14510 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c  ndex entry.  Onl
14520 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65  y indices entrie
14530 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74  s of less.  ** t
14540 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70  han 2GiB are sup
14550 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20  port - anything 
14560 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61  large must be da
14570 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
14580 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72  n..  ** Any corr
14590 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
145a0 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72  ed in sqlite3Btr
145b0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
145c0 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a  , though, so.  *
145d0 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20  * this code can 
145e0 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68  safely assume th
145f0 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33  at nCellKey is 3
14600 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20  2-bits  .  */.  
14610 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
14620 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
14630 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  d(pCur) );.  rc 
14640 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
14650 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
14660 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  llKey);.  assert
14670 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14680 29 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69  );     /* pCur i
14690 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73  s always valid s
146a0 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74  o KeySize cannot
146b0 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72   fail */.  asser
146c0 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53  t( (nCellKey & S
146d0 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d  QLITE_MAX_U32)==
146e0 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b  (u64)nCellKey );
146f0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
14700 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
14710 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ent of the index
14720 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 65 6d 73   entry */.  mems
14730 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&m, 0, sizeof
14740 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (m));.  rc = sql
14750 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
14760 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 69  tree(pCur, 0, (i
14770 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  nt)nCellKey, 1, 
14780 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
14790 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
147a0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e    }..  /* The in
147b0 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62  dex entry must b
147c0 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64  egin with a head
147d0 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f  er size */.  (vo
147e0 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
147f0 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b  u8*)m.z, szHdr);
14800 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
14810 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63  dr==3 );.  testc
14820 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20  ase( szHdr==m.n 
14830 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
14840 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e  y(szHdr<3 || (in
14850 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a  t)szHdr>m.n) ){.
14860 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
14870 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
14880 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73   }..  /* The las
14890 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69  t field of the i
148a0 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61  ndex should be a
148b0 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20  n integer - the 
148c0 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69  ROWID..  ** Veri
148d0 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  fy that the last
148e0 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73   entry really is
148f0 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   an integer. */.
14900 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
14910 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a  t32((u8*)&m.z[sz
14920 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69  Hdr-1], typeRowi
14930 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d);.  testcase( 
14940 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a  typeRowid==1 );.
14950 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
14960 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65  Rowid==2 );.  te
14970 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
14980 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  d==3 );.  testca
14990 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34  se( typeRowid==4
149a0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
149b0 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a  typeRowid==5 );.
149c0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
149d0 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65  Rowid==6 );.  te
149e0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
149f0 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61  d==8 );.  testca
14a00 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39  se( typeRowid==9
14a10 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
14a20 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c  ly(typeRowid<1 |
14a30 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c  | typeRowid>9 ||
14a40 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29   typeRowid==7) )
14a50 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
14a60 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
14a70 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20  .  }.  lenRowid 
14a80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
14a90 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52  ialTypeLen(typeR
14aa0 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73  owid);.  testcas
14ab0 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48  e( (u32)m.n==szH
14ac0 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20  dr+lenRowid );. 
14ad0 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75   if( unlikely((u
14ae0 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e  32)m.n<szHdr+len
14af0 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f  Rowid) ){.    go
14b00 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
14b10 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
14b20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74  /* Fetch the int
14b30 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64  eger off the end
14b40 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65   of the index re
14b50 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cord */.  sqlite
14b60 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28  3VdbeSerialGet((
14b70 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e  u8*)&m.z[m.n-len
14b80 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69  Rowid], typeRowi
14b90 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64  d, &v);.  *rowid
14ba0 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69   = v.u.i;.  sqli
14bb0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
14bc0 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
14bd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
14be0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61   Jump here if da
14bf0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
14c00 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66  n is detected af
14c10 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20  ter m has been. 
14c20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20   ** allocated.  
14c30 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63  Free the m objec
14c40 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  t and return SQL
14c50 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a  ITE_CORRUPT. */.
14c60 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
14c70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65  tion:.  testcase
14c80 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29  ( m.zMalloc!=0 )
14c90 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
14ca0 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
14cb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
14cc0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a  ORRUPT_BKPT;.}..
14cd0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
14ce0 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64  e key of the ind
14cf0 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  ex entry that cu
14d00 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74  rsor pC is point
14d10 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  ing to against.*
14d20 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
14d30 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20   in pUnpacked.  
14d40 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
14d50 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
14d60 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
14d70 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
14d80 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
14d90 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
14da0 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
14db0 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65  n pUnpacked.  Re
14dc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
14dd0 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
14de0 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69   pUnpacked is ei
14df0 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
14e00 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
14e10 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
14e20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
14e30 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
14e40 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
14e50 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
14e60 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
14e70 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
14e80 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74   well.  Hence, t
14e90 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
14ea0 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72   compares the pr
14eb0 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68  efixes .** of th
14ec0 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20  e keys prior to 
14ed0 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c  the final rowid,
14ee0 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20   not the entire 
14ef0 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
14f00 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
14f10 70 61 72 65 28 0a 20 20 56 64 62 65 43 75 72 73  pare(.  VdbeCurs
14f20 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20  or *pC,         
14f30 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
14f40 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  r to compare aga
14f50 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  inst */.  Unpack
14f60 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63  edRecord *pUnpac
14f70 6b 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65  ked,  /* Unpacke
14f80 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79  d version of key
14f90 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
14fa0 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  nst */.  int *re
14fb0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
14fc0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
14fd0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73  e comparison res
14fe0 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ult here */.){. 
14ff0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
15000 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  0;.  int rc;.  B
15010 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  tCursor *pCur = 
15020 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d  pC->pCursor;.  M
15030 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  em m;..  assert(
15040 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
15050 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
15060 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
15070 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
15080 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
15090 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
150a0 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f  QLITE_OK );    /
150b0 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73  * pCur is always
150c0 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a   valid so KeySiz
150d0 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  e cannot fail */
150e0 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77  .  /* nCellKey w
150f0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65  ill always be be
15100 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66  tween 0 and 0xff
15110 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f  ffffff because o
15120 66 20 74 68 65 20 73 61 79 0a 20 20 2a 2a 20 74  f the say.  ** t
15130 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65  hat btreeParseCe
15140 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69  llPtr() and sqli
15150 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29  te3GetVarint32()
15160 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
15170 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b   */.  if( nCellK
15180 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65  ey<=0 || nCellKe
15190 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a  y>0x7fffffff ){.
151a0 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20      *res = 0;.  
151b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
151c0 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 6d  CORRUPT;.  }.  m
151d0 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a  emset(&m, 0, siz
151e0 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20  eof(m));.  rc = 
151f0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
15200 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72  omBtree(pC->pCur
15210 73 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65  sor, 0, (int)nCe
15220 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
15230 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
15240 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
15250 61 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65  assert( pUnpacke
15260 64 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  d->flags & UNPAC
15270 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44  KED_IGNORE_ROWID
15280 20 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c   );.  *res = sql
15290 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
152a0 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  mpare(m.n, m.z, 
152b0 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71  pUnpacked);.  sq
152c0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
152d0 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
152e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
152f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
15300 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75  ne sets the valu
15310 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
15320 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
15330 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
15340 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20  e3_changes() on 
15350 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
15360 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f  dle 'db'. .*/.vo
15370 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
15380 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  tChanges(sqlite3
15390 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67   *db, int nChang
153a0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
153b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
153c0 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
153d0 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e   db->nChange = n
153e0 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54  Change;.  db->nT
153f0 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43  otalChange += nC
15400 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
15410 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68  Set a flag in th
15420 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65  e vdbe to update
15430 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
15440 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66  ter when it is f
15450 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72  inalised.** or r
15460 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eset..*/.void sq
15470 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68  lite3VdbeCountCh
15480 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a  anges(Vdbe *v){.
15490 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e    v->changeCntOn
154a0 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 1;.}../*.** M
154b0 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72  ark every prepar
154c0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73  ed statement ass
154d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
154e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
154f0 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64  on.** as expired
15500 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72  ..**.** An expir
15510 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61  ed statement mea
15520 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c  ns that recompil
15530 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  ation of the sta
15540 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63  tement is.** rec
15550 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65  ommend.  Stateme
15560 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20  nts expire when 
15570 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68  things happen th
15580 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a  at make their.**
15590 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65   programs obsole
155a0 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73  te.  Removing us
155b0 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
155c0 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e  ions or collatin
155d0 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20  g.** sequences, 
155e0 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61  or changing an a
155f0 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e  uthorization fun
15600 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79  ction are the ty
15610 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73  pes of.** things
15620 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61   that make prepa
15630 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  red statements o
15640 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64  bsolete..*/.void
15650 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
15660 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
15670 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
15680 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
15690 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
156a0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
156b0 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
156c0 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
156d0 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
156e0 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
156f0 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f  ith the Vdbe..*/
15700 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
15710 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29  3VdbeDb(Vdbe *v)
15720 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62  {.  return v->db
15730 3b 0a 7d 0a                                      ;.}.