/ Hex Artifact Content
Login

Artifact 6834737c119f5662c9e6d147ddb4f72523a31aea:


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 23 69 66 64 65 66 20  ;.  }.}..#ifdef 
18e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20  SQLITE_DEBUG /* 
18f0: 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
1900: 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f  Abort() logic */
1910: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1920: 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66  owing type and f
1930: 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64  unction are used
1940: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
1950: 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a  ugh all opcodes.
1960: 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69  ** in a Vdbe mai
1970: 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61  n program and ea
1980: 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72  ch of the sub-pr
1990: 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73  ograms (triggers
19a0: 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76  ) it may .** inv
19b0: 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20  oke directly or 
19c0: 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73  indirectly. It s
19d0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73  hould be used as
19e0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
19f0: 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20    Op *pOp;.**   
1a00: 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72  VdbeOpIter sIter
1a10: 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74  ;.**.**   memset
1a20: 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  (&sIter, 0, size
1a30: 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20  of(sIter));.**  
1a40: 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20   sIter.v = v;   
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73           // v is
1a70: 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a   of type Vdbe* .
1a80: 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70  **   while( (pOp
1a90: 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73   = opIterNext(&s
1aa0: 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20  Iter)) ){.**    
1ab0: 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67   // Do something
1ac0: 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d   with pOp.**   }
1ad0: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46  .**   sqlite3DbF
1ae0: 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72  ree(v->db, sIter
1af0: 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a  .apSub);.** .*/.
1b00: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56  typedef struct V
1b10: 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70  dbeOpIter VdbeOp
1b20: 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62  Iter;.struct Vdb
1b30: 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65  eOpIter {.  Vdbe
1b40: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
1b50: 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74         /* Vdbe t
1b60: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1b70: 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66  h the opcodes of
1b80: 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
1b90: 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20   **apSub;       
1ba0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62   /* Array of sub
1bb0: 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e  programs */.  in
1bc0: 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20  t nSub;         
1bd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1be0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1bf0: 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20   apSub */.  int 
1c00: 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20  iAddr;          
1c10: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1c20: 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75  s of next instru
1c30: 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20  ction to return 
1c40: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20  */.  int iSub;  
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67  /* 0 = main prog
1c70: 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73  ram, 1 = first s
1c80: 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20  ub-program etc. 
1c90: 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20  */.};.static Op 
1ca0: 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65  *opIterNext(Vdbe
1cb0: 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64  OpIter *p){.  Vd
1cc0: 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20  be *v = p->v;.  
1cd0: 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  Op *pRet = 0;.  
1ce0: 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e  Op *aOp;.  int n
1cf0: 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53  Op;..  if( p->iS
1d00: 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a  ub<=p->nSub ){..
1d10: 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d      if( p->iSub=
1d20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20  =0 ){.      aOp 
1d30: 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20  = v->aOp;.      
1d40: 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20  nOp = v->nOp;.  
1d50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1d60: 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d  Op = p->apSub[p-
1d70: 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20  >iSub-1]->aOp;. 
1d80: 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70       nOp = p->ap
1d90: 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e  Sub[p->iSub-1]->
1da0: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  nOp;.    }.    a
1db0: 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c  ssert( p->iAddr<
1dc0: 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74  nOp );..    pRet
1dd0: 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72   = &aOp[p->iAddr
1de0: 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b  ];.    p->iAddr+
1df0: 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41  +;.    if( p->iA
1e00: 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20  ddr==nOp ){.    
1e10: 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20    p->iSub++;.   
1e20: 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b     p->iAddr = 0;
1e30: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
1e40: 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d  ( pRet->p4type==
1e50: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b  P4_SUBPROGRAM ){
1e60: 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
1e70: 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73   = (p->nSub+1)*s
1e80: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
1e90: 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  *);.      int j;
1ea0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
1eb0: 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b  j<p->nSub; j++){
1ec0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1ed0: 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e  apSub[j]==pRet->
1ee0: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72  p4.pProgram ) br
1ef0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1f00: 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75     if( j==p->nSu
1f10: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  b ){.        p->
1f20: 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44  apSub = sqlite3D
1f30: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76  bReallocOrFree(v
1f40: 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20  ->db, p->apSub, 
1f50: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
1f60: 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b  if( !p->apSub ){
1f70: 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20  .          pRet 
1f80: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
1f90: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  se{.          p-
1fa0: 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b  >apSub[p->nSub++
1fb0: 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72  ] = pRet->p4.pPr
1fc0: 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d  ogram;.        }
1fd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1fe0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65   }..  return pRe
1ff0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  t;.}../*.** Chec
2000: 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  k if the program
2010: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
2020: 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  M associated wit
2030: 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20  h pParse may.** 
2040: 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65  throw an ABORT e
2050: 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e  xception (causin
2060: 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  g the statement,
2070: 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20   but not entire 
2080: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74  transaction.** t
2090: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
20a0: 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f  ). This conditio
20b0: 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  n is true if the
20c0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72   main program or
20d0: 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67   any.** sub-prog
20e0: 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e  rams contains an
20f0: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
2100: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f  ng:.**.**   *  O
2110: 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53  P_Halt with P1=S
2120: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
2130: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
2140: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c  ..**   *  OP_Hal
2150: 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d  tIfNull with P1=
2160: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
2170: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
2180: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65  t..**   *  OP_De
2190: 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50  stroy.**   *  OP
21a0: 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20  _VUpdate.**   * 
21b0: 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20   OP_VRename.**  
21c0: 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72   *  OP_FkCounter
21d0: 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d   with P2==0 (imm
21e0: 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
21f0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a  ey constraint).*
2200: 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20  *.** Then check 
2210: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f  that the value o
2220: 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74  f Parse.mayAbort
2230: 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a   is true if an.*
2240: 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74  * ABORT may be t
2250: 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20  hrown, or false 
2260: 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72  otherwise. Retur
2270: 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  n true if it doe
2280: 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66  s.** match, or f
2290: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20  alse otherwise. 
22a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
22b0: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
22c0: 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  used as.** part 
22d0: 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61  of an assert sta
22e0: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f  tement in the co
22f0: 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20  mpiler. Similar 
2300: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  to:.**.**   asse
2310: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41  rt( sqlite3VdbeA
2320: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50  ssertMayAbort(pP
2330: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61  arse->pVdbe, pPa
2340: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29  rse->mayAbort) )
2350: 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.*/.int sqlite3
2360: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
2370: 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  rt(Vdbe *v, int 
2380: 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74  mayAbort){.  int
2390: 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20   hasAbort = 0;. 
23a0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65   Op *pOp;.  Vdbe
23b0: 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20  OpIter sIter;.  
23c0: 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30  memset(&sIter, 0
23d0: 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29  , sizeof(sIter))
23e0: 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  ;.  sIter.v = v;
23f0: 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  ..  while( (pOp 
2400: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
2410: 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ter))!=0 ){.    
2420: 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70  int opcode = pOp
2430: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66  ->opcode;.    if
2440: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73  ( opcode==OP_Des
2450: 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  troy || opcode==
2460: 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70  OP_VUpdate || op
2470: 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65  code==OP_VRename
2480: 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
2490: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
24a0: 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64  Y.     || (opcod
24b0: 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20  e==OP_FkCounter 
24c0: 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26  && pOp->p1==0 &&
24d0: 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65   pOp->p2==1) .#e
24e0: 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f  ndif.     || ((o
24f0: 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c  pcode==OP_Halt |
2500: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c  | opcode==OP_Hal
2510: 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20  tIfNull) .      
2520: 26 26 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c  && (pOp->p1==SQL
2530: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26  ITE_CONSTRAINT &
2540: 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62  & pOp->p2==OE_Ab
2550: 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ort)).    ){.   
2560: 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b     hasAbort = 1;
2570: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2580: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2590: 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73  3DbFree(v->db, s
25a0: 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20  Iter.apSub);..  
25b0: 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  /* Return true i
25c0: 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41  f hasAbort==mayA
25d0: 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61  bort. Or if a ma
25e0: 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
25f0: 75 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61  ured..  ** If ma
2600: 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65  lloc failed, the
2610: 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f  n the while() lo
2620: 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74  op above may not
2630: 20 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20   have iterated. 
2640: 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20   ** through all 
2650: 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41  opcodes and hasA
2660: 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20  bort may be set 
2670: 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74  incorrectly. Ret
2680: 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f  urn.  ** true fo
2690: 72 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70  r this case to p
26a0: 72 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72  revent the asser
26b0: 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65  t() in the calle
26c0: 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72  rs frame.  ** fr
26d0: 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a  om failing.  */.
26e0: 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62    return ( v->db
26f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
2700: 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41  | hasAbort==mayA
2710: 62 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  bort );.}.#endif
2720: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
2730: 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73   - the sqlite3As
2740: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66  sertMayAbort() f
2750: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a  unction */../*.*
2760: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  * Loop through t
2770: 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69  he program looki
2780: 6e 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73  ng for P2 values
2790: 20 74 68 61 74 20 61 72 65 20 6e 65 67 61 74 69   that are negati
27a0: 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e  ve.** on jump in
27b0: 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63  structions.  Eac
27c0: 68 20 73 75 63 68 20 76 61 6c 75 65 20 69 73 20  h such value is 
27d0: 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76  a label.  Resolv
27e0: 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62  e the.** label b
27f0: 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32  y setting the P2
2800: 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f   value to its co
2810: 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76  rrect non-zero v
2820: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  alue..**.** This
2830: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2840: 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c  ed once after al
2850: 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62  l opcodes have b
2860: 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a  een inserted..**
2870: 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d  .** Variable *pM
2880: 61 78 46 75 6e 63 41 72 67 73 20 69 73 20 73 65  axFuncArgs is se
2890: 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  t to the maximum
28a0: 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32   value of any P2
28b0: 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f   argument .** to
28c0: 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c   an OP_Function,
28d0: 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f   OP_AggStep or O
28e0: 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65  P_VFilter opcode
28f0: 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62  . This is used b
2900: 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  y .** sqlite3Vdb
2910: 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20  eMakeReady() to 
2920: 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70  size the Vdbe.ap
2930: 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  Arg[] array..*/.
2940: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f  static void reso
2950: 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65  lveP2Values(Vdbe
2960: 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75   *p, int *pMaxFu
2970: 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 69  ncArgs){.  int i
2980: 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73  ;.  int nMaxArgs
2990: 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73   = *pMaxFuncArgs
29a0: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  ;.  Op *pOp;.  i
29b0: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e  nt *aLabel = p->
29c0: 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61  aLabel;.  p->rea
29d0: 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 66 6f 72  dOnly = 1;.  for
29e0: 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70  (pOp=p->aOp, i=p
29f0: 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69  ->nOp-1; i>=0; i
2a00: 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  --, pOp++){.    
2a10: 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  u8 opcode = pOp-
2a20: 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 69 66  >opcode;..    if
2a30: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e  ( opcode==OP_Fun
2a40: 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d  ction || opcode=
2a50: 3d 4f 50 5f 41 67 67 53 74 65 70 20 29 7b 0a 20  =OP_AggStep ){. 
2a60: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35       if( pOp->p5
2a70: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
2a80: 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a  Args = pOp->p5;.
2a90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2aa0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2ab0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
2ac0: 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74  pcode==OP_VUpdat
2ad0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
2ae0: 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20  Op->p2>nMaxArgs 
2af0: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70  ) nMaxArgs = pOp
2b00: 2d 3e 70 32 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ->p2;.#endif.   
2b10: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
2b20: 65 3d 3d 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  e==OP_Transactio
2b30: 6e 20 26 26 20 70 4f 70 2d 3e 70 32 21 3d 30 20  n && pOp->p2!=0 
2b40: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 65 61 64  ){.      p->read
2b50: 4f 6e 6c 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Only = 0;.#ifnde
2b60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2b70: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d  RTUALTABLE.    }
2b80: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
2b90: 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b 0a 20  =OP_VFilter ){. 
2ba0: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
2bb0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
2bc0: 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20   - i >= 3 );.   
2bd0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
2be0: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  1].opcode==OP_In
2bf0: 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 6e  teger );.      n
2c00: 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20   = pOp[-1].p1;. 
2c10: 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41       if( n>nMaxA
2c20: 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d  rgs ) nMaxArgs =
2c30: 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d   n;.#endif.    }
2c40: 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
2c50: 33 56 64 62 65 4f 70 63 6f 64 65 48 61 73 50 72  3VdbeOpcodeHasPr
2c60: 6f 70 65 72 74 79 28 6f 70 63 6f 64 65 2c 20 4f  operty(opcode, O
2c70: 50 46 4c 47 5f 4a 55 4d 50 29 20 26 26 20 70 4f  PFLG_JUMP) && pO
2c80: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20  p->p2<0 ){.     
2c90: 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d   assert( -1-pOp-
2ca0: 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  >p2<p->nLabel );
2cb0: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
2cc0: 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e   aLabel[-1-pOp->
2cd0: 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p2];.    }.  }. 
2ce0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
2cf0: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29  ->db, p->aLabel)
2d00: 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20  ;.  p->aLabel = 
2d10: 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41  0;..  *pMaxFuncA
2d20: 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a  rgs = nMaxArgs;.
2d30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2d40: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
2d50: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
2d60: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
2d70: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2d80: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2d90: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
2da0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
2db0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
2dc0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
2dd0: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Op;.}../*.** Thi
2de0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2df0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
2e00: 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63  the array of opc
2e10: 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  odes associated 
2e20: 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65  with.** the Vdbe
2e30: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
2e40: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49  irst argument. I
2e50: 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
2e60: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
2e70: 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f  ** to arrange fo
2e80: 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61  r the returned a
2e90: 72 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74  rray to be event
2ea0: 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
2eb0: 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72  g the .** vdbeFr
2ec0: 65 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63  eeOpArray() func
2ed0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  tion..**.** Befo
2ee0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
2ef0: 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68  nOp is set to th
2f00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
2f10: 69 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72  ies in the retur
2f20: 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c  ned.** array. Al
2f30: 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73  so, *pnMaxArg is
2f40: 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67   set to the larg
2f50: 65 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e  er of its curren
2f60: 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20  t value and .** 
2f70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
2f80: 74 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62  tries in the Vdb
2f90: 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20  e.apArg[] array 
2fa0: 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63  required to exec
2fb0: 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75  ute the .** retu
2fc0: 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  rned program..*/
2fd0: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
2fe0: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28  VdbeTakeOpArray(
2ff0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Vdbe *p, int *pn
3000: 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72  Op, int *pnMaxAr
3010: 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f  g){.  VdbeOp *aO
3020: 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73  p = p->aOp;.  as
3030: 73 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d  sert( aOp && !p-
3040: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
3050: 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  d );..  /* Check
3060: 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62   that sqlite3Vdb
3070: 65 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73  eUsesBtree() was
3080: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74   not called on t
3090: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65  his VM */.  asse
30a0: 72 74 28 20 70 2d 3e 61 4d 75 74 65 78 2e 6e 4d  rt( p->aMutex.nM
30b0: 75 74 65 78 3d 3d 30 20 29 3b 0a 0a 20 20 72 65  utex==0 );..  re
30c0: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
30d0: 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70   pnMaxArg);.  *p
30e0: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
30f0: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65  p->aOp = 0;.  re
3100: 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn aOp;.}../*.
3110: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
3120: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
3130: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
3140: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
3150: 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73  n the.** address
3160: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70   of the first op
3170: 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  eration added..*
3180: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
3190: 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20  eAddOpList(Vdbe 
31a0: 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62  *p, int nOp, Vdb
31b0: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61  eOpList const *a
31c0: 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b  Op){.  int addr;
31d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
31e0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
31f0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
3200: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e  >nOp + nOp > p->
3210: 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77  nOpAlloc && grow
3220: 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20  OpArray(p) ){.  
3230: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3240: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b    addr = p->nOp;
3250: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f  .  if( ALWAYS(nO
3260: 70 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  p>0) ){.    int 
3270: 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73  i;.    VdbeOpLis
3280: 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61  t const *pIn = a
3290: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  Op;.    for(i=0;
32a0: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e   i<nOp; i++, pIn
32b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
32c0: 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20  2 = pIn->p2;.   
32d0: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20     VdbeOp *pOut 
32e0: 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  = &p->aOp[i+addr
32f0: 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f  ];.      pOut->o
3300: 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63  pcode = pIn->opc
3310: 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ode;.      pOut-
3320: 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20  >p1 = pIn->p1;. 
3330: 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 26 26       if( p2<0 &&
3340: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f   sqlite3VdbeOpco
3350: 64 65 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f  deHasProperty(pO
3360: 75 74 2d 3e 6f 70 63 6f 64 65 2c 20 4f 50 46 4c  ut->opcode, OPFL
3370: 47 5f 4a 55 4d 50 29 20 29 7b 0a 20 20 20 20 20  G_JUMP) ){.     
3380: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64     pOut->p2 = ad
3390: 64 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20  dr + ADDR(p2);. 
33a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33b0: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70      pOut->p2 = p
33c0: 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  2;.      }.     
33d0: 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d   pOut->p3 = pIn-
33e0: 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  >p3;.      pOut-
33f0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
3400: 55 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74  USED;.      pOut
3410: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20  ->p4.p = 0;.    
3420: 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a    pOut->p5 = 0;.
3430: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
3440: 42 55 47 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  BUG.      pOut->
3450: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  zComment = 0;.  
3460: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
3470: 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
3480: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3490: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
34a0: 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69  +addr, &p->aOp[i
34b0: 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d  +addr]);.      }
34c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
34d0: 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b    p->nOp += nOp;
34e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64  .  }.  return ad
34f0: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  dr;.}../*.** Cha
3500: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
3510: 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20   the P1 operand 
3520: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
3530: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
3540: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
3550: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
3560: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
3570: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
3580: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
3590: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
35a0: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
35b0: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
35c0: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
35d0: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
35e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
35f0: 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64  3VdbeChangeP1(Vd
3600: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
3610: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73   int val){.  ass
3620: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
3630: 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29  ssert( addr>=0 )
3640: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61  ;.  if( p->nOp>a
3650: 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  ddr ){.    p->aO
3660: 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c  p[addr].p1 = val
3670: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
3680: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
3690: 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e  of the P2 operan
36a0: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
36b0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
36c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
36d0: 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74   useful for sett
36e0: 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69  ing a jump desti
36f0: 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nation..*/.void 
3700: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3710: 65 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP2(Vdbe *p, int
3720: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
3730: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
3740: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  );.  assert( add
3750: 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  r>=0 );.  if( p-
3760: 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20 20 20  >nOp>addr ){.   
3770: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32   p->aOp[addr].p2
3780: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
3790: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
37a0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20  value of the P3 
37b0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
37c0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
37d0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
37e0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
37f0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
3800: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
3810: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
3820: 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30   assert( addr>=0
3830: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
3840: 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e  >addr ){.    p->
3850: 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76  aOp[addr].p3 = v
3860: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
3870: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
3880: 65 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72  e of the P5 oper
3890: 61 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  and for the most
38a0: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64   recently.** add
38b0: 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  ed operation..*/
38c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
38d0: 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a  eChangeP5(Vdbe *
38e0: 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73  p, u8 val){.  as
38f0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
3900: 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20  if( p->aOp ){.  
3910: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
3920: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70  >0 );.    p->aOp
3930: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20  [p->nOp-1].p5 = 
3940: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
3950: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20  * Change the P2 
3960: 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72  operand of instr
3970: 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74  uction addr so t
3980: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
3990: 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20  .** the address 
39a0: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
39b0: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f  ruction to be co
39c0: 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ded..*/.void sql
39d0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
39e0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
39f0: 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr){.  sqlite3Vd
3a00: 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64  beChangeP2(p, ad
3a10: 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a  dr, p->nOp);.}..
3a20: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
3a30: 70 75 74 20 46 75 6e 63 44 65 66 20 73 74 72 75  put FuncDef stru
3a40: 63 74 75 72 65 20 69 73 20 65 70 68 65 6d 65 72  cture is ephemer
3a50: 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74  al, then free it
3a60: 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e  .  If.** the Fun
3a70: 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65  cDef is not ephe
3a80: 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  rmal, then do no
3a90: 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  thing..*/.static
3aa0: 20 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65   void freeEpheme
3ab0: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69  ralFunction(sqli
3ac0: 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66  te3 *db, FuncDef
3ad0: 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20 41   *pDef){.  if( A
3ae0: 4c 57 41 59 53 28 70 44 65 66 29 20 26 26 20 28  LWAYS(pDef) && (
3af0: 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51  pDef->flags & SQ
3b00: 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29  LITE_FUNC_EPHEM)
3b10: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
3b20: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65  e3DbFree(db, pDe
3b30: 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  f);.  }.}../*.**
3b40: 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c   Delete a P4 val
3b50: 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ue if necessary.
3b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3b70: 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a  freeP4(sqlite3 *
3b80: 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20  db, int p4type, 
3b90: 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66 28  void *p4){.  if(
3ba0: 20 70 34 20 29 7b 0a 20 20 20 20 73 77 69 74 63   p4 ){.    switc
3bb0: 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20  h( p4type ){.   
3bc0: 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a     case P4_REAL:
3bd0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49  .      case P4_I
3be0: 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65  NT64:.      case
3bf0: 20 50 34 5f 4d 50 52 49 4e 54 46 3a 0a 20 20 20   P4_MPRINTF:.   
3c00: 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d     case P4_DYNAM
3c10: 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  IC:.      case P
3c20: 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20  4_KEYINFO:.     
3c30: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
3c40: 59 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  Y:.      case P4
3c50: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
3c60: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
3c70: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34  te3DbFree(db, p4
3c80: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
3c90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3ca0: 63 61 73 65 20 50 34 5f 56 44 42 45 46 55 4e 43  case P4_VDBEFUNC
3cb0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
3cc0: 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20  Func *pVdbeFunc 
3cd0: 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29 70 34  = (VdbeFunc *)p4
3ce0: 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70  ;.        freeEp
3cf0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
3d00: 64 62 2c 20 70 56 64 62 65 46 75 6e 63 2d 3e 70  db, pVdbeFunc->p
3d10: 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 73  Func);.        s
3d20: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
3d30: 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75 6e  AuxData(pVdbeFun
3d40: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  c, 0);.        s
3d50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3d60: 20 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20   pVdbeFunc);.   
3d70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3d80: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
3d90: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
3da0: 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72       freeEphemer
3db0: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28  alFunction(db, (
3dc0: 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20  FuncDef*)p4);.  
3dd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3de0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
3df0: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
3e00: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
3e10: 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  ee((sqlite3_valu
3e20: 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20  e*)p4);.        
3e30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
3e40: 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41       case P4_VTA
3e50: 42 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  B : {.        sq
3e60: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28  lite3VtabUnlock(
3e70: 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20  (VTable *)p4);. 
3e80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3e90: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3ea0: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 3a   P4_SUBPROGRAM :
3eb0: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
3ec0: 65 33 56 64 62 65 50 72 6f 67 72 61 6d 44 65 6c  e3VdbeProgramDel
3ed0: 65 74 65 28 64 62 2c 20 28 53 75 62 50 72 6f 67  ete(db, (SubProg
3ee0: 72 61 6d 20 2a 29 70 34 2c 20 31 29 3b 0a 20 20  ram *)p4, 1);.  
3ef0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3f00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
3f10: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
3f20: 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
3f30: 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79   for aOp and any
3f40: 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63   p4 values alloc
3f50: 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ated for the.** 
3f60: 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65  opcodes containe
3f70: 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70  d within. If aOp
3f80: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20   is not NULL it 
3f90: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
3fa0: 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e  ntain .** nOp en
3fb0: 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69  tries. .*/.stati
3fc0: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
3fd0: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
3fe0: 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74  db, Op *aOp, int
3ff0: 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70   nOp){.  if( aOp
4000: 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b   ){.    Op *pOp;
4010: 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70  .    for(pOp=aOp
4020: 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b  ; pOp<&aOp[nOp];
4030: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66   pOp++){.      f
4040: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
4050: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
4060: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
4070: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c  _DEBUG.      sql
4080: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4090: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
40a0: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
40b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
40c0: 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d  Free(db, aOp);.}
40d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
40e0: 74 20 74 68 65 20 72 65 66 2d 63 6f 75 6e 74 20  t the ref-count 
40f0: 6f 6e 20 74 68 65 20 53 75 62 50 72 6f 67 72 61  on the SubProgra
4100: 6d 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  m structure pass
4110: 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 73 65 63  ed as the.** sec
4120: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 49 66  ond argument. If
4130: 20 74 68 65 20 72 65 66 2d 63 6f 75 6e 74 20 72   the ref-count r
4140: 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 66 72 65  eaches zero, fre
4150: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  e the structure.
4160: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 61 79  .**.** The array
4170: 20 6f 66 20 56 44 42 45 20 6f 70 63 6f 64 65 73   of VDBE opcodes
4180: 20 73 74 6f 72 65 64 20 61 73 20 53 75 62 50 72   stored as SubPr
4190: 6f 67 72 61 6d 2e 61 4f 70 20 69 73 20 66 72 65  ogram.aOp is fre
41a0: 65 64 20 69 66 0a 2a 2a 20 65 69 74 68 65 72 20  ed if.** either 
41b0: 74 68 65 20 72 65 66 2d 63 6f 75 6e 74 20 72 65  the ref-count re
41c0: 61 63 68 65 73 20 7a 65 72 6f 20 6f 72 20 70 61  aches zero or pa
41d0: 72 61 6d 65 74 65 72 20 66 72 65 65 6f 70 20 69  rameter freeop i
41e0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  s non-zero..**.*
41f0: 2a 20 53 69 6e 63 65 20 74 68 65 20 61 72 72 61  * Since the arra
4200: 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 70 6f 69  y of opcodes poi
4210: 6e 74 65 64 20 74 6f 20 62 79 20 53 75 62 50 72  nted to by SubPr
4220: 6f 67 72 61 6d 2e 61 4f 70 20 6d 61 79 20 64 69  ogram.aOp may di
4230: 72 65 63 74 6c 79 0a 2a 2a 20 6f 72 20 69 6e 64  rectly.** or ind
4240: 69 72 65 63 74 6c 79 20 63 6f 6e 74 61 69 6e 20  irectly contain 
4250: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
4260: 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20 73 74  he SubProgram st
4270: 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a  ructure itself..
4280: 2a 2a 20 42 79 20 70 61 73 73 69 6e 67 20 61 20  ** By passing a 
4290: 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 6f 70 20  non-zero freeop 
42a0: 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 20 63  parameter, the c
42b0: 61 6c 6c 65 72 20 6d 61 79 20 65 6e 73 75 72 65  aller may ensure
42c0: 20 74 68 61 74 20 61 6c 6c 0a 2a 2a 20 53 75 62   that all.** Sub
42d0: 50 72 6f 67 72 61 6d 20 73 74 72 75 63 74 75 72  Program structur
42e0: 65 73 20 61 6e 64 20 74 68 65 69 72 20 61 4f 70  es and their aOp
42f0: 20 61 72 72 61 79 73 20 61 72 65 20 66 72 65 65   arrays are free
4300: 64 2c 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  d, even when the
4310: 72 65 0a 2a 2a 20 61 72 65 20 73 75 63 68 20 63  re.** are such c
4320: 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63  ircular referenc
4330: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
4340: 74 65 33 56 64 62 65 50 72 6f 67 72 61 6d 44 65  te3VdbeProgramDe
4350: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
4360: 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 2c  , SubProgram *p,
4370: 20 69 6e 74 20 66 72 65 65 6f 70 29 7b 0a 20 20   int freeop){.  
4380: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
4390: 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29  ert( p->nRef>0 )
43a0: 3b 0a 20 20 20 20 69 66 28 20 66 72 65 65 6f 70  ;.    if( freeop
43b0: 20 7c 7c 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29   || p->nRef==1 )
43c0: 7b 0a 20 20 20 20 20 20 4f 70 20 2a 61 4f 70 20  {.      Op *aOp 
43d0: 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20  = p->aOp;.      
43e0: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 20 20  p->aOp = 0;.    
43f0: 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
4400: 79 28 64 62 2c 20 61 4f 70 2c 20 70 2d 3e 6e 4f  y(db, aOp, p->nO
4410: 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 70  p);.      p->nOp
4420: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
4430: 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  p->nRef--;.    i
4440: 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  f( p->nRef==0 ){
4450: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
4460: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  Free(db, p);.   
4470: 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
4480: 20 43 68 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65   Change N opcode
4490: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 61 64  s starting at ad
44a0: 64 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f  dr to No-ops..*/
44b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
44c0: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64  eChangeToNoop(Vd
44d0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
44e0: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70   int N){.  if( p
44f0: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62  ->aOp ){.    Vdb
4500: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
4510: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71  Op[addr];.    sq
4520: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
4530: 62 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d  b;.    while( N-
4540: 2d 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50  - ){.      freeP
4550: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
4560: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
4570: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c       memset(pOp,
4580: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30   0, sizeof(pOp[0
4590: 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ]));.      pOp->
45a0: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
45b0: 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20  ;.      pOp++;. 
45c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
45d0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
45e0: 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65  ue of the P4 ope
45f0: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
4600: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
4610: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4620: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
4630: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
4640: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
4650: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
4660: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
4670: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
4680: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
4690: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
46a0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
46b0: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
46c0: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34  n>=0 then the P4
46d0: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61   operand is dyna
46e0: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  mic, meaning tha
46f0: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  t a copy of.** t
4700: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64  he string is mad
4710: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
4720: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
4730: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
4740: 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30   A value of n==0
4750: 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65   means copy byte
4760: 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61  s of zP4 up to a
4770: 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  nd including the
4780: 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62  .** first null b
4790: 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65  yte.  If n>0 the
47a0: 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73  n copy n+1 bytes
47b0: 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49   of zP4..**.** I
47c0: 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  f n==P4_KEYINFO 
47d0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50  it means that zP
47e0: 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
47f0: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  o a KeyInfo stru
4800: 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79  cture..** A copy
4810: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
4820: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
4830: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
4840: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
4850: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74  qlite3_malloc, t
4860: 6f 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  o be freed when 
4870: 74 68 65 20 56 64 62 65 20 69 73 20 66 69 6e 61  the Vdbe is fina
4880: 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f  lized..** n==P4_
4890: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
48a0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 7a  indicates that z
48b0: 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b  P4 points to a K
48c0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
48d0: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65  .** stored in me
48e0: 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20 63 61  mory that the ca
48f0: 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65  ller has obtaine
4900: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
4910: 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63  alloc. The .** c
4920: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74  aller should not
4930: 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61   free the alloca
4940: 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
4950: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
4960: 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c  Vdbe is.** final
4970: 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68  ized..** .** Oth
4980: 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28  er values of n (
4990: 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f  P4_STATIC, P4_CO
49a0: 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69  LLSEQ etc.) indi
49b0: 63 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f  cate that zP4 po
49c0: 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72  ints.** to a str
49d0: 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65  ing or structure
49e0: 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74   that is guarant
49f0: 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72  eed to exist for
4a00: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
4a10: 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e  .** the Vdbe. In
4a20: 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20   these cases we 
4a30: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
4a40: 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  e pointer..**.**
4a50: 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20   If addr<0 then 
4a60: 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65  change P4 on the
4a70: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
4a80: 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74  nserted instruct
4a90: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4aa0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
4ab0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
4ac0: 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  dr, const char *
4ad0: 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f  zP4, int n){.  O
4ae0: 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65  p *pOp;.  sqlite
4af0: 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28  3 *db;.  assert(
4b00: 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20   p!=0 );.  db = 
4b10: 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
4b20: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
4b30: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
4b40: 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  if( p->aOp==0 ||
4b50: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
4b60: 64 20 29 7b 0a 20 20 20 20 69 66 20 28 20 6e 21  d ){.    if ( n!
4b70: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 26 26 20 6e  =P4_KEYINFO && n
4b80: 21 3d 50 34 5f 56 54 41 42 20 29 20 7b 0a 20 20  !=P4_VTAB ) {.  
4b90: 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 6e      freeP4(db, n
4ba0: 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a  , (void*)*(char*
4bb0: 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20  *)&zP4);.    }. 
4bc0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
4bd0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
4be0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
4bf0: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ddr<p->nOp );.  
4c00: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
4c10: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
4c20: 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d  - 1;.  }.  pOp =
4c30: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
4c40: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70    freeP4(db, pOp
4c50: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
4c60: 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  4.p);.  pOp->p4.
4c70: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d  p = 0;.  if( n==
4c80: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
4c90: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
4ca0: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
4cb0: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
4cc0: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
4cd0: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
4ce0: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
4cf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
4d00: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
4d10: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
4d20: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
4d30: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
4d40: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
4d50: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
4d60: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
4d70: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
4d80: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d   P4_NOTUSED;.  }
4d90: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b  else if( n==P4_K
4da0: 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65  EYINFO ){.    Ke
4db0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
4dc0: 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c  .    int nField,
4dd0: 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69   nByte;..    nFi
4de0: 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a  eld = ((KeyInfo*
4df0: 29 7a 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20  )zP4)->nField;. 
4e00: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
4e10: 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28  f(*pKeyInfo) + (
4e20: 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66  nField-1)*sizeof
4e30: 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  (pKeyInfo->aColl
4e40: 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20  [0]) + nField;. 
4e50: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
4e60: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 42 79  lite3Malloc( nBy
4e70: 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  te );.    pOp->p
4e80: 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  4.pKeyInfo = pKe
4e90: 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70  yInfo;.    if( p
4ea0: 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
4eb0: 20 75 38 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b   u8 *aSortOrder;
4ec0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b  .      memcpy(pK
4ed0: 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79  eyInfo, zP4, nBy
4ee0: 74 65 29 3b 0a 20 20 20 20 20 20 61 53 6f 72 74  te);.      aSort
4ef0: 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f  Order = pKeyInfo
4f00: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  ->aSortOrder;.  
4f10: 20 20 20 20 69 66 28 20 61 53 6f 72 74 4f 72 64      if( aSortOrd
4f20: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b  er ){.        pK
4f30: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
4f40: 65 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  er = (unsigned c
4f50: 68 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e  har*)&pKeyInfo->
4f60: 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20  aColl[nField];. 
4f70: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b         memcpy(pK
4f80: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
4f90: 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c 20  er, aSortOrder, 
4fa0: 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d  nField);.      }
4fb0: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
4fc0: 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b  pe = P4_KEYINFO;
4fd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4fe0: 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46    p->db->mallocF
4ff0: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
5000: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5010: 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d  4_NOTUSED;.    }
5020: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
5030: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
5040: 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  FF ){.    pOp->p
5050: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
5060: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5070: 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a  e = P4_KEYINFO;.
5080: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50    }else if( n==P
5090: 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70 4f  4_VTAB ){.    pO
50a0: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
50b0: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
50c0: 34 74 79 70 65 20 3d 20 50 34 5f 56 54 41 42 3b  4type = P4_VTAB;
50d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
50e0: 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a  Lock((VTable *)z
50f0: 50 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  P4);.    assert(
5100: 20 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29   ((VTable *)zP4)
5110: 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20  ->db==p->db );. 
5120: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29   }else if( n<0 )
5130: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
5140: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
5150: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5160: 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a  (signed char)n;.
5170: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
5180: 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69   n==0 ) n = sqli
5190: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29  te3Strlen30(zP4)
51a0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20  ;.    pOp->p4.z 
51b0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
51c0: 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e  up(p->db, zP4, n
51d0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
51e0: 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b  pe = P4_DYNAMIC;
51f0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
5200: 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61  NDEBUG./*.** Cha
5210: 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  nge the comment 
5220: 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f 73 74 20  on the the most 
5230: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
5240: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a  nstruction.  Or.
5250: 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f  ** insert a No-o
5260: 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f  p and add the co
5270: 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65  mment to that ne
5280: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  w instruction.  
5290: 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68  This.** makes th
52a0: 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f  e code easier to
52b0: 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62   read during deb
52c0: 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66  ugging.  None of
52d0: 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a   this happens.**
52e0: 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e   in a production
52f0: 20 62 75 69 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20   build..*/.void 
5300: 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65  sqlite3VdbeComme
5310: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
5320: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
5330: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
5340: 20 61 70 3b 0a 20 20 69 66 28 20 21 70 20 29 20   ap;.  if( !p ) 
5350: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
5360: 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d  ( p->nOp>0 || p-
5370: 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73  >aOp==0 );.  ass
5380: 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  ert( p->aOp==0 |
5390: 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  | p->aOp[p->nOp-
53a0: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c  1].zComment==0 |
53b0: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
53c0: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
53d0: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61  ->nOp ){.    cha
53e0: 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70  r **pz = &p->aOp
53f0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
5400: 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72  ent;.    va_star
5410: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
5420: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5430: 65 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20  e(p->db, *pz);. 
5440: 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33     *pz = sqlite3
5450: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
5460: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
5470: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
5480: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
5490: 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
54a0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
54b0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
54c0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
54d0: 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
54e0: 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  urn;.  sqlite3Vd
54f0: 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e  beAddOp0(p, OP_N
5500: 6f 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  oop);.  assert( 
5510: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
5520: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
5530: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
5540: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
5550: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
5560: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
5570: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
5580: 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20  nOp ){.    char 
5590: 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70  **pz = &p->aOp[p
55a0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
55b0: 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  t;.    va_start(
55c0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
55d0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
55e0: 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20  p->db, *pz);.   
55f0: 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d   *pz = sqlite3VM
5600: 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46  Printf(p->db, zF
5610: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
5620: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a  va_end(ap);.  }.
5630: 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45  }.#endif  /* NDE
5640: 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  BUG */../*.** Re
5650: 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20  turn the opcode 
5660: 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72  for a given addr
5670: 65 73 73 2e 20 20 49 66 20 74 68 65 20 61 64 64  ess.  If the add
5680: 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e  ress is -1, then
5690: 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d  .** return the m
56a0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
56b0: 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  erted opcode..**
56c0: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
56d0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
56e0: 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 70 72   has occurred pr
56f0: 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69  ior to the calli
5700: 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f  ng of this.** ro
5710: 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f  utine, then a po
5720: 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79  inter to a dummy
5730: 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20   VdbeOp will be 
5740: 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20  returned.  That 
5750: 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61  opcode.** is rea
5760: 64 61 62 6c 65 20 61 6e 64 20 77 72 69 74 61 62  dable and writab
5770: 6c 65 2c 20 62 75 74 20 69 74 20 68 61 73 20 6e  le, but it has n
5780: 6f 20 65 66 66 65 63 74 2e 20 20 54 68 65 20 72  o effect.  The r
5790: 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79  eturn of a dummy
57a0: 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77  .** opcode allow
57b0: 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f  s the call to co
57c0: 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69  ntinue functioni
57d0: 6e 67 20 61 66 74 65 72 20 61 20 4f 4f 4d 20 66  ng after a OOM f
57e0: 61 75 6c 74 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ault without.** 
57f0: 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20  having to check 
5800: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65  to see if the re
5810: 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 72  turn from this r
5820: 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69  outine is a vali
5830: 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
5840: 20 41 62 6f 75 74 20 74 68 65 20 23 69 66 64 65   About the #ifde
5850: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
5860: 41 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ACE:  Normally, 
5870: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5880: 6e 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20  never called.** 
5890: 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e  unless p->nOp>0.
58a0: 20 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73    This is becaus
58b0: 65 20 69 6e 20 74 68 65 20 61 62 73 65 6e 73 65  e in the absense
58c0: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   of SQLITE_OMIT_
58d0: 54 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f  TRACE,.** an OP_
58e0: 54 72 61 63 65 20 69 6e 73 74 72 75 63 74 69 6f  Trace instructio
58f0: 6e 20 69 73 20 61 6c 77 61 79 73 20 69 6e 73 65  n is always inse
5900: 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 56  rted by sqlite3V
5910: 64 62 65 47 65 74 28 29 20 61 73 20 73 6f 6f 6e  dbeGet() as soon
5920: 20 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42   as.** a new VDB
5930: 45 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 53  E is created.  S
5940: 6f 20 77 65 20 61 72 65 20 66 72 65 65 20 74 6f  o we are free to
5950: 20 73 65 74 20 61 64 64 72 20 74 6f 20 70 2d 3e   set addr to p->
5960: 6e 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a  nOp-1 without.**
5970: 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c   having to doubl
5980: 65 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  e-check to make 
5990: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
59a0: 73 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61  sult is non-nega
59b0: 74 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20  tive. But.** if 
59c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
59d0: 45 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  E is defined, th
59e0: 65 20 4f 50 5f 54 72 61 63 65 20 69 73 20 6f 6d  e OP_Trace is om
59f0: 69 74 74 65 64 20 61 6e 64 20 77 65 20 64 6f 20  itted and we do 
5a00: 6e 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b  need to.** check
5a10: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 2d   the value of p-
5a20: 3e 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20 63 6f  >nOp-1 before co
5a30: 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62  ntinuing..*/.Vdb
5a40: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
5a50: 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  GetOp(Vdbe *p, i
5a60: 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 74 61 74  nt addr){.  stat
5a70: 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b  ic VdbeOp dummy;
5a80: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
5a90: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
5aa0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64  INIT );.  if( ad
5ab0: 64 72 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 53  dr<0 ){.#ifdef S
5ac0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5ad0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3d  .    if( p->nOp=
5ae0: 3d 30 20 29 20 72 65 74 75 72 6e 20 26 64 75 6d  =0 ) return &dum
5af0: 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61  my;.#endif.    a
5b00: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  ddr = p->nOp - 1
5b10: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5b20: 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72  (addr>=0 && addr
5b30: 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64  <p->nOp) || p->d
5b40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5b50: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
5b60: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
5b70: 20 20 20 20 72 65 74 75 72 6e 20 26 64 75 6d 6d      return &dumm
5b80: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
5b90: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
5ba0: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
5bb0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5bc0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c  _OMIT_EXPLAIN) |
5bd0: 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  | !defined(NDEBU
5be0: 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66  G) \.     || def
5bf0: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
5c00: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
5c10: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
5c20: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
5c30: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
5c40: 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74  s the P4 paramet
5c50: 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65  er for an opcode
5c60: 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66  ..** Use zTemp f
5c70: 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  or any required 
5c80: 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
5c90: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
5ca0: 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50  c char *displayP
5cb0: 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20  4(Op *pOp, char 
5cc0: 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d  *zTemp, int nTem
5cd0: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20  p){.  char *zP4 
5ce0: 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72  = zTemp;.  asser
5cf0: 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a  t( nTemp>=20 );.
5d00: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
5d10: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  4type ){.    cas
5d20: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41  e P4_KEYINFO_STA
5d30: 54 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34  TIC:.    case P4
5d40: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
5d50: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
5d60: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
5d70: 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
5d80: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71  eyInfo;.      sq
5d90: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
5da0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65  Temp, zTemp, "ke
5db0: 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79 49  yinfo(%d", pKeyI
5dc0: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20  nfo->nField);.  
5dd0: 20 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53      i = sqlite3S
5de0: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a  trlen30(zTemp);.
5df0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
5e00: 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  <pKeyInfo->nFiel
5e10: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
5e20: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
5e30: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  = pKeyInfo->aCol
5e40: 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
5e50: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
5e60: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
5e70: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f  ite3Strlen30(pCo
5e80: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
5e90: 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54        if( i+n>nT
5ea0: 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20  emp-6 ){.       
5eb0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65       memcpy(&zTe
5ec0: 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b  mp[i],",...",4);
5ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
5ee0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
5ef0: 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b            zTemp[
5f00: 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  i++] = ',';.    
5f10: 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
5f20: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26  fo->aSortOrder &
5f30: 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  & pKeyInfo->aSor
5f40: 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20  tOrder[j] ){.   
5f50: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
5f60: 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20  ++] = '-';.     
5f70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5f80: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
5f90: 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  ], pColl->zName,
5fa0: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n+1);.          
5fb0: 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  i += n;.        
5fc0: 7d 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54  }else if( i+4<nT
5fd0: 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20  emp-6 ){.       
5fe0: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70     memcpy(&zTemp
5ff0: 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20  [i],",nil",4);. 
6000: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b           i += 4;
6010: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6020: 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69   }.      zTemp[i
6030: 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20  ++] = ')';.     
6040: 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20   zTemp[i] = 0;. 
6050: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e       assert( i<n
6060: 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72  Temp );.      br
6070: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6080: 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20  ase P4_COLLSEQ: 
6090: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
60a0: 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34  *pColl = pOp->p4
60b0: 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71  .pColl;.      sq
60c0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
60d0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f  Temp, zTemp, "co
60e0: 6c 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20 70  llseq(%.20s)", p
60f0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
6100: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6110: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e  .    case P4_FUN
6120: 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75  CDEF: {.      Fu
6130: 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f  ncDef *pDef = pO
6140: 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20  p->p4.pFunc;.   
6150: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6160: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6170: 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66  , "%s(%d)", pDef
6180: 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e  ->zName, pDef->n
6190: 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Arg);.      brea
61a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
61b0: 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20  e P4_INT64: {.  
61c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
61d0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
61e0: 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d  p, "%lld", *pOp-
61f0: 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20  >p4.pI64);.     
6200: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6210: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a    case P4_INT32:
6220: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6230: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6240: 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f   zTemp, "%d", pO
6250: 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20  p->p4.i);.      
6260: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6270: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b   case P4_REAL: {
6280: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6290: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
62a0: 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a  Temp, "%.16g", *
62b0: 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a  pOp->p4.pReal);.
62c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
62d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d   }.    case P4_M
62e0: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20  EM: {.      Mem 
62f0: 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pMem = pOp->p4.
6300: 70 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  pMem;.      asse
6310: 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73  rt( (pMem->flags
6320: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20   & MEM_Null)==0 
6330: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  );.      if( pMe
6340: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  m->flags & MEM_S
6350: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  tr ){.        zP
6360: 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  4 = pMem->z;.   
6370: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
6380: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  m->flags & MEM_I
6390: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
63a0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
63b0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c  Temp, zTemp, "%l
63c0: 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b  ld", pMem->u.i);
63d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
63e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
63f0: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
6400: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6410: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6420: 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d  , "%.16g", pMem-
6430: 3e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >r);.      }else
6440: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
6450: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
6460: 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
6470: 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62      zP4 = "(blob
6480: 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )";.      }.    
6490: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
64a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
64b0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
64c0: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
64d0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
64e0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
64f0: 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70  pOp->p4.pVtab->p
6500: 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69  Vtab;.      sqli
6510: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6520: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62  mp, zTemp, "vtab
6530: 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62 2c 20  :%p:%p", pVtab, 
6540: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b  pVtab->pModule);
6550: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6560: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
6570: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
6580: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6590: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
65a0: 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72 72 61   zTemp, "intarra
65b0: 79 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  y");.      break
65c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
65d0: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20   P4_SUBPROGRAM: 
65e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
65f0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6600: 7a 54 65 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22  zTemp, "program"
6610: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6620: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
6630: 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d  t: {.      zP4 =
6640: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
6650: 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a    if( zP4==0 ){.
6660: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54          zP4 = zT
6670: 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  emp;.        zTe
6680: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
6690: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
66a0: 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b  ssert( zP4!=0 );
66b0: 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d  .  return zP4;.}
66c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
66d0: 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64  eclare to the Vd
66e0: 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65  be that the BTre
66f0: 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e  e object at db->
6700: 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a  aDb[i] is used..
6710: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
6720: 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62  dbeUsesBtree(Vdb
6730: 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20  e *p, int i){.  
6740: 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65  int mask;.  asse
6750: 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
6760: 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 73 69  >db->nDb && i<si
6770: 7a 65 6f 66 28 75 33 32 29 2a 38 20 29 3b 0a 20  zeof(u32)*8 );. 
6780: 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29   assert( i<(int)
6790: 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d  sizeof(p->btreeM
67a0: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 6d 61 73 6b  ask)*8 );.  mask
67b0: 20 3d 20 28 28 75 33 32 29 31 29 3c 3c 69 3b 0a   = ((u32)1)<<i;.
67c0: 20 20 69 66 28 20 28 70 2d 3e 62 74 72 65 65 4d    if( (p->btreeM
67d0: 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
67e0: 7b 0a 20 20 20 20 70 2d 3e 62 74 72 65 65 4d 61  {.    p->btreeMa
67f0: 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
6800: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
6810: 78 41 72 72 61 79 49 6e 73 65 72 74 28 26 70 2d  xArrayInsert(&p-
6820: 3e 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d 3e  >aMutex, p->db->
6830: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 7d  aDb[i].pBt);.  }
6840: 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .}...#if defined
6850: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
6860: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
6870: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72  _DEBUG)./*.** Pr
6880: 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  int a single opc
6890: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
68a0: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64  ne is used for d
68b0: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
68c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
68d0: 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a  bePrintOp(FILE *
68e0: 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70  pOut, int pc, Op
68f0: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
6900: 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP4;.  char zPtr
6910: 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63  [50];.  static c
6920: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
6930: 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73  at1 = "%4d %-13s
6940: 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 34   %4d %4d %4d %-4
6950: 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20  s %.2X %s\n";.  
6960: 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f  if( pOut==0 ) pO
6970: 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a  ut = stdout;.  z
6980: 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70  P4 = displayP4(p
6990: 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66  Op, zPtr, sizeof
69a0: 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e  (zPtr));.  fprin
69b0: 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74  tf(pOut, zFormat
69c0: 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71  1, pc, .      sq
69d0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
69e0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f  pOp->opcode), pO
69f0: 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  p->p1, pOp->p2, 
6a00: 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f  pOp->p3, zP4, pO
6a10: 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20 53 51  p->p5,.#ifdef SQ
6a20: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
6a30: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f   pOp->zComment ?
6a40: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a   pOp->zComment :
6a50: 20 22 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   "".#else.      
6a60: 22 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20  "".#endif.  );. 
6a70: 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d   fflush(pOut);.}
6a80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
6a90: 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20  elease an array 
6aa0: 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74  of N Mem element
6ab0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
6ac0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
6ad0: 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  (Mem *p, int N){
6ae0: 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b  .  if( p && N ){
6af0: 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a  .    Mem *pEnd;.
6b00: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
6b10: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20  = p->db;.    u8 
6b20: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20  malloc_failed = 
6b30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6b40: 3b 0a 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26  ;.    for(pEnd=&
6b50: 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b  p[N]; p<pEnd; p+
6b60: 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
6b70: 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20  ( (&p[1])==pEnd 
6b80: 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d  || p[0].db==p[1]
6b90: 2e 64 62 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  .db );..      /*
6ba0: 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72   This block is r
6bb0: 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64  eally an inlined
6bc0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
6bd0: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
6be0: 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  e().      ** tha
6bf0: 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67  t takes advantag
6c00: 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68  e of the fact th
6c10: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  at the memory ce
6c20: 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20  ll value is .   
6c30: 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20     ** being set 
6c40: 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65  to NULL after re
6c50: 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61  leasing any dyna
6c60: 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20  mic resources.. 
6c70: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
6c80: 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 69   The justificati
6c90: 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69  on for duplicati
6ca0: 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 20  ng code is that 
6cb0: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20  according to .  
6cc0: 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64      ** callgrind
6cd0: 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61 20  , this causes a 
6ce0: 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 73  certain test cas
6cf0: 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 55  e to hit the CPU
6d00: 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70   4.7 .      ** p
6d10: 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36  ercent less (x86
6d20: 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73   linux, gcc vers
6d30: 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20  ion 4.1.2, -O6) 
6d40: 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a  than if .      *
6d50: 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65  * sqlite3MemRele
6d60: 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65  ase() were calle
6d70: 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74  d from here. Wit
6d80: 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70  h -O2, this jump
6d90: 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e  s.      ** to 6.
6da0: 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74  6 percent. The t
6db0: 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 65  est case is inse
6dc0: 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20  rting 1000 rows 
6dd0: 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20  into a table .  
6de0: 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69      ** with no i
6df0: 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 73  ndexes using a s
6e00: 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 49  ingle prepared I
6e10: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c  NSERT statement,
6e20: 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a   bind() .      *
6e30: 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49  * and reset(). I
6e40: 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 70  nserts are group
6e50: 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61  ed into a transa
6e60: 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
6e70: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61        if( p->fla
6e80: 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f  gs&(MEM_Agg|MEM_
6e90: 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45  Dyn|MEM_Frame|ME
6ea0: 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20  M_RowSet) ){.   
6eb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6ec0: 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20  MemRelease(p);. 
6ed0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
6ee0: 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20  ->zMalloc ){.   
6ef0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
6f00: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
6f10: 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a  c);.        p->z
6f20: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
6f30: 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c    }..      p->fl
6f40: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
6f50: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61      }.    db->ma
6f60: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c  llocFailed = mal
6f70: 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a  loc_failed;.  }.
6f80: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
6f90: 61 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65  a VdbeFrame obje
6fa0: 63 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65  ct and its conte
6fb0: 6e 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f  nts. VdbeFrame o
6fc0: 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c  bjects are.** al
6fd0: 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f  located by the O
6fe0: 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65  P_Program opcode
6ff0: 20 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45   in sqlite3VdbeE
7000: 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  xec()..*/.void s
7010: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44  qlite3VdbeFrameD
7020: 65 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20  elete(VdbeFrame 
7030: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
7040: 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65  Mem *aMem = Vdbe
7050: 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56  FrameMem(p);.  V
7060: 64 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73  dbeCursor **apCs
7070: 72 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20  r = (VdbeCursor 
7080: 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69  **)&aMem[p->nChi
7090: 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d  ldMem];.  for(i=
70a0: 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73  0; i<p->nChildCs
70b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  r; i++){.    sql
70c0: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
70d0: 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69  or(p->v, apCsr[i
70e0: 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  ]);.  }.  releas
70f0: 65 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20  eMemArray(aMem, 
7100: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20  p->nChildMem);. 
7110: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
7120: 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a  ->v->db, p);.}..
7130: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7140: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
7150: 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69  AGEMENT.int sqli
7160: 74 65 33 56 64 62 65 52 65 6c 65 61 73 65 42 75  te3VdbeReleaseBu
7170: 66 66 65 72 73 28 56 64 62 65 20 2a 70 29 7b 0a  ffers(Vdbe *p){.
7180: 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
7190: 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 61 73 73  nFree = 0;.  ass
71a0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
71b0: 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
71c0: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69  utex) );.  for(i
71d0: 69 3d 31 3b 20 69 69 3c 3d 70 2d 3e 6e 4d 65 6d  i=1; ii<=p->nMem
71e0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  ; ii++){.    Mem
71f0: 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65   *pMem = &p->aMe
7200: 6d 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  m[ii];.    if( p
7210: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
7220: 5f 52 6f 77 53 65 74 20 29 7b 0a 20 20 20 20 20  _RowSet ){.     
7230: 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74 43 6c   sqlite3RowSetCl
7240: 65 61 72 28 70 4d 65 6d 2d 3e 75 2e 70 52 6f 77  ear(pMem->u.pRow
7250: 53 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Set);.    }.    
7260: 69 66 28 20 70 4d 65 6d 2d 3e 7a 20 26 26 20 70  if( pMem->z && p
7270: 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44  Mem->flags&MEM_D
7280: 79 6e 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  yn ){.      asse
7290: 72 74 28 20 21 70 4d 65 6d 2d 3e 78 44 65 6c 20  rt( !pMem->xDel 
72a0: 29 3b 0a 20 20 20 20 20 20 6e 46 72 65 65 20 2b  );.      nFree +
72b0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
72c0: 63 53 69 7a 65 28 70 4d 65 6d 2d 3e 64 62 2c 20  cSize(pMem->db, 
72d0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
72e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
72f0: 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20  lease(pMem);.   
7300: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7310: 6e 46 72 65 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  nFree;.}.#endif.
7320: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7330: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
7340: 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e  ** Give a listin
7350: 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  g of the program
7360: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
7370: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  machine..**.** T
7380: 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  he interface is 
7390: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
73a0: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
73b0: 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  But instead of.*
73c0: 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f  * running the co
73d0: 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74  de, it invokes t
73e0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65  he callback once
73f0: 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75   for each instru
7400: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66  ction..** This f
7410: 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74  eature is used t
7420: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50  o implement "EXP
7430: 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LAIN"..**.** Whe
7440: 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c  n p->explain==1,
7450: 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f   each instructio
7460: 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68  n is listed.  Wh
7470: 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e  en.** p->explain
7480: 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70  ==2, only OP_Exp
7490: 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  lain instruction
74a0: 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64  s are listed and
74b0: 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68   these.** are sh
74c0: 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65  own in a differe
74d0: 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65  nt format.  p->e
74e0: 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65  xplain==2 is use
74f0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
7500: 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  * EXPLAIN QUERY 
7510: 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  PLAN..*/.int sql
7520: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
7530: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
7540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
7550: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e   VDBE */.){.  in
7560: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7580: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
7590: 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 72 65  er of rows to re
75a0: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  turn */.  int nS
75b0: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
75d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d  * Number of sub-
75e0: 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61  vdbes seen so fa
75f0: 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  r */.  SubProgra
7600: 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20  m **apSub = 0;  
7610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7620: 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65  rray of sub-vdbe
7630: 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62  s */.  Mem *pSub
7640: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
7650: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
7660: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
7670: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
7680: 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65  m *pMem = p->pRe
7690: 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d  sultSet = &p->aM
76a0: 65 6d 5b 31 5d 3b 0a 0a 20 20 61 73 73 65 72 74  em[1];..  assert
76b0: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a  ( p->explain );.
76c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
76d0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
76e0: 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  UN );.  assert( 
76f0: 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54  db->magic==SQLIT
7700: 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 3b 0a  E_MAGIC_BUSY );.
7710: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
7720: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
7730: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
7740: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
7750: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a  E_NOMEM );..  /*
7760: 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69   Even though thi
7770: 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f  s opcode does no
7780: 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74  t use dynamic st
7790: 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74  rings for.  ** t
77a0: 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c  he result, resul
77b0: 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65  t columns may be
77c0: 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20  come dynamic if 
77d0: 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20  the user calls. 
77e0: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
77f0: 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75  mn_text16(), cau
7800: 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69  sing a translati
7810: 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63  on to UTF-16 enc
7820: 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65  oding..  */.  re
7830: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d  leaseMemArray(pM
7840: 65 6d 2c 20 38 29 3b 0a 0a 20 20 69 66 28 20 70  em, 8);..  if( p
7850: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
7860: 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  EM ){.    /* Thi
7870: 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d  s happens if a m
7880: 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61  alloc() inside a
7890: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
78a0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f  _column_text() o
78b0: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
78c0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
78d0: 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20   failed.  */.   
78e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
78f0: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
7900: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
7910: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
7920: 20 6f 75 74 20 74 6f 74 61 6c 20 6e 75 6d 62 65   out total numbe
7930: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
7940: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
7950: 62 79 20 74 68 69 73 20 0a 20 20 2a 2a 20 45 58  by this .  ** EX
7960: 50 4c 41 49 4e 20 70 72 6f 67 72 61 6d 2e 20 20  PLAIN program.  
7970: 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e  */.  nRow = p->n
7980: 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70  Op;.  if( p->exp
7990: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 70  lain==1 ){.    p
79a0: 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39  Sub = &p->aMem[9
79b0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ];.    if( pSub-
79c0: 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20  >flags&MEM_Blob 
79d0: 29 7b 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20  ){.      nSub = 
79e0: 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56  pSub->n/sizeof(V
79f0: 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53  dbe*);.      apS
7a00: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
7a10: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
7a20: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
7a30: 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSub; i++){.  
7a40: 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75      nRow += apSu
7a50: 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d  b[i]->nOp;.    }
7a60: 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  .  }..  do{.    
7a70: 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d  i = p->pc++;.  }
7a80: 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26  while( i<nRow &&
7a90: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26   p->explain==2 &
7aa0: 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  & p->aOp[i].opco
7ab0: 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de!=OP_Explain )
7ac0: 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20  ;.  if( i>=nRow 
7ad0: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
7ae0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
7af0: 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
7b00: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
7b10: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
7b20: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
7b30: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
7b40: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
7b50: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
7b60: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
7b70: 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
7b80: 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
7b90: 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65  tr(p->rc));.  }e
7ba0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
7bb0: 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  ;.    Op *pOp;. 
7bc0: 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20     if( i<p->nOp 
7bd0: 29 7b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26  ){.      pOp = &
7be0: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  p->aOp[i];.    }
7bf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
7c00: 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d  j;.      i -= p-
7c10: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  >nOp;.      for(
7c20: 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d  j=0; i>=apSub[j]
7c30: 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nOp; j++){.   
7c40: 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b       i -= apSub[
7c50: 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d  j]->nOp;.      }
7c60: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70  .      pOp = &ap
7c70: 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a  Sub[j]->aOp[i];.
7c80: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
7c90: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
7ca0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
7cb0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
7cc0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
7cd0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
7ce0: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
7cf0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f     /* Program co
7d20: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  unter */.      p
7d30: 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20  Mem++;.  .      
7d40: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
7d50: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72  M_Static|MEM_Str
7d60: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
7d70: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
7d80: 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  *)sqlite3OpcodeN
7d90: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
7da0: 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a  ;  /* Opcode */.
7db0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
7dc0: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
7dd0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
7de0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
7df0: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
7e00: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
7e10: 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d  TEXT;.      pMem
7e20: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
7e30: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
7e40: 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 4f  +;..      if( pO
7e50: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55  p->p4type==P4_SU
7e60: 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20  BPROGRAM ){.    
7e70: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
7e80: 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28  (nSub+1)*sizeof(
7e90: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
7ea0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
7eb0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
7ec0: 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nSub; j++){.    
7ed0: 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b        if( apSub[
7ee0: 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  j]==pOp->p4.pPro
7ef0: 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  gram ) break;.  
7f00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7f10: 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53  if( j==nSub && S
7f20: 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65  QLITE_OK==sqlite
7f30: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75  3VdbeMemGrow(pSu
7f40: 62 2c 20 6e 42 79 74 65 2c 20 31 29 20 29 7b 0a  b, nByte, 1) ){.
7f50: 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62 20            apSub 
7f60: 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  = (SubProgram **
7f70: 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20  )pSub->z;.      
7f80: 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b      apSub[nSub++
7f90: 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  ] = pOp->p4.pPro
7fa0: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  gram;.          
7fb0: 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pSub->flags |= M
7fc0: 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20  EM_Blob;.       
7fd0: 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75     pSub->n = nSu
7fe0: 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  b*sizeof(SubProg
7ff0: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d  ram*);.        }
8000: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
8010: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
8020: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
8030: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
8040: 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8060: 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P1 */.    pMem->
8070: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
8080: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
8090: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
80a0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
80b0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
80c0: 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20  Op->p2;         
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80e0: 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d   /* P2 */.    pM
80f0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
8100: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  E_INTEGER;.    p
8110: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
8120: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
8130: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
8140: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
8150: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
8160: 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20  pOp->p3;        
8170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8180: 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20    /* P3 */.     
8190: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
81a0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
81b0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20      pMem++;.    
81c0: 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  }..    if( sqlit
81d0: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d  e3VdbeMemGrow(pM
81e0: 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20  em, 32, 0) ){   
81f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a           /* P4 *
8200: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
8210: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
8220: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
8230: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
8240: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
8250: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79  ->flags = MEM_Dy
8260: 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  n|MEM_Str|MEM_Te
8270: 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73 70  rm;.    z = disp
8280: 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d  layP4(pOp, pMem-
8290: 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28  >z, 32);.    if(
82a0: 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20   z!=pMem->z ){. 
82b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
82c0: 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20  MemSetStr(pMem, 
82d0: 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  z, -1, SQLITE_UT
82e0: 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  F8, 0);.    }els
82f0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
8300: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20   pMem->z!=0 );. 
8310: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
8320: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
8330: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70  Mem->z);.      p
8340: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
8350: 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20  E_UTF8;.    }.  
8360: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
8370: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
8380: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
8390: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
83a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
83b0: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
83c0: 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20  Mem, 4, 0) ){.  
83d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
83e0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
83f0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
8400: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
8410: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8420: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
8430: 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45  M_Dyn|MEM_Str|ME
8440: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
8450: 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20  em->n = 2;.     
8460: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8470: 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25  f(3, pMem->z, "%
8480: 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20  .2x", pOp->p5); 
8490: 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20    /* P5 */.     
84a0: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
84b0: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20  LITE_TEXT;.     
84c0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
84d0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
84e0: 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65  pMem++;.  .#ifde
84f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
8500: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43       if( pOp->zC
8510: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
8520: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
8530: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
8540: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
8550: 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  z = pOp->zCommen
8560: 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  t;.        pMem-
8570: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
8580: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
8590: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63         pMem->enc
85a0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
85b0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79          pMem->ty
85c0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
85d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
85e0: 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
85f0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
8600: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20   = MEM_Null;    
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8620: 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f     /* Comment */
8630: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  .        pMem->t
8640: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ype = SQLITE_NUL
8650: 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  L;.      }.    }
8660: 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  ..    p->nResCol
8670: 75 6d 6e 20 3d 20 38 20 2d 20 35 2a 28 70 2d 3e  umn = 8 - 5*(p->
8680: 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20  explain-1);.    
8690: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
86a0: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
86b0: 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65  TE_ROW;.  }.  re
86c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
86d0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
86e0: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66  _EXPLAIN */..#if
86f0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8700: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
8710: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
8720: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
8730: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
8740: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
8750: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
8760: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
8770: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
8780: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f  p *pOp;.  if( nO
8790: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
87a0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
87b0: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
87c0: 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26  ode==OP_Trace &&
87d0: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
87e0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
87f0: 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  *z = pOp->p4.z;.
8800: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
8810: 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20  e3Isspace(*z) ) 
8820: 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  z++;.    printf(
8830: 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  "SQL: [%s]\n", z
8840: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
8850: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
8860: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
8870: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
8880: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
8890: 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  E)./*.** Print a
88a0: 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67  n IOTRACE messag
88b0: 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f  e showing SQL co
88c0: 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ntent..*/.void s
88d0: 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63  qlite3VdbeIOTrac
88e0: 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  eSql(Vdbe *p){. 
88f0: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
8900: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
8910: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49  ;.  if( sqlite3I
8920: 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75  oTrace==0 ) retu
8930: 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  rn;.  if( nOp<1 
8940: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
8950: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
8960: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
8970: 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70  =OP_Trace && pOp
8980: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
8990: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63   int i, j;.    c
89a0: 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20  har z[1000];.   
89b0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
89c0: 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
89d0: 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  "%s", pOp->p4.z)
89e0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73  ;.    for(i=0; s
89f0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
8a00: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  i]); i++){}.    
8a10: 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(j=0; z[i]; i
8a20: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
8a30: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
8a40: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
8a50: 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29  f( z[i-1]!=' ' )
8a60: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  {.          z[j+
8a70: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
8a80: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
8a90: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
8aa0: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  = z[i];.      }.
8ab0: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d      }.    z[j] =
8ac0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   0;.    sqlite3I
8ad0: 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e  oTrace("SQL %s\n
8ae0: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", z);.  }.}.#en
8af0: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
8b00: 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c  MIT_TRACE && SQL
8b10: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
8b20: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  CE */../*.** All
8b30: 6f 63 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d  ocate space from
8b40: 20 61 20 66 69 78 65 64 20 73 69 7a 65 20 62 75   a fixed size bu
8b50: 66 66 65 72 2e 20 20 4d 61 6b 65 20 2a 70 70 20  ffer.  Make *pp 
8b60: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
8b70: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
8b80: 20 20 28 4e 6f 74 65 3a 20 20 70 70 20 69 73 20    (Note:  pp is 
8b90: 61 20 63 68 61 72 2a 20 72 61 74 68 65 72 20 74  a char* rather t
8ba0: 68 61 6e 20 61 20 76 6f 69 64 2a 2a 20 74 6f 0a  han a void** to.
8bb0: 2a 2a 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  ** work around t
8bc0: 68 65 20 70 6f 69 6e 74 65 72 20 61 6c 69 61 73  he pointer alias
8bd0: 69 6e 67 20 72 75 6c 65 73 20 6f 66 20 43 2e 29  ing rules of C.)
8be0: 20 20 2a 70 70 20 73 68 6f 75 6c 64 20 69 6e 69    *pp should ini
8bf0: 74 69 61 6c 6c 79 0a 2a 2a 20 62 65 20 7a 65 72  tially.** be zer
8c00: 6f 2e 20 20 49 66 20 2a 70 70 20 69 73 20 6e 6f  o.  If *pp is no
8c10: 74 20 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61  t zero, that mea
8c20: 6e 73 20 74 68 61 74 20 74 68 65 20 73 70 61 63  ns that the spac
8c30: 65 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  e has already.**
8c40: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
8c50: 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
8c60: 20 69 73 20 61 20 6e 6f 6f 70 2e 0a 2a 2a 0a 2a   is a noop..**.*
8c70: 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e  * nByte is the n
8c80: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
8c90: 66 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a  f space needed..
8ca0: 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f  **.** *ppFrom po
8cb0: 69 6e 74 20 74 6f 20 61 76 61 69 6c 61 62 6c 65  int to available
8cc0: 20 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20   space and pEnd 
8cd0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e  points to the en
8ce0: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69  d of the.** avai
8cf0: 6c 61 62 6c 65 20 73 70 61 63 65 2e 0a 2a 2a 0a  lable space..**.
8d00: 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20  ** *pnByte is a 
8d10: 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e  counter of the n
8d20: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
8d30: 66 20 73 70 61 63 65 20 74 68 61 74 20 68 61 76  f space that hav
8d40: 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61  e failed.** to a
8d50: 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65  llocate.  If the
8d60: 72 65 20 69 73 20 69 6e 73 75 66 66 69 63 69 65  re is insufficie
8d70: 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46  nt space in *ppF
8d80: 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74  rom to satisfy t
8d90: 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74  he.** request, t
8da0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  hen increment *p
8db0: 6e 42 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f  nByte by the amo
8dc0: 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75 65  unt of the reque
8dd0: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
8de0: 69 64 20 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20  id allocSpace(. 
8df0: 20 63 68 61 72 20 2a 70 70 2c 20 20 20 20 20 20   char *pp,      
8e00: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
8e10: 20 53 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e   Set *pp to poin
8e20: 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 64 20 62  t to allocated b
8e30: 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
8e40: 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  Byte,           
8e50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
8e60: 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  es to allocate *
8e70: 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c  /.  u8 **ppFrom,
8e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
8e90: 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f  UT: Allocate fro
8ea0: 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75  m *ppFrom */.  u
8eb0: 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20  8 *pEnd,        
8ec0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
8ed0: 6f 20 31 20 62 79 74 65 20 70 61 73 74 20 74 68  o 1 byte past th
8ee0: 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d  e end of *ppFrom
8ef0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
8f00: 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20 20   *pnByte        
8f10: 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69    /* If allocati
8f20: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64  on cannot be mad
8f30: 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e  e, increment *pn
8f40: 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  Byte */.){.  ass
8f50: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
8f60: 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f  ALIGNMENT(*ppFro
8f70: 6d 29 20 29 3b 0a 20 20 69 66 28 20 28 2a 28 76  m) );.  if( (*(v
8f80: 6f 69 64 2a 2a 29 70 70 29 3d 3d 30 20 29 7b 0a  oid**)pp)==0 ){.
8f90: 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e      nByte = ROUN
8fa0: 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  D8(nByte);.    i
8fb0: 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42  f( &(*ppFrom)[nB
8fc0: 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a  yte] <= pEnd ){.
8fd0: 20 20 20 20 20 20 2a 28 76 6f 69 64 2a 2a 29 70        *(void**)p
8fe0: 70 20 3d 20 28 76 6f 69 64 20 2a 29 2a 70 70 46  p = (void *)*ppF
8ff0: 72 6f 6d 3b 0a 20 20 20 20 20 20 2a 70 70 46 72  rom;.      *ppFr
9000: 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20  om += nByte;.   
9010: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
9020: 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a  nByte += nByte;.
9030: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
9040: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72  ** Prepare a vir
9050: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72  tual machine for
9060: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54 68 69   execution.  Thi
9070: 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67  s involves thing
9080: 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c  s such.** as all
9090: 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73 70  ocating stack sp
90a0: 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ace and initiali
90b0: 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d  zing the program
90c0: 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74   counter..** Aft
90d0: 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20  er the VDBE has 
90e0: 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63  be prepped, it c
90f0: 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62  an be executed b
9100: 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  y one or more.**
9110: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
9120: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a  3VdbeExec().  .*
9130: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
9140: 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
9150: 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20 56 44  e a VDBE from VD
9160: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f  BE_MAGIC_INIT to
9170: 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  .** VDBE_MAGIC_R
9180: 55 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  UN..**.** This f
9190: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
91a0: 61 6c 6c 65 64 20 6d 6f 72 65 20 74 68 61 6e 20  alled more than 
91b0: 6f 6e 63 65 20 6f 6e 20 61 20 73 69 6e 67 6c 65  once on a single
91c0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
91d0: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63  ..** The first c
91e0: 61 6c 6c 20 69 73 20 6d 61 64 65 20 77 68 69 6c  all is made whil
91f0: 65 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20  e compiling the 
9200: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 53  SQL statement. S
9210: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 63 61 6c  ubsequent.** cal
9220: 6c 73 20 61 72 65 20 6d 61 64 65 20 61 73 20 70  ls are made as p
9230: 61 72 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65  art of the proce
9240: 73 73 20 6f 66 20 72 65 73 65 74 74 69 6e 67 20  ss of resetting 
9250: 61 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 62  a statement to b
9260: 65 0a 2a 2a 20 72 65 2d 65 78 65 63 75 74 65 64  e.** re-executed
9270: 20 28 66 72 6f 6d 20 61 20 63 61 6c 6c 20 74 6f   (from a call to
9280: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29   sqlite3_reset()
9290: 29 2e 20 54 68 65 20 6e 56 61 72 2c 20 6e 4d 65  ). The nVar, nMe
92a0: 6d 2c 20 6e 43 75 72 73 6f 72 20 0a 2a 2a 20 61  m, nCursor .** a
92b0: 6e 64 20 69 73 45 78 70 6c 61 69 6e 20 70 61 72  nd isExplain par
92c0: 61 6d 65 74 65 72 73 20 61 72 65 20 6f 6e 6c 79  ameters are only
92d0: 20 70 61 73 73 65 64 20 63 6f 72 72 65 63 74 20   passed correct 
92e0: 76 61 6c 75 65 73 20 74 68 65 20 66 69 72 73 74  values the first
92f0: 20 74 69 6d 65 0a 2a 2a 20 74 68 65 20 66 75 6e   time.** the fun
9300: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
9310: 20 4f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 63   On subsequent c
9320: 61 6c 6c 73 2c 20 66 72 6f 6d 20 73 71 6c 69 74  alls, from sqlit
9330: 65 33 5f 72 65 73 65 74 28 29 2c 20 6e 56 61 72  e3_reset(), nVar
9340: 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 2d 31  .** is passed -1
9350: 20 61 6e 64 20 6e 4d 65 6d 2c 20 6e 43 75 72 73   and nMem, nCurs
9360: 6f 72 20 61 6e 64 20 69 73 45 78 70 6c 61 69 6e  or and isExplain
9370: 20 61 72 65 20 61 6c 6c 20 70 61 73 73 65 64 20   are all passed 
9380: 7a 65 72 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  zero..*/.void sq
9390: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
93a0: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
93b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
93d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20   */.  int nVar, 
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9400: 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65  f '?' see in the
9410: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
9420: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20  /.  int nMem,   
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9440: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9450: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20  memory cells to 
9460: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e  allocate */.  in
9470: 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20  t nCursor,      
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9490: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
94a0: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
94b0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94d0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
94e0: 62 65 72 20 6f 66 20 61 72 67 73 20 69 6e 20 53  ber of args in S
94f0: 75 62 50 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20  ubPrograms */.  
9500: 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 2c 20 20  int isExplain,  
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9520: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 45 58  * True if the EX
9530: 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69  PLAIN keywords i
9540: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
9550: 6e 74 20 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  nt usesStmtJourn
9560: 61 6c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  al            /*
9570: 20 54 72 75 65 20 74 6f 20 73 65 74 20 56 64 62   True to set Vdb
9580: 65 2e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  e.usesStmtJourna
9590: 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  l */.){.  int n;
95a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
95b0: 20 70 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72   p->db;..  asser
95c0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
95d0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
95e0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
95f0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68  ;..  /* There sh
9600: 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74  ould be at least
9610: 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a   one opcode..  *
9620: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  /.  assert( p->n
9630: 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  Op>0 );..  /* Se
9640: 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56  t the magic to V
9650: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f  DBE_MAGIC_RUN so
9660: 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
9670: 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e   later. */.  p->
9680: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
9690: 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 46 6f  IC_RUN;..  /* Fo
96a0: 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65  r each cursor re
96b0: 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c  quired, also all
96c0: 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63  ocate a memory c
96d0: 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a  ell. Memory.  **
96e0: 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e   cells (nMem+1-n
96f0: 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69  Cursor)..nMem, i
9700: 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e  nclusive, will n
9710: 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a  ever be used by.
9720: 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72    ** the vdbe pr
9730: 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74  ogram. Instead t
9740: 68 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20  hey are used to 
9750: 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
9760: 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73  or.  ** VdbeCurs
9770: 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75  or/BtCursor stru
9780: 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62  ctures. The blob
9790: 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63   of memory assoc
97a0: 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a  iated with .  **
97b0: 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f   cursor 0 is sto
97c0: 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  red in memory ce
97d0: 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20  ll nMem. Memory 
97e0: 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20  cell (nMem-1).  
97f0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c  ** stores the bl
9800: 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73  ob of memory ass
9810: 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
9820: 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a  sor 1, etc..  **
9830: 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  .  ** See also: 
9840: 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29  allocateCursor()
9850: 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d  ..  */.  nMem +=
9860: 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20   nCursor;..  /* 
9870: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
9880: 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  or memory regist
9890: 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c  ers, SQL variabl
98a0: 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73  es, VDBE cursors
98b0: 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72   and .  ** an ar
98c0: 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53  ray to marshal S
98d0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  QL function argu
98e0: 6d 65 6e 74 73 20 69 6e 2e 20 54 68 69 73 20 69  ments in. This i
98f0: 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 74 68 65 0a  s only done the.
9900: 20 20 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20    ** first time 
9910: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
9920: 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 67 69   called for a gi
9930: 76 65 6e 20 56 44 42 45 2c 20 6e 6f 74 20 77 68  ven VDBE, not wh
9940: 65 6e 20 69 74 20 69 73 0a 20 20 2a 2a 20 62 65  en it is.  ** be
9950: 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
9960: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 20  sqlite3_reset() 
9970: 74 6f 20 72 65 73 65 74 20 74 68 65 20 76 69 72  to reset the vir
9980: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 20 20  tual machine..  
9990: 2a 2f 0a 20 20 69 66 28 20 6e 56 61 72 3e 3d 30  */.  if( nVar>=0
99a0: 20 26 26 20 41 4c 57 41 59 53 28 64 62 2d 3e 6d   && ALWAYS(db->m
99b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 29 20  allocFailed==0) 
99c0: 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 73 72 20  ){.    u8 *zCsr 
99d0: 3d 20 28 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b  = (u8 *)&p->aOp[
99e0: 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 20 20 75 38 20  p->nOp];.    u8 
99f0: 2a 7a 45 6e 64 20 3d 20 28 75 38 20 2a 29 26 70  *zEnd = (u8 *)&p
9a00: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f  ->aOp[p->nOpAllo
9a10: 63 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  c];.    int nByt
9a20: 65 3b 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32  e;.    resolveP2
9a30: 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29  Values(p, &nArg)
9a40: 3b 0a 20 20 20 20 70 2d 3e 75 73 65 73 53 74 6d  ;.    p->usesStm
9a50: 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  tJournal = (u8)u
9a60: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 3b 0a  sesStmtJournal;.
9a70: 20 20 20 20 69 66 28 20 69 73 45 78 70 6c 61 69      if( isExplai
9a80: 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a  n && nMem<10 ){.
9a90: 20 20 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b        nMem = 10;
9aa0: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
9ab0: 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d  t(zCsr, 0, zEnd-
9ac0: 7a 43 73 72 29 3b 0a 20 20 20 20 7a 43 73 72 20  zCsr);.    zCsr 
9ad0: 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29  += (zCsr - (u8*)
9ae0: 30 29 26 37 3b 0a 20 20 20 20 61 73 73 65 72 74  0)&7;.    assert
9af0: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
9b00: 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a  GNMENT(zCsr) );.
9b10: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
9b20: 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  nByte = 0;.     
9b30: 20 61 6c 6c 6f 63 53 70 61 63 65 28 28 63 68 61   allocSpace((cha
9b40: 72 2a 29 26 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65  r*)&p->aMem, nMe
9b50: 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26  m*sizeof(Mem), &
9b60: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
9b70: 74 65 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63  te);.      alloc
9b80: 53 70 61 63 65 28 28 63 68 61 72 2a 29 26 70 2d  Space((char*)&p-
9b90: 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  >aVar, nVar*size
9ba0: 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20  of(Mem), &zCsr, 
9bb0: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
9bc0: 20 20 20 20 20 61 6c 6c 6f 63 53 70 61 63 65 28       allocSpace(
9bd0: 28 63 68 61 72 2a 29 26 70 2d 3e 61 70 41 72 67  (char*)&p->apArg
9be0: 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65  , nArg*sizeof(Me
9bf0: 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  m*), &zCsr, zEnd
9c00: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  , &nByte);.     
9c10: 20 61 6c 6c 6f 63 53 70 61 63 65 28 28 63 68 61   allocSpace((cha
9c20: 72 2a 29 26 70 2d 3e 61 7a 56 61 72 2c 20 6e 56  r*)&p->azVar, nV
9c30: 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  ar*sizeof(char*)
9c40: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
9c50: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 61 6c  nByte);.      al
9c60: 6c 6f 63 53 70 61 63 65 28 28 63 68 61 72 2a 29  locSpace((char*)
9c70: 26 70 2d 3e 61 70 43 73 72 2c 20 0a 20 20 20 20  &p->apCsr, .    
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 75               nCu
9c90: 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65  rsor*sizeof(Vdbe
9ca0: 43 75 72 73 6f 72 2a 29 2c 20 26 7a 43 73 72 2c  Cursor*), &zCsr,
9cb0: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 0a 20 20   zEnd, &nByte.  
9cc0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
9cd0: 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20   nByte ){.      
9ce0: 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c    p->pFree = sql
9cf0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
9d00: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
9d10: 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 73 72 20     }.      zCsr 
9d20: 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20  = p->pFree;.    
9d30: 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e    zEnd = &zCsr[n
9d40: 42 79 74 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Byte];.    }whil
9d50: 65 28 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d  e( nByte && !db-
9d60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
9d70: 0a 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72  ..    p->nCursor
9d80: 20 3d 20 28 75 31 36 29 6e 43 75 72 73 6f 72 3b   = (u16)nCursor;
9d90: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 56 61 72  .    if( p->aVar
9da0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61   ){.      p->nVa
9db0: 72 20 3d 20 28 75 31 36 29 6e 56 61 72 3b 0a 20  r = (u16)nVar;. 
9dc0: 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c       for(n=0; n<
9dd0: 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nVar; n++){.    
9de0: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66      p->aVar[n].f
9df0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
9e00: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72  .        p->aVar
9e10: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
9e20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
9e30: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
9e40: 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20      p->aMem--;  
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e60: 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f      /* aMem[] go
9e70: 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20  es from 1..nMem 
9e80: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d  */.      p->nMem
9e90: 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20   = nMem;        
9ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20           /*     
9eb0: 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d    not from 0..nM
9ec0: 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 20 20 66 6f  em-1 */.      fo
9ed0: 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20  r(n=1; n<=nMem; 
9ee0: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  n++){.        p-
9ef0: 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aMem[n].flags =
9f00: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
9f10: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62     p->aMem[n].db
9f20: 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20   = db;.      }. 
9f30: 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
9f40: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
9f50: 6f 72 28 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e 4d 65  or(n=1; n<p->nMe
9f60: 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 61 73 73  m; n++){.    ass
9f70: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e  ert( p->aMem[n].
9f80: 64 62 3d 3d 64 62 20 29 3b 0a 20 20 7d 0a 23 65  db==db );.  }.#e
9f90: 6e 64 69 66 0a 0a 20 20 70 2d 3e 70 63 20 3d 20  ndif..  p->pc = 
9fa0: 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  -1;.  p->rc = SQ
9fb0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72  LITE_OK;.  p->er
9fc0: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
9fd0: 62 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  bort;.  p->expla
9fe0: 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b  in |= isExplain;
9ff0: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
a000: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20  BE_MAGIC_RUN;.  
a010: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
a020: 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
a030: 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65  1;.  p->minWrite
a040: 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35  FileFormat = 255
a050: 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  ;.  p->iStatemen
a060: 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44  t = 0;.#ifdef VD
a070: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
a080: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
a090: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
a0a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
a0b0: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a  aOp[i].cnt = 0;.
a0c0: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
a0d0: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20  cycles = 0;.    
a0e0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  }.  }.#endif.}..
a0f0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44  /*.** Close a VD
a100: 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65  BE cursor and re
a110: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65  lease all the re
a120: 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72  sources that cur
a130: 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20  sor .** happens 
a140: 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  to hold..*/.void
a150: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
a160: 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20  Cursor(Vdbe *p, 
a170: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29  VdbeCursor *pCx)
a180: 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  {.  if( pCx==0 )
a190: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
a1a0: 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74  }.  if( pCx->pBt
a1b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
a1c0: 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70  treeClose(pCx->p
a1d0: 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  Bt);.    /* The 
a1e0: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c  pCx->pCursor wil
a1f0: 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d  l be close autom
a200: 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20  atically, if it 
a210: 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a  exists, by.    *
a220: 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  * the call above
a230: 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  . */.  }else if(
a240: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b   pCx->pCursor ){
a250: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
a260: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78  eCloseCursor(pCx
a270: 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ->pCursor);.  }.
a280: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a290: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
a2a0: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61  .  if( pCx->pVta
a2b0: 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  bCursor ){.    s
a2c0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
a2d0: 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20  or *pVtabCursor 
a2e0: 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  = pCx->pVtabCurs
a2f0: 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71  or;.    const sq
a300: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
a310: 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f  odule = pCx->pMo
a320: 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  dule;.    p->inV
a330: 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20  tabMethod = 1;. 
a340: 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
a350: 53 61 66 65 74 79 4f 66 66 28 70 2d 3e 64 62 29  SafetyOff(p->db)
a360: 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  ;.    pModule->x
a370: 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f  Close(pVtabCurso
a380: 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71  r);.    (void)sq
a390: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d  lite3SafetyOn(p-
a3a0: 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  >db);.    p->inV
a3b0: 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20  tabMethod = 0;. 
a3c0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
a3d0: 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75  ** Copy the valu
a3e0: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
a3f0: 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63   VdbeFrame struc
a400: 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65  ture to its Vdbe
a410: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65  . This.** is use
a420: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  d, for example, 
a430: 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73  when a trigger s
a440: 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61  ub-program is ha
a450: 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a  lted to restore.
a460: 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68  ** control to th
a470: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a  e main program..
a480: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
a490: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56  beFrameRestore(V
a4a0: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
a4b0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
a4c0: 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61  Frame->v;.  v->a
a4d0: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70  Op = pFrame->aOp
a4e0: 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72  ;.  v->nOp = pFr
a4f0: 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61  ame->nOp;.  v->a
a500: 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d  Mem = pFrame->aM
a510: 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20  em;.  v->nMem = 
a520: 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pFrame->nMem;.  
a530: 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d  v->apCsr = pFram
a540: 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e  e->apCsr;.  v->n
a550: 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d  Cursor = pFrame-
a560: 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64  >nCursor;.  v->d
a570: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70  b->lastRowid = p
a580: 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64  Frame->lastRowid
a590: 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  v->nChange =
a5a0: 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65   pFrame->nChange
a5b0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d  ;.  return pFram
a5c0: 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->pc;.}../*.** 
a5d0: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
a5e0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  s..**.** Also re
a5f0: 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69  lease any dynami
a600: 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  c memory held by
a610: 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56   the VM in the V
a620: 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20  dbe.aMem memory 
a630: 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20  .** cell array. 
a640: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
a650: 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  y as the memory 
a660: 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63  cell array may c
a670: 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65  ontain.** pointe
a680: 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20  rs to VdbeFrame 
a690: 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d  objects, which m
a6a0: 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61  ay in turn conta
a6b0: 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  in pointers to.*
a6c0: 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  * open cursors..
a6d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
a6e0: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56  loseAllCursors(V
a6f0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
a700: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
a710: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
a720: 65 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20  e = p->pFrame;. 
a730: 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d     for(pFrame=p-
a740: 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d  >pFrame; pFrame-
a750: 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65  >pParent; pFrame
a760: 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74  =pFrame->pParent
a770: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a780: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70  beFrameRestore(p
a790: 46 72 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d  Frame);.  }.  p-
a7a0: 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70  >pFrame = 0;.  p
a7b0: 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20  ->nFrame = 0;.. 
a7c0: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b   if( p->apCsr ){
a7d0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
a7e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
a7f0: 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ursor; i++){.   
a800: 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70     VdbeCursor *p
a810: 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b  C = p->apCsr[i];
a820: 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b  .      if( pC ){
a830: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a840: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
a850: 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70  , pC);.        p
a860: 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
a870: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a880: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  }.  if( p->aMem 
a890: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
a8a0: 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b  mArray(&p->aMem[
a8b0: 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  1], p->nMem);.  
a8c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  }.}../*.** Clean
a8d0: 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72   up the VM after
a8e0: 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a   execution..**.*
a8f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
a900: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
a910: 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73  y close any curs
a920: 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f  ors, lists, and/
a930: 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68  or.** sorters th
a940: 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65  at were left ope
a950: 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65  n.  It also dele
a960: 74 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  tes the values o
a970: 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69  f.** variables i
a980: 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72  n the aVar[] arr
a990: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
a9a0: 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20  id Cleanup(Vdbe 
a9b0: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
a9c0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66  db = p->db;..#if
a9d0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a9e0: 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73  .  /* Execute as
a9f0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
aa00: 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
aa10: 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b   the Vdbe.apCsr[
aa20: 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65  ] and .  ** Vdbe
aa30: 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68  .aMem[] arrays h
aa40: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
aa50: 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f   cleaned up.  */
aa60: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
aa70: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
aa80: 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  r; i++) assert( 
aa90: 70 2d 3e 61 70 43 73 72 3d 3d 30 20 7c 7c 20 70  p->apCsr==0 || p
aaa0: 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b  ->apCsr[i]==0 );
aab0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70  .  for(i=1; i<=p
aac0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73  ->nMem; i++) ass
aad0: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20  ert( p->aMem==0 
aae0: 7c 7c 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c  || p->aMem[i].fl
aaf0: 61 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b  ags==MEM_Null );
ab00: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
ab10: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
ab20: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
ab30: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d  ErrMsg = 0;.  p-
ab40: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
ab50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
ab60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
ab70: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
ab80: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
ab90: 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
aba0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
abb0: 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
abc0: 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
abd0: 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
abe0: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
abf0: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
ac00: 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
ac10: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
ac20: 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
ac30: 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
ac40: 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
ac50: 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
ac60: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
ac70: 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
ac80: 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
ac90: 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  ){.  Mem *pColNa
aca0: 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  me;.  int n;.  s
acb0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
acc0: 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65  db;..  releaseMe
acd0: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
ace0: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
acf0: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
ad00: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
ad10: 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
ad20: 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
ad30: 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d  *COLNAME_N;.  p-
ad40: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75  >nResColumn = (u
ad50: 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20  16)nResColumn;. 
ad60: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70   p->aColName = p
ad70: 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29  ColName = (Mem*)
ad80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
ad90: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d  ero(db, sizeof(M
ada0: 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70  em)*n );.  if( p
adb0: 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20  ->aColName==0 ) 
adc0: 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28  return;.  while(
add0: 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   n-- > 0 ){.    
ade0: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20  pColName->flags 
adf0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
ae00: 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70  pColName->db = p
ae10: 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  ->db;.    pColNa
ae20: 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  me++;.  }.}../*.
ae30: 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
ae40: 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
ae50: 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
ae60: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
ae70: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
ae80: 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
ae90: 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
aea0: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
aeb0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
aec0: 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
aed0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
aee0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
aef0: 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ols()..**.** The
af00: 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
af10: 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20  , xDel, must be 
af20: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59  one of SQLITE_DY
af30: 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54  NAMIC, SQLITE_ST
af40: 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  ATIC.** or SQLIT
af50: 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20  E_TRANSIENT. If 
af60: 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e  it is SQLITE_DYN
af70: 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62  AMIC, then the b
af80: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a  uffer pointed.**
af90: 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c   to by zName wil
afa0: 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71  l be freed by sq
afb0: 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68  lite3DbFree() wh
afc0: 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64  en the vdbe is d
afd0: 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74  estroyed..*/.int
afe0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
aff0: 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a  olName(.  Vdbe *
b000: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
b010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
b020: 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75  be being configu
b030: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  red */.  int idx
b040: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
b060: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61  ex of column zNa
b070: 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f  me applies to */
b080: 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20  .  int var,     
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
b0b0: 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73  e COLNAME_* cons
b0c0: 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  tants */.  const
b0d0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
b0f0: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
b100: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65   containing name
b110: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
b120: 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20  l)(void*)       
b130: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
b140: 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61   management stra
b150: 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a  tegy for zName *
b160: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
b170: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
b180: 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
b190: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
b1a0: 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
b1b0: 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
b1c0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
b1d0: 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  led ){.    asser
b1e0: 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65  t( !zName || xDe
b1f0: 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  l!=SQLITE_DYNAMI
b200: 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C );.    return 
b210: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b220: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  }.  assert( p->a
b230: 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ColName!=0 );.  
b240: 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e  pColName = &(p->
b250: 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72  aColName[idx+var
b260: 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29  *p->nResColumn])
b270: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
b280: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
b290: 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d  olName, zName, -
b2a0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
b2b0: 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  xDel);.  assert(
b2c0: 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65   rc!=0 || !zName
b2d0: 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66   || (pColName->f
b2e0: 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d  lags&MEM_Term)!=
b2f0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
b300: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61  ;.}../*.** A rea
b310: 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
b320: 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61  action may or ma
b330: 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20  y not be active 
b340: 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
b350: 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74  le.** db. If a t
b360: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
b370: 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e  tive, commit it.
b380: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a   If there is a.*
b390: 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
b3a0: 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72  ion spanning mor
b3b0: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
b3c0: 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72  ase file, this r
b3d0: 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20  outine.** takes 
b3e0: 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74  care of the mast
b3f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b  er journal trick
b400: 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
b410: 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71  nt vdbeCommit(sq
b420: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
b430: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
b440: 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20  int nTrans = 0; 
b450: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61   /* Number of da
b460: 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20  tabases with an 
b470: 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61  active write-tra
b480: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nsaction */.  in
b490: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b4a0: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d  ;.  int needXcom
b4b0: 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  mit = 0;..#ifdef
b4c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
b4d0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57  TUALTABLE.  /* W
b4e0: 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c  ith this option,
b4f0: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
b500: 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  () is defined to
b510: 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a   be simply .  **
b520: 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20   SQLITE_OK so p 
b530: 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20  is not used. .  
b540: 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
b550: 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66  METER(p);.#endif
b560: 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f  ..  /* Before do
b570: 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
b580: 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e  e, call the xSyn
b590: 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  c() callback for
b5a0: 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61   any.  ** virtua
b5b0: 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20  l module tables 
b5c0: 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20  written in this 
b5d0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
b5e0: 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65  s has to.  ** be
b5f0: 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74   done before det
b600: 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72  ermining whether
b610: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
b620: 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20  l file is .  ** 
b630: 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20  required, as an 
b640: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
b650: 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61   may add an atta
b660: 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20  ched database.  
b670: 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  ** to the transa
b680: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
b690: 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79   = sqlite3VtabSy
b6a0: 6e 63 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d  nc(db, &p->zErrM
b6b0: 73 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  sg);.  if( rc!=S
b6c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b6d0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
b6e0: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
b6f0: 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
b700: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
b710: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
b720: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
b730: 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
b740: 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
b750: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
b760: 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
b770: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
b780: 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
b790: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
b7a0: 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
b7b0: 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
b7c0: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
b7d0: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
b7e0: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
b7f0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
b800: 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
b810: 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
b820: 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
b830: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
b840: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
b850: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
b860: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
b870: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
b880: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
b890: 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
b8a0: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  it = 1;.      if
b8b0: 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b  ( i!=1 ) nTrans+
b8c0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
b8d0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
b8e0: 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61  any write-transa
b8f0: 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69  ctions at all, i
b900: 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74  nvoke the commit
b910: 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e   hook */.  if( n
b920: 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62  eedXcommit && db
b930: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
b940: 6b 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 73  k ){.    (void)s
b950: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
b960: 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62  db);.    rc = db
b970: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
b980: 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67  k(db->pCommitArg
b990: 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c  );.    (void)sql
b9a0: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29  ite3SafetyOn(db)
b9b0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
b9c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b9d0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
b9e0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
b9f0: 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
ba00: 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
ba10: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
ba20: 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
ba30: 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
ba40: 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
ba50: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
ba60: 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
ba70: 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
ba80: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
ba90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
baa0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
bab0: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
bac0: 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
bad0: 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
bae0: 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
baf0: 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
bb00: 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
bb10: 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e   or a temp file.
bb20: 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20    In .  ** that 
bb30: 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73  case we do not s
bb40: 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
bb50: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
bb60: 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20  , so use the .  
bb70: 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74  ** simple case t
bb80: 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  hen too..  */.  
bb90: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
bba0: 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74  rlen30(sqlite3Bt
bbb0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
bbc0: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a  b->aDb[0].pBt)).
bbd0: 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a     || nTrans<=1.
bbe0: 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30    ){.    for(i=0
bbf0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
bc00: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
bc10: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
bc20: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
bc30: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
bc40: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
bc50: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
bc60: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
bc70: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
bc80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
bc90: 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c  o the commit onl
bca0: 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73  y if all databas
bcb0: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  es successfully 
bcc0: 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31  complete phase 1
bcd0: 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65  . .    ** If one
bce0: 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d   of the BtreeCom
bcf0: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
bd00: 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20  lls fails, this 
bd10: 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20  indicates an.   
bd20: 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69   ** IO error whi
bd30: 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  le deleting or t
bd40: 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72  runcating a jour
bd50: 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20  nal file. It is 
bd60: 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a  unlikely,.    **
bd70: 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65   but could happe
bd80: 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  n. In this case 
bd90: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
bda0: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
bdb0: 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  e error..    */.
bdc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
bdd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
bde0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
bdf0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
be00: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
be10: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
be20: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
be30: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
be40: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b  itPhaseTwo(pBt);
be50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
be60: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
be70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
be80: 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
be90: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
bea0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78    /* The complex
beb0: 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73   case - There is
bec0: 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72   a multi-file wr
bed0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
bee0: 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69  active..  ** Thi
bef0: 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73  s requires a mas
bf00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
bf10: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74   to ensure the t
bf20: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
bf30: 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f  ** committed ato
bf40: 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e  micly..  */.#ifn
bf50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bf60: 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20  DISKIO.  else{. 
bf70: 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
bf80: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
bf90: 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
bfa0: 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  c = 0;.    char 
bfb0: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
bfc0: 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72  /* File-name for
bfd0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
bfe0: 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  nal */.    char 
bff0: 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65  const *zMainFile
c000: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
c010: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
c020: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[0].pBt);.    
c030: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
c040: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
c050: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
c060: 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20     int res;..   
c070: 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73   /* Select a mas
c080: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c090: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20   name */.    do 
c0a0: 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e  {.      u32 iRan
c0b0: 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dom;.      sqlit
c0c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
c0d0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
c0e0: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
c0f0: 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c  sizeof(iRandom),
c100: 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20   &iRandom);.    
c110: 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    zMaster = sqli
c120: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
c130: 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69  %s-mj%08X", zMai
c140: 6e 46 69 6c 65 2c 20 69 52 61 6e 64 6f 6d 26 30  nFile, iRandom&0
c150: 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20  x7fffffff);.    
c160: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29    if( !zMaster )
c170: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
c180: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
c190: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
c1a0: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
c1b0: 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
c1c0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
c1d0: 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
c1e0: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
c1f0: 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29  LITE_OK && res )
c200: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
c210: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c220: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
c230: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  ter journal. */.
c240: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c250: 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70  e3OsOpenMalloc(p
c260: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70  Vfs, zMaster, &p
c270: 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20  Master, .       
c280: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
c290: 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
c2a0: 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
c2b0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
c2c0: 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
c2d0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
c2e0: 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20  JOURNAL, 0.     
c2f0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
c300: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c310: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c320: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
c330: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
c340: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20  n rc;.    }. .  
c350: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
c360: 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61  ame of each data
c370: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
c380: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74   transaction int
c390: 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
c3a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c3b0: 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  file. If an erro
c3c0: 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73  r occurs at this
c3d0: 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20   point close.   
c3e0: 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74   ** and delete t
c3f0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c400: 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20  l file. All the 
c410: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
c420: 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20  al files.    ** 
c430: 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c  still have 'null
c440: 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20  ' as the master 
c450: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  journal pointer,
c460: 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f   so they will ro
c470: 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69  ll.    ** back i
c480: 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20  ndependently if 
c490: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
c4a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
c4b0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
c4c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
c4d0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
c4e0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
c4f0: 69 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69  if( i==1 ) conti
c500: 6e 75 65 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65  nue;   /* Ignore
c510: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
c520: 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  se */.      if( 
c530: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
c540: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
c550: 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74        char const
c560: 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *zFile = sqlite
c570: 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
c580: 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20  name(pBt);.     
c590: 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d     if( zFile[0]=
c5a0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  =0 ) continue;  
c5b0: 2f 2a 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72  /* Ignore :memor
c5c0: 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  y: databases */.
c5d0: 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65          if( !nee
c5e0: 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65  dSync && !sqlite
c5f0: 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
c600: 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ed(pBt) ){.     
c610: 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
c620: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
c630: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c640: 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72  3OsWrite(pMaster
c650: 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33  , zFile, sqlite3
c660: 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
c670: 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
c680: 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71      offset += sq
c690: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
c6a0: 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20  ile)+1;.        
c6b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c6c0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
c6d0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
c6e0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
c6f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
c700: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
c710: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
c720: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
c730: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
c740: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
c750: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
c760: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
c770: 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
c780: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c790: 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
c7a0: 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
c7b0: 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
c7c0: 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
c7d0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
c7e0: 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e  .    if( needSyn
c7f0: 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73  c .     && 0==(s
c800: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c810: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d  aracteristics(pM
c820: 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f  aster)&SQLITE_IO
c830: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a  CAP_SEQUENTIAL).
c840: 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f       && SQLITE_O
c850: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
c860: 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20  OsSync(pMaster, 
c870: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
c880: 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  AL)).    ){.    
c890: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
c8a0: 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
c8b0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
c8c0: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
c8d0: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  er, 0);.      sq
c8e0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
c8f0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
c900: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
c910: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c  ..    /* Sync al
c920: 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69  l the db files i
c930: 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74  nvolved in the t
c940: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
c950: 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  same call.    **
c960: 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72   sets the master
c970: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
c980: 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64   in each individ
c990: 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ual journal. If.
c9a0: 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20      ** an error 
c9b0: 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20  occurs here, do 
c9c0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
c9d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c9e0: 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
c9f0: 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f  * If the error o
ca00: 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
ca10: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20   first call to. 
ca20: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72     ** sqlite3Btr
ca30: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
ca40: 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  (), then there i
ca50: 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20  s a chance that 
ca60: 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  the.    ** maste
ca70: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  r journal file w
ca80: 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e  ill be orphaned.
ca90: 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64   But we cannot d
caa0: 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a  elete it,.    **
cab0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73   in case the mas
cac0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cad0: 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65   name was writte
cae0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
caf0: 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62  al.    ** file b
cb00: 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72  efore the failur
cb10: 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20  e occurred..    
cb20: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
cb30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
cb40: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
cb50: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
cb60: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
cb70: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
cb80: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
cb90: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
cba0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
cbb0: 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
cbc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
cbd0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
cbe0: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
cbf0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
cc00: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
cc10: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
cc20: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
cc30: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
cc40: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
cc50: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
cc60: 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d   file. This comm
cc70: 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  its the transact
cc80: 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a  ion. After.    *
cc90: 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65  * doing this the
cca0: 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79   directory is sy
ccb0: 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72  nced again befor
ccc0: 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c  e any individual
ccd0: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
cce0: 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65  ion files are de
ccf0: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
cd00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
cd10: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
cd20: 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71  ster, 1);.    sq
cd30: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
cd40: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
cd50: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
cd60: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
cd70: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
cd80: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65  .    /* All file
cd90: 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65  s and directorie
cda0: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
cdb0: 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74  een synced, so t
cdc0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
cdd0: 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
cde0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
cdf0: 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e  haseTwo() are on
ce00: 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73  ly closing files
ce10: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65   and.    ** dele
ce20: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
ce30: 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20  ng journals. If 
ce40: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
ce50: 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a  rong while.    *
ce60: 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
ce70: 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61  ing we don't rea
ce80: 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e  lly care. The in
ce90: 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20  tegrity of the. 
cea0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
ceb0: 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61  n is already gua
cec0: 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d  ranteed, but som
ced0: 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a  e stray 'cold' j
cee0: 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d  ournals.    ** m
cef0: 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75  ay be lying arou
cf00: 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  nd. Returning an
cf10: 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27   error code won'
cf20: 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a  t help matters..
cf30: 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62      */.    disab
cf40: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
cf50: 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71  errors();.    sq
cf60: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
cf70: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f  Malloc();.    fo
cf80: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
cf90: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
cfa0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
cfb0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
cfc0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
cfd0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
cfe0: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
cff0: 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pBt);.      }.  
d000: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
d010: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
d020: 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
d030: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
d040: 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
d050: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
d060: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
d070: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
d080: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d090: 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
d0a0: 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64  sqlite3.activeVd
d0b0: 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69  beCnt count vari
d0c0: 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20  able.** matches 
d0d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64  the number of vd
d0e0: 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74  be's in the list
d0f0: 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74   sqlite3.pVdbe t
d100: 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  hat are.** curre
d110: 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20  ntly active. An 
d120: 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
d130: 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74  if the two count
d140: 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  s do not match..
d150: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
d160: 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63  ternal self-chec
d170: 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e  k only - it is n
d180: 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20  ot an essential 
d190: 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74  processing.** st
d1a0: 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ep..**.** This i
d1b0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45  s a no-op if NDE
d1c0: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
d1d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
d1e0: 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  G.static void ch
d1f0: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
d200: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
d210: 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20   Vdbe *p;.  int 
d220: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  cnt = 0;.  int n
d230: 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d  Write = 0;.  p =
d240: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
d250: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
d260: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
d270: 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d  _MAGIC_RUN && p-
d280: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  >pc>=0 ){.      
d290: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
d2a0: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
d2b0: 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20  ) nWrite++;.    
d2c0: 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
d2d0: 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  xt;.  }.  assert
d2e0: 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76  ( cnt==db->activ
d2f0: 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 61 73  eVdbeCnt );.  as
d300: 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62  sert( nWrite==db
d310: 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29  ->writeVdbeCnt )
d320: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
d330: 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
d340: 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
d350: 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20  /*.** For every 
d360: 42 74 72 65 65 20 74 68 61 74 20 69 6e 20 64 61  Btree that in da
d370: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
d380: 6e 20 64 62 20 77 68 69 63 68 20 0a 2a 2a 20 68  n db which .** h
d390: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
d3a0: 2c 20 22 74 72 69 70 22 20 6f 72 20 69 6e 76 61  , "trip" or inva
d3b0: 6c 69 64 61 74 65 20 65 61 63 68 20 63 75 72 73  lidate each curs
d3c0: 6f 72 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74  or in.** that Bt
d3d0: 72 65 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  ree might have b
d3e0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
d3f0: 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a  that the cursor.
d400: 2a 2a 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  ** can never be 
d410: 75 73 65 64 20 61 67 61 69 6e 2e 20 20 54 68 69  used again.  Thi
d420: 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61  s happens when a
d430: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63   rollback.*** oc
d440: 63 75 72 73 2e 20 20 57 65 20 68 61 76 65 20 74  curs.  We have t
d450: 6f 20 74 72 69 70 20 61 6c 6c 20 74 68 65 20 6f  o trip all the o
d460: 74 68 65 72 20 63 75 72 73 6f 72 73 2c 20 65 76  ther cursors, ev
d470: 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f  en.** cursor fro
d480: 6d 20 6f 74 68 65 72 20 56 4d 73 20 69 6e 20 64  m other VMs in d
d490: 69 66 66 65 72 65 6e 74 20 64 61 74 61 62 61 73  ifferent databas
d4a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a  e connections,.*
d4b0: 2a 20 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f  * so that none o
d4c0: 66 20 74 68 65 6d 20 74 72 79 20 74 6f 20 75 73  f them try to us
d4d0: 65 20 74 68 65 20 64 61 74 61 20 61 74 20 77 68  e the data at wh
d4e0: 69 63 68 20 74 68 65 79 0a 2a 2a 20 77 65 72 65  ich they.** were
d4f0: 20 70 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77 68   pointing and wh
d500: 69 63 68 20 6e 6f 77 20 6d 61 79 20 68 61 76 65  ich now may have
d510: 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 64 75   been changed du
d520: 65 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c  e.** to the roll
d530: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65  back..**.** Reme
d540: 6d 62 65 72 20 74 68 61 74 20 61 20 72 6f 6c 6c  mber that a roll
d550: 62 61 63 6b 20 63 61 6e 20 64 65 6c 65 74 65 20  back can delete 
d560: 74 61 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20  tables complete 
d570: 61 6e 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72  and.** reorder r
d580: 6f 6f 74 70 61 67 65 73 2e 20 20 53 6f 20 69 74  ootpages.  So it
d590: 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
d5a0: 6e 74 20 6a 75 73 74 20 74 6f 20 73 61 76 65 0a  nt just to save.
d5b0: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ** the state of 
d5c0: 74 68 65 20 63 75 72 73 6f 72 2e 20 20 57 65 20  the cursor.  We 
d5d0: 68 61 76 65 20 74 6f 20 69 6e 76 61 6c 69 64 61  have to invalida
d5e0: 74 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  te the cursor.**
d5f0: 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e   so that it is n
d600: 65 76 65 72 20 75 73 65 64 20 61 67 61 69 6e 2e  ever used again.
d610: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d620: 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72  invalidateCursor
d630: 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65  sOnModifiedBtree
d640: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
d650: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
d660: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
d670: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
d680: 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  p = db->aDb[i].p
d690: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 26 26  Bt;.    if( p &&
d6a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
d6b0: 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20  nTrans(p) ){.   
d6c0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54     sqlite3BtreeT
d6d0: 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
d6e0: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a   SQLITE_ABORT);.
d6f0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
d700: 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70  ** If the Vdbe p
d710: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
d720: 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e  st argument open
d730: 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74  ed a statement-t
d740: 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63  ransaction,.** c
d750: 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67  lose it now. Arg
d760: 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62  ument eOp must b
d770: 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  e either SAVEPOI
d780: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a  NT_ROLLBACK or.*
d790: 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  * SAVEPOINT_RELE
d7a0: 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41  ASE. If it is SA
d7b0: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
d7c0: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65  , then the state
d7d0: 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
d7e0: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
d7f0: 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41  ck. If eOp is SA
d800: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
d810: 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74   then the .** st
d820: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
d830: 69 6f 6e 20 69 73 20 63 6f 6d 6d 74 74 65 64 2e  ion is commtted.
d840: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
d850: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
d860: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
d870: 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
d880: 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
d890: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
d8a0: 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
d8b0: 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
d8c0: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ent(Vdbe *p, int
d8d0: 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33   eOp){.  sqlite3
d8e0: 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e   *const db = p->
d8f0: 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  db;.  int rc = S
d900: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
d910: 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  If p->iStatement
d920: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
d930: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73   zero, then this
d940: 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a   Vdbe opened a .
d950: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
d960: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
d970: 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
d980: 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20   here. The only 
d990: 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  exception.  ** i
d9a0: 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72  s that an IO err
d9b0: 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75  or may have occu
d9c0: 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20  red, causing an 
d9d0: 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61  emergency rollba
d9e0: 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73  ck..  ** In this
d9f0: 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74   case (db->nStat
da00: 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74  ement==0), and t
da10: 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
da20: 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  to do..  */.  if
da30: 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
da40: 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e   && p->iStatemen
da50: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
da60: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53      const int iS
da70: 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53  avepoint = p->iS
da80: 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20  tatement-1;..   
da90: 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41   assert( eOp==SA
daa0: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
dab0: 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49   || eOp==SAVEPOI
dac0: 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20  NT_RELEASE);.   
dad0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74   assert( db->nSt
dae0: 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20  atement>0 );.   
daf0: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61   assert( p->iSta
db00: 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74  tement==(db->nSt
db10: 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76  atement+db->nSav
db20: 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20  epoint) );..    
db30: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
db40: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
db50: 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
db60: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65  E_OK;.      Btre
db70: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
db80: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
db90: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
dba0: 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
dbb0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
dbc0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d  .          rc2 =
dbd0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
dbe0: 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
dbf0: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
dc00: 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
dc10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
dc20: 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  f( rc2==SQLITE_O
dc30: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
dc40: 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
dc50: 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
dc60: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
dc70: 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
dc80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dc90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dca0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
dcb0: 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
dcc0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
dcd0: 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74   }.    db->nStat
dce0: 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e  ement--;.    p->
dcf0: 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
dd00: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
dd10: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
dd20: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f  tion is being ro
dd30: 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20  lled back, also 
dd40: 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20  restore the .   
dd50: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e   ** database han
dd60: 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f  dles deferred co
dd70: 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72  nstraint counter
dd80: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
dd90: 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a   had when .    *
dda0: 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
ddb0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
ddc0: 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20  opened.  */.    
ddd0: 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
dde0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
ddf0: 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
de00: 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  edCons = p->nStm
de10: 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a  tDefCons;.    }.
de20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
de30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  .}../*.** If SQL
de40: 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ite is compiled 
de50: 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  to support share
de60: 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64  d-cache mode and
de70: 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66   to be threadsaf
de80: 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  e,.** this routi
de90: 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d  ne obtains the m
dea0: 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  utex associated 
deb0: 77 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72  with each BtShar
dec0: 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ed structure.** 
ded0: 74 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65  that may be acce
dee0: 73 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70  ssed by the VM p
def0: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
df00: 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73  ment. In doing s
df10: 6f 20 69 74 0a 2a 2a 20 73 65 74 73 20 74 68 65  o it.** sets the
df20: 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d   BtShared.db mem
df30: 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74  ber of each of t
df40: 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
df50: 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67  ctures, ensuring
df60: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72  .** that the cor
df70: 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65  rect busy-handle
df80: 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e  r callback is in
df90: 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72 65  voked if require
dfa0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  d..**.** If SQLi
dfb0: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  te is not thread
dfc0: 73 61 66 65 20 62 75 74 20 64 6f 65 73 20 73 75  safe but does su
dfd0: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
dfe0: 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a  he mode, then.**
dff0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
e000: 65 72 41 6c 6c 28 29 20 69 73 20 69 6e 76 6f 6b  erAll() is invok
e010: 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74  ed to set the Bt
e020: 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62  Shared.db variab
e030: 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  les.** of all of
e040: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
e050: 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20  ures accessible 
e060: 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65  via the database
e070: 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f   handle .** asso
e080: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
e090: 56 4d 2e 20 4f 66 20 63 6f 75 72 73 65 20 6f 6e  VM. Of course on
e0a0: 6c 79 20 61 20 73 75 62 73 65 74 20 6f 66 20 74  ly a subset of t
e0b0: 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73 0a  hese structures.
e0c0: 2a 2a 20 77 69 6c 6c 20 62 65 20 61 63 63 65 73  ** will be acces
e0d0: 73 65 64 20 62 79 20 74 68 65 20 56 4d 2c 20 61  sed by the VM, a
e0e0: 6e 64 20 77 65 20 63 6f 75 6c 64 20 75 73 65 20  nd we could use 
e0f0: 56 64 62 65 2e 62 74 72 65 65 4d 61 73 6b 20 74  Vdbe.btreeMask t
e100: 6f 20 66 69 67 75 72 65 0a 2a 2a 20 74 68 61 74  o figure.** that
e110: 20 73 75 62 73 65 74 20 6f 75 74 2c 20 62 75 74   subset out, but
e120: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76   there is no adv
e130: 61 6e 74 61 67 65 20 74 6f 20 64 6f 69 6e 67 20  antage to doing 
e140: 73 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  so..**.** If SQL
e150: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
e160: 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e  dsafe and does n
e170: 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  ot support share
e180: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
e190: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  is.** function i
e1a0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69  s a no-op..*/.#i
e1b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e1c0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 76  T_SHARED_CACHE.v
e1d0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
e1e0: 75 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 56  utexArrayEnter(V
e1f0: 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c  dbe *p){.#if SQL
e200: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20  ITE_THREADSAFE. 
e210: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
e220: 65 78 41 72 72 61 79 45 6e 74 65 72 28 26 70 2d  exArrayEnter(&p-
e230: 3e 61 4d 75 74 65 78 29 3b 0a 23 65 6c 73 65 0a  >aMutex);.#else.
e240: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
e250: 74 65 72 41 6c 6c 28 70 2d 3e 64 62 29 3b 0a 23  terAll(p->db);.#
e260: 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a  endif.}.#endif..
e270: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
e280: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
e290: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
e2a0: 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64   opened by the d
e2b0: 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64  atabase .** hand
e2c0: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
e2d0: 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  th the VM passed
e2e0: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
e2f0: 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a  is about to be .
e300: 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66  ** committed. If
e310: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
e320: 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20  anding deferred 
e330: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
e340: 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74  traint.** violat
e350: 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  ions, return SQL
e360: 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72  ITE_ERROR. Other
e370: 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
e380: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
e390: 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
e3a0: 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e  FK violations an
e3b0: 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
e3c0: 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
e3d0: 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68  TE_ERROR, set th
e3e0: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
e3f0: 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e  VM to SQLITE_CON
e400: 53 54 52 41 49 4e 54 20 61 6e 64 20 77 72 69 74  STRAINT and writ
e410: 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 65  e.** an error me
e420: 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65  ssage to it. The
e430: 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
e440: 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ERROR..*/.#ifnde
e450: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
e460: 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71  REIGN_KEY.int sq
e470: 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
e480: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65  (Vdbe *p, int de
e490: 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74  ferred){.  sqlit
e4a0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
e4b0: 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20    if( (deferred 
e4c0: 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  && db->nDeferred
e4d0: 43 6f 6e 73 3e 30 29 20 7c 7c 20 28 21 64 65 66  Cons>0) || (!def
e4e0: 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43  erred && p->nFkC
e4f0: 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 29 7b 0a  onstraint>0) ){.
e500: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
e510: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
e520: 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f     p->errorActio
e530: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
e540: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
e550: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
e560: 64 62 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  db, "foreign key
e570: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
e580: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
e590: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
e5a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
e5b0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
e5c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
e5d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
e5e0: 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
e5f0: 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
e600: 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
e610: 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
e620: 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
e630: 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
e640: 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
e650: 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
e660: 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
e670: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
e680: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
e690: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
e6a0: 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
e6b0: 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
e6c0: 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
e6d0: 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
e6e0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
e6f0: 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
e700: 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
e710: 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
e720: 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
e730: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
e740: 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
e750: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
e760: 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
e770: 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
e780: 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
e790: 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
e7a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
e7b0: 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
e7c0: 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
e7d0: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
e7e0: 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
e7f0: 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
e800: 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
e810: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
e820: 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
e830: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
e860: 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
e870: 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
e880: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
e890: 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
e8a0: 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
e8b0: 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
e8c0: 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
e8d0: 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
e8e0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
e8f0: 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
e900: 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
e910: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
e920: 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
e930: 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
e940: 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
e950: 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
e960: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
e970: 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
e980: 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
e990: 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
e9a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
e9b0: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
e9c0: 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
e9d0: 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
e9e0: 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
e9f0: 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
ea00: 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
ea10: 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
ea20: 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
ea30: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
ea40: 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
ea50: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
ea60: 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
ea70: 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
ea80: 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
ea90: 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
eaa0: 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
eab0: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
eac0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
ead0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
eae0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
eaf0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f  NOMEM;.  }.  clo
eb00: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b  seAllCursors(p);
eb10: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
eb20: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
eb30: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
eb40: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
eb50: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
eb60: 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  t(db);..  /* No 
eb70: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
eb80: 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  ck needed if the
eb90: 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73   program never s
eba0: 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  tarted */.  if( 
ebb0: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
ebc0: 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72  int mrc;   /* Pr
ebd0: 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65  imary error code
ebe0: 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20   from p->rc */. 
ebf0: 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e     int eStatemen
ec00: 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tOp = 0;.    int
ec10: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b   isSpecialError;
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
ec30: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20  et to true if a 
ec40: 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20  'special' error 
ec50: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20  */..    /* Lock 
ec60: 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20  all btrees used 
ec70: 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
ec80: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
ec90: 64 62 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74  dbeMutexArrayEnt
eca0: 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  er(p);..    /* C
ecb0: 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20  heck for one of 
ecc0: 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
ecd0: 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20  rs */.    mrc = 
ece0: 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20  p->rc & 0xff;.  
ecf0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
ed00: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
ed10: 4f 43 4b 45 44 20 29 3b 20 20 2f 2a 20 54 68 69  OCKED );  /* Thi
ed20: 73 20 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65  s error no longe
ed30: 72 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  r exists */.    
ed40: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d  isSpecialError =
ed50: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d   mrc==SQLITE_NOM
ed60: 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
ed70: 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  E_IOERR.        
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
ed90: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc==SQLITE_INTE
eda0: 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51  RRUPT || mrc==SQ
edb0: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69  LITE_FULL;.    i
edc0: 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  f( isSpecialErro
edd0: 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  r ){.      /* If
ede0: 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72   the query was r
edf0: 65 61 64 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65 65  ead-only, we nee
ee00: 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  d do no rollback
ee10: 20 61 74 20 61 6c 6c 2e 20 4f 74 68 65 72 77 69   at all. Otherwi
ee20: 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  se,.      ** pro
ee30: 63 65 65 64 20 77 69 74 68 20 74 68 65 20 73 70  ceed with the sp
ee40: 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a  ecial handling..
ee50: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
ee60: 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
ee70: 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49  || mrc!=SQLITE_I
ee80: 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20  NTERRUPT ){.    
ee90: 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51      if( (mrc==SQ
eea0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
eeb0: 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20  c==SQLITE_FULL) 
eec0: 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  && p->usesStmtJo
eed0: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  urnal ){.       
eee0: 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
eef0: 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
ef00: 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65  BACK;.        }e
ef10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
ef20: 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20  * We are forced 
ef30: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65  to roll back the
ef40: 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
ef50: 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e  ion. Before doin
ef60: 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  g.          ** s
ef70: 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68  o, abort any oth
ef80: 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  er statements th
ef90: 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e  is handle curren
efa0: 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a  tly has active..
efb0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
efc0: 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
efd0: 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
efe0: 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20  edBtrees(db);.  
eff0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
f000: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
f010: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f020: 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
f030: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
f040: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
f050: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
f060: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
f070: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d   /* Check for im
f080: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
f090: 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20  key violations. 
f0a0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
f0b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f0c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f0d0: 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20  CheckFk(p, 0);. 
f0e0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
f0f0: 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
f100: 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  t flag is set an
f110: 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e  d this is the on
f120: 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72  ly active writer
f130: 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65   .    ** VM, the
f140: 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61  n we do either a
f150: 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
f160: 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65  ack of the curre
f170: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  nt transaction. 
f180: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
f190: 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20  ote: This block 
f1a0: 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65  also runs if one
f1b0: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
f1c0: 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a  errors handled .
f1d0: 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73      ** above has
f1e0: 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20   occurred. .    
f1f0: 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  */.    if( !sqli
f200: 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62  te3VtabInSync(db
f210: 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61  ) .     && db->a
f220: 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20  utoCommit .     
f230: 26 26 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65  && db->writeVdbe
f240: 43 6e 74 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c  Cnt==(p->readOnl
f250: 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  y==0) .    ){.  
f260: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
f270: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
f280: 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
f290: 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
f2a0: 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
f2b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
f2c0: 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29  dbeCheckFk(p, 1)
f2d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
f2e0: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
f2f0: 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d  rrayLeave(&p->aM
f300: 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  utex);.         
f310: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
f320: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
f330: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
f340: 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
f350: 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 62  is true, the vdb
f360: 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75  e program was su
f370: 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20  ccessful .      
f380: 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27    ** or hit an '
f390: 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61  OR FAIL' constra
f3a0: 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61 72  int and there ar
f3b0: 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f  e no deferred fo
f3c0: 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 2a 2a  reign.        **
f3d0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
f3e0: 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20   to hold up the 
f3f0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
f400: 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74  s means a commit
f410: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20   .        ** is 
f420: 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20  required.  */.  
f430: 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43        rc = vdbeC
f440: 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20  ommit(db, p);.  
f450: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
f460: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
f470: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
f480: 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61  reeMutexArrayLea
f490: 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a  ve(&p->aMutex);.
f4a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f4b0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
f4c0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f4d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f4e0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
f4f0: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
f500: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
f510: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
f520: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f530: 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
f540: 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
f550: 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74     sqlite3Commit
f560: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
f570: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  db);.        }. 
f580: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f590: 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
f5a0: 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
f5b0: 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53    }.      db->nS
f5c0: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
f5d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61    }else if( eSta
f5e0: 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20  tementOp==0 ){. 
f5f0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
f600: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
f610: 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
f620: 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Fail ){.        
f630: 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
f640: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
f650: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f660: 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
f670: 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
f680: 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
f690: 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
f6a0: 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d  OLLBACK;.      }
f6b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
f6c0: 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
f6d0: 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
f6e0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  db);.        sql
f6f0: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
f700: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  db);.        sql
f710: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
f720: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
f730: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
f740: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
f750: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
f760: 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20  eStatementOp is 
f770: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
f780: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
f790: 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a  action needs to.
f7a0: 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74      ** be commit
f7b0: 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
f7c0: 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ck. Call sqlite3
f7d0: 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
f7e0: 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64  nt() to.    ** d
f7f0: 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70  o so. If this op
f800: 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  eration returns 
f810: 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
f820: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
f830: 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72  ent.    ** error
f840: 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
f850: 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e  OK or SQLITE_CON
f860: 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 73 65  STRAINT, then se
f870: 74 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  t the error.    
f880: 2a 2a 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e  ** code to the n
f890: 65 77 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f  ew value..    */
f8a0: 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d  .    if( eStatem
f8b0: 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72  entOp ){.      r
f8c0: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
f8d0: 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
f8e0: 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a   eStatementOp);.
f8f0: 20 20 20 20 20 20 69 66 28 20 72 63 20 26 26 20        if( rc && 
f900: 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  (p->rc==SQLITE_O
f910: 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
f920: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 20 29  TE_CONSTRAINT) )
f930: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
f940: 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 73 71  = rc;.        sq
f950: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f960: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
f970: 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
f980: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
f990: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
f9a0: 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45  this was an INSE
f9b0: 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
f9c0: 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74  LETE and no stat
f9d0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
f9e0: 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  n.    ** has bee
f9f0: 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75  n rolled back, u
fa00: 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
fa10: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68  se connection ch
fa20: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20  ange-counter. . 
fa30: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
fa40: 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a  >changeCntOn ){.
fa50: 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65        if( eState
fa60: 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e  mentOp!=SAVEPOIN
fa70: 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
fa80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fa90: 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
faa0: 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
fab0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fac0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
fad0: 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a  Changes(db, 0);.
fae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
faf0: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
fb00: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f    }.  .    /* Ro
fb10: 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74  llback or commit
fb20: 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e   any schema chan
fb30: 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 72 65  ges that occurre
fb40: 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  d. */.    if( p-
fb50: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc!=SQLITE_OK &
fb60: 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  & db->flags&SQLI
fb70: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
fb80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fb90: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
fba0: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20  hema(db, 0);.   
fbb0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28     db->flags = (
fbc0: 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49  db->flags | SQLI
fbd0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
fbe0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
fbf0: 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
fc00: 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ks */.    sqlite
fc10: 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79  3BtreeMutexArray
fc20: 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78  Leave(&p->aMutex
fc30: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20  );.  }..  /* We 
fc40: 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c  have successfull
fc50: 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f  y halted and clo
fc60: 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63  sed the VM.  Rec
fc70: 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ord this fact. *
fc80: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
fc90: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69   ){.    db->acti
fca0: 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20  veVdbeCnt--;.   
fcb0: 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
fcc0: 79 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 77  y ){.      db->w
fcd0: 72 69 74 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20  riteVdbeCnt--;. 
fce0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
fcf0: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
fd00: 6e 74 3e 3d 64 62 2d 3e 77 72 69 74 65 56 64 62  nt>=db->writeVdb
fd10: 65 43 6e 74 20 29 3b 0a 20 20 7d 0a 20 20 70 2d  eCnt );.  }.  p-
fd20: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
fd30: 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63  GIC_HALT;.  chec
fd40: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
fd50: 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  b);.  if( p->db-
fd60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
fd70: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
fd80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
fd90: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
fda0: 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
fdb0: 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65  set to true, the
fdc0: 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74  n any locks that
fdd0: 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20   were held.  ** 
fde0: 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  by connection db
fdf0: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
fe00: 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71  eleased. Call sq
fe10: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
fe20: 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20  nlocked() .  ** 
fe30: 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65  to invoke any re
fe40: 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f  quired unlock-no
fe50: 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
fe60: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61    */.  if( db->a
fe70: 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
fe80: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
fe90: 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a  onUnlocked(db);.
fea0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64    }..  assert( d
feb0: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
fec0: 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f  >0 || db->autoCo
fed0: 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e  mmit==0 || db->n
fee0: 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a  Statement==0 );.
fef0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ff00: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61  OK;.}.../*.** Ea
ff10: 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68  ch VDBE holds th
ff20: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
ff30: 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
ff40: 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a  te3_step() call.
ff50: 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68  ** in p->rc.  Th
ff60: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
ff70: 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b  that result back
ff80: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a   to SQLITE_OK..*
ff90: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
ffa0: 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c  beResetStepResul
ffb0: 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  t(Vdbe *p){.  p-
ffc0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
ffd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
ffe0: 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20  up a VDBE after 
fff0: 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f  execution but do
10000 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
10010 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a  VDBE just yet..*
10020 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f  * Write any erro
10030 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20  r messages into 
10040 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75  *pzErrMsg.  Retu
10050 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  rn the result co
10060 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  de..**.** After 
10070 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
10080 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68  run, the VDBE sh
10090 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f  ould be ready to
100a0 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   be executed.** 
100b0 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  again..**.** To 
100c0 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68  look at it anoth
100d0 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75  er way, this rou
100e0 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20  tine resets the 
100f0 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  state of the.** 
10100 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
10110 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f  from VDBE_MAGIC_
10120 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49  RUN or VDBE_MAGI
10130 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a  C_HALT back to.*
10140 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  * VDBE_MAGIC_INI
10150 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
10160 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20  3VdbeReset(Vdbe 
10170 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
10180 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  db;.  db = p->db
10190 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
101a0 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f  M did not run to
101b0 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69   completion or i
101c0 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64  f it encountered
101d0 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20   an.  ** error, 
101e0 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f  then it might no
101f0 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74  t have been halt
10200 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f  ed properly.  So
10210 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f   halt.  ** it no
10220 77 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29  w..  */.  (void)
10230 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
10240 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  db);.  sqlite3Vd
10250 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 28 76 6f  beHalt(p);.  (vo
10260 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
10270 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49  Off(db);..  /* I
10280 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  f the VDBE has b
10290 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69  e run even parti
102a0 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73  ally, then trans
102b0 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f  fer the error co
102c0 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f  de.  ** and erro
102d0 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74  r message from t
102e0 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65  he VDBE into the
102f0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
10300 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20  tructure.  But. 
10310 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20   ** if the VDBE 
10320 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65  has just been se
10330 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73  t to run but has
10340 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78   not actually ex
10350 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20  ecuted any.  ** 
10360 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74  instructions yet
10370 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e  , leave the main
10380 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
10390 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68  information unch
103a0 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  anged..  */.  if
103b0 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
103c0 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67    if( p->zErrMsg
103d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
103e0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
103f0 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oc();.      sqli
10400 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
10410 62 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45  b->pErr,-1,p->zE
10420 72 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46  rrMsg,SQLITE_UTF
10430 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  8,SQLITE_TRANSIE
10440 4e 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  NT);.      sqlit
10450 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
10460 63 28 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65  c();.      db->e
10470 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a  rrCode = p->rc;.
10480 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
10490 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
104a0 73 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45  sg);.      p->zE
104b0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d  rrMsg = 0;.    }
104c0 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29  else if( p->rc )
104d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
104e0 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20  rror(db, p->rc, 
104f0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
10500 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10510 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  r(db, SQLITE_OK,
10520 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
10530 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20  se if( p->rc && 
10540 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20  p->expired ){.  
10550 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64    /* The expired
10560 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e   flag was set on
10570 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65   the VDBE before
10580 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a   the first call.
10590 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
105a0 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f  3_step(). For co
105b0 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65  nsistency (since
105c0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
105d0 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65  was.    ** calle
105e0 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  d), set the data
105f0 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68  base error in th
10600 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e  is case as well.
10610 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
10620 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e  te3Error(db, p->
10630 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rc, 0);.    sqli
10640 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
10650 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e  b->pErr, -1, p->
10660 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f  zErrMsg, SQLITE_
10670 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41  UTF8, SQLITE_TRA
10680 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
10690 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
106a0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
106b0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
106c0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69    }..  /* Reclai
106d0 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65  m all memory use
106e0 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20  d by the VDBE.  
106f0 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  */.  Cleanup(p);
10700 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66  ..  /* Save prof
10710 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iling informatio
10720 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45  n from this VDBE
10730 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65   run..  */.#ifde
10740 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
10750 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
10760 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
10770 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
10780 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
10790 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
107a0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
107b0 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
107c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
107d0 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
107e0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
107f0 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
10800 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
10810 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
10820 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
10830 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
10840 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
10850 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
10860 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c   "%6d %10lld %8l
10870 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ld ",.          
10880 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
10890 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
108a0 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
108b0 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
108c0 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
108d0 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
108e0 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
108f0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
10900 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
10910 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
10920 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
10930 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
10940 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
10950 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  dif.  p->magic =
10960 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
10970 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
10980 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
10990 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
109a0 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
109b0 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
109c0 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
109d0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
109e0 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
109f0 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
10a00 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
10a10 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
10a20 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
10a30 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
10a40 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
10a50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10a60 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
10a70 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
10a80 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
10a90 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
10aa0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
10ab0 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  beReset(p);.    
10ac0 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
10ad0 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
10ae0 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  c );.  }.  sqlit
10af0 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b  e3VdbeDelete(p);
10b00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10b10 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  ./*.** Call the 
10b20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65  destructor for e
10b30 61 63 68 20 61 75 78 64 61 74 61 20 65 6e 74 72  ach auxdata entr
10b40 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66  y in pVdbeFunc f
10b50 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20  or which.** the 
10b60 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
10b70 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65  t in mask is cle
10b80 61 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74  ar.  Auxdata ent
10b90 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a  ries beyond 31.*
10ba0 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64 65 73  * are always des
10bb0 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74  troyed.  To dest
10bc0 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20  roy all auxdata 
10bd0 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68  entries, call th
10be0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  is.** routine wi
10bf0 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76  th mask==0..*/.v
10c00 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
10c10 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62  eleteAuxData(Vdb
10c20 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63  eFunc *pVdbeFunc
10c30 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69  , int mask){.  i
10c40 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
10c50 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41   i<pVdbeFunc->nA
10c60 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  ux; i++){.    st
10c70 72 75 63 74 20 41 75 78 44 61 74 61 20 2a 70 41  ruct AuxData *pA
10c80 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d  ux = &pVdbeFunc-
10c90 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69  >apAux[i];.    i
10ca0 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61  f( (i>31 || !(ma
10cb0 73 6b 26 28 28 28 75 33 32 29 31 29 3c 3c 69 29  sk&(((u32)1)<<i)
10cc0 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78  )) && pAux->pAux
10cd0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41   ){.      if( pA
10ce0 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20  ux->xDelete ){. 
10cf0 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65         pAux->xDe
10d00 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29  lete(pAux->pAux)
10d10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10d20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a  pAux->pAux = 0;.
10d30 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
10d40 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
10d50 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
10d60 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
10d70 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
10d80 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
10d90 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
10da0 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
10db0 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d   p->db;.  if( p-
10dc0 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
10dd0 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
10de0 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->pNext;.  }els
10df0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
10e00 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20  b->pVdbe==p );. 
10e10 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70     db->pVdbe = p
10e20 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
10e30 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
10e40 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
10e50 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
10e60 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
10e70 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d  rray(p->aVar, p-
10e80 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73  >nVar);.  releas
10e90 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
10ea0 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
10eb0 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
10ec0 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  .  vdbeFreeOpArr
10ed0 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70  ay(db, p->aOp, p
10ee0 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65  ->nOp);.  sqlite
10ef0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
10f00 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  Label);.  sqlite
10f10 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
10f20 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ColName);.  sqli
10f30 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
10f40 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61 67  >zSql);.  p->mag
10f50 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
10f60 44 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 33 44  DEAD;.  sqlite3D
10f70 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72  bFree(db, p->pFr
10f80 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ee);.  sqlite3Db
10f90 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
10fa0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
10fb0 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20  the cursor p is 
10fc0 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72  ready to read or
10fd0 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74   write the row t
10fe0 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61  o which it.** wa
10ff0 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65  s last positione
11000 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  d.  Return an er
11010 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f  ror code if an O
11020 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20  OM fault or I/O 
11030 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74  error.** prevent
11040 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69  s us from positi
11050 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  oning the cursor
11060 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
11070 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  position..**.** 
11080 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72  If a MoveTo oper
11090 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67  ation is pending
110a0 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75   on the given cu
110b0 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68  rsor, then do th
110c0 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77  at.** MoveTo now
110d0 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73  .  If no move is
110e0 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20   pending, check 
110f0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f  to see if the ro
11100 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65  w has been.** de
11110 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
11120 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20  nder the cursor 
11130 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d  and if it has, m
11140 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a  ark the row as.*
11150 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a  * a NULL row..**
11160 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f  .** If the curso
11170 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69  r is already poi
11180 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72  nting to the cor
11190 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61  rect row and tha
111a0 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74  t row has.** not
111b0 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
111c0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
111d0 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68   cursor, then th
111e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
111f0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
11200 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
11210 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
11220 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64   *p){.  if( p->d
11230 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
11240 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63  .    int res, rc
11250 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
11260 54 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20  TEST.    extern 
11270 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
11280 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  ch_count;.#endif
11290 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
112a0 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72  isTable );.    r
112b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
112c0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
112d0 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  ->pCursor, 0, p-
112e0 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
112f0 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
11300 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
11310 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69  .    p->lastRowi
11320 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72  d = p->movetoTar
11330 67 65 74 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69  get;.    p->rowi
11340 64 49 73 56 61 6c 69 64 20 3d 20 41 4c 57 41 59  dIsValid = ALWAY
11350 53 28 72 65 73 3d 3d 30 29 20 3f 31 3a 30 3b 0a  S(res==0) ?1:0;.
11360 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 72 65      if( NEVER(re
11370 73 3c 30 29 20 29 7b 0a 20 20 20 20 20 20 72 63  s<0) ){.      rc
11380 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
11390 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ext(p->pCursor, 
113a0 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28  &res);.      if(
113b0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
113c0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
113d0 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71  LITE_TEST.    sq
113e0 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
113f0 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  nt++;.#endif.   
11400 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
11410 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63  to = 0;.    p->c
11420 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
11430 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73  HE_STALE;.  }els
11440 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 2d 3e  e if( ALWAYS(p->
11450 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
11460 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20  int hasMoved;.  
11470 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
11480 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
11490 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  Moved(p->pCursor
114a0 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20  , &hasMoved);.  
114b0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
114c0 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61  n rc;.    if( ha
114d0 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20  sMoved ){.      
114e0 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
114f0 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
11500 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d      p->nullRow =
11510 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
11520 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11530 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
11540 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
11550 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ns:.**.** sqlite
11560 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
11570 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
11580 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a  SerialTypeLen().
11590 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
115a0 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  rialLen().** sql
115b0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
115c0 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  t().** sqlite3Vd
115d0 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a  beSerialGet().**
115e0 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
115f0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
11600 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
11610 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
11620 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
11630 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
11640 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
11650 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
11660 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
11670 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
11680 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
11690 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
116a0 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
116b0 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
116c0 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
116d0 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
116e0 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
116f0 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
11700 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
11710 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
11720 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
11730 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
11740 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
11750 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
11760 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
11770 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
11780 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
11790 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
117a0 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
117b0 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
117c0 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
117d0 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
117e0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
117f0 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
11800 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65  d data blob sepe
11810 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
11820 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
11830 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
11840 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
11850 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
11860 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
11870 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
11880 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
11890 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
118a0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
118b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
118c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
118d0 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
118f0 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
11900 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
11910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
11920 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
11930 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
11940 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
11950 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
11960 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
11970 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
119a0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
119b0 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
119c0 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
119d0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
119e0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
119f0 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
11a00 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
11a10 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
11a20 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a40 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
11a50 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
11a60 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
11a70 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
11a80 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
11a90 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
11aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ab0 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
11ac0 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
11ad0 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
11af0 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
11b00 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
11b10 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
11b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b30 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
11b40 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
11b50 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
11b60 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
11b70 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
11b80 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
11b90 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
11ba0 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
11bb0 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
11bc0 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
11bd0 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
11be0 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
11bf0 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
11c00 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
11c10 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
11c20 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
11c30 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
11c40 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
11c50 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
11c60 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
11c70 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
11c80 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
11c90 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
11ca0 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20  _format){.  int 
11cb0 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c  flags = pMem->fl
11cc0 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20  ags;.  int n;.. 
11cd0 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
11ce0 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
11cf0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 0;.  }.  if( f
11d00 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a  lags&MEM_Int ){.
11d10 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
11d20 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65  t whether to use
11d30 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38   1, 2, 4, 6 or 8
11d40 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64   bytes. */.#   d
11d50 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20  efine MAX_6BYTE 
11d60 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30  ((((i64)0x000080
11d70 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20  00)<<32)-1).    
11d80 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e  i64 i = pMem->u.
11d90 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20  i;.    u64 u;.  
11da0 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61    if( file_forma
11db0 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69  t>=4 && (i&1)==i
11dc0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
11dd0 20 38 2b 28 75 33 32 29 69 3b 0a 20 20 20 20 7d   8+(u32)i;.    }
11de0 0a 20 20 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d  .    u = i<0 ? -
11df0 69 20 3a 20 69 3b 0a 20 20 20 20 69 66 28 20 75  i : i;.    if( u
11e00 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 31  <=127 ) return 1
11e10 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37  ;.    if( u<=327
11e20 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  67 ) return 2;. 
11e30 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30     if( u<=838860
11e40 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20  7 ) return 3;.  
11e50 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33    if( u<=2147483
11e60 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a  647 ) return 4;.
11e70 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
11e80 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b  BYTE ) return 5;
11e90 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20  .    return 6;. 
11ea0 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
11eb0 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72  EM_Real ){.    r
11ec0 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
11ed0 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d  ssert( pMem->db-
11ee0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
11ef0 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
11f00 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e  MEM_Blob) );.  n
11f10 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66   = pMem->n;.  if
11f20 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
11f30 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
11f40 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
11f50 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30  }.  assert( n>=0
11f60 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e   );.  return ((n
11f70 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61  *2) + 12 + ((fla
11f80 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29  gs&MEM_Str)!=0))
11f90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
11fa0 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
11fb0 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
11fc0 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
11fd0 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
11fe0 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  pe..*/.u32 sqlit
11ff0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
12000 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
12010 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
12020 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
12030 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61     return (seria
12040 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
12050 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69  }else{.    stati
12060 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65  c const u8 aSize
12070 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20  [] = { 0, 1, 2, 
12080 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30  3, 4, 6, 8, 8, 0
12090 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20  , 0, 0, 0 };.   
120a0 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65   return aSize[se
120b0 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a  rial_type];.  }.
120c0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
120d0 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65  re on an archite
120e0 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64  cture with mixed
120f0 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67  -endian floating
12100 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a   .** points (ex:
12110 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70   ARM7) then swap
12120 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74   the lower 4 byt
12130 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20  es with the .** 
12140 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20  upper 4 bytes.  
12150 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
12160 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73  t..**.** For mos
12170 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  t architectures,
12180 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
12190 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a  ..**.** (later):
121a0 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64    It is reported
121b0 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20   to me that the 
121c0 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f  mixed-endian pro
121d0 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20  blem.** on ARM7 
121e0 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68  is an issue with
121f0 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74   GCC, not with t
12200 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49  he ARM7 chip.  I
12210 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20  t seems.** that 
12220 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f  early versions o
12230 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65  f GCC stored the
12240 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20   two words of a 
12250 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20  64-bit.** float 
12260 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64  in the wrong ord
12270 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72  er.  And that er
12280 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ror has been pro
12290 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20  pagated.** ever 
122a0 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d  since.  The blam
122b0 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
122c0 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74  rily with GCC, t
122d0 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69  hough..** GCC mi
122e0 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f  ght have just co
122f0 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  pying the proble
12300 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  m from a prior c
12310 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d  ompiler..** I am
12320 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20   also told that 
12330 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
12340 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f  f GCC that follo
12350 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  w a different.**
12360 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74   ABI get the byt
12370 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a  e order right..*
12380 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20  *.** Developers 
12390 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20  using SQLite on 
123a0 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63  an ARM7 should c
123b0 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74  ompile and run t
123c0 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74  heir.** applicat
123d0 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ion using -DSQLI
123e0 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65  TE_DEBUG=1 at le
123f0 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20  ast once.  With 
12400 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64  DEBUG.** enabled
12410 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62  , some asserts b
12420 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65  elow will ensure
12430 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f   that the byte o
12440 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74  rder of.** float
12450 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
12460 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a   is correct..**.
12470 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20  ** (2007-08-30) 
12480 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20   Frank van Vugt 
12490 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73  has studied this
124a0 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79   problem closely
124b0 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64  .** and has send
124c0 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f   his findings to
124d0 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65   the SQLite deve
124e0 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a  lopers.  Frank.*
124f0 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f  * writes that so
12500 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73  me Linux kernels
12510 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20   offer floating 
12520 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a  point hardware.*
12530 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74  * emulation that
12540 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69   uses only 32-bi
12550 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74  t mantissas inst
12560 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a  ead of a full .*
12570 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71  * 48-bits as req
12580 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45  uired by the IEE
12590 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68  E standard.  (Th
125a0 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e  is is the.** CON
125b0 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20  FIG_FPE_FASTFPE 
125c0 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63  option.)  On suc
125d0 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74  h systems, float
125e0 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74  ing point.** byt
125f0 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d  e swapping becom
12600 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61  es very complica
12610 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70  ted.  To avoid p
12620 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20  roblems,.** the 
12630 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73  necessary byte s
12640 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69  wapping is carri
12650 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36  ed out using a 6
12660 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
12670 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36   rather than a 6
12680 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72  4-bit float.  Fr
12690 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74  ank assures us t
126a0 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  hat the code her
126b0 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68  e.** works for h
126c0 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76  im.  We, the dev
126d0 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f  elopers, have no
126e0 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64   way to independ
126f0 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20  ently.** verify 
12700 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20  this, but Frank 
12710 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68  seems to know wh
12720 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67  at he is talking
12730 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20   about.** so we 
12740 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69  trust him..*/.#i
12750 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  fdef SQLITE_MIXE
12760 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
12770 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20  LOAT.static u64 
12780 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e  floatSwap(u64 in
12790 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  ){.  union {.   
127a0 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20   u64 r;.    u32 
127b0 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  i[2];.  } u;.  u
127c0 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69  32 t;..  u.r = i
127d0 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b  n;.  t = u.i[0];
127e0 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b  .  u.i[0] = u.i[
127f0 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74  1];.  u.i[1] = t
12800 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a  ;.  return u.r;.
12810 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  }.# define swapM
12820 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
12830 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61  X)  X = floatSwa
12840 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  p(X).#else.# def
12850 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
12860 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64  ianFloat(X).#end
12870 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
12880 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64  the serialized d
12890 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65  ata blob for the
128a0 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
128b0 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62   pMem into .** b
128c0 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  uf. It is assume
128d0 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
128e0 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  r has allocated 
128f0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
12900 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
12910 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
12920 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e  written..**.** n
12930 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  Buf is the amoun
12940 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20  t of space left 
12950 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20  in buf[].  nBuf 
12960 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a  must always be.*
12970 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  * large enough t
12980 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72  o hold the entir
12990 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74  e field.  Except
129a0 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20 69  , if the field i
129b0 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68  s.** a blob with
129c0 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74   a zero-filled t
129d0 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20  ail, then buf[] 
129e0 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74 68  might be just th
129f0 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20  e right.** size 
12a00 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69  to hold everythi
12a10 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74 68  ng except for th
12a20 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
12a30 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a  il.  If buf[].**
12a40 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f   is only big eno
12a50 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
12a60 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c  non-zero prefix,
12a70 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65   then only write
12a80 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20   that.** prefix 
12a90 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74  into buf[].  But
12aa0 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72   if buf[] is lar
12ab0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ge enough to hol
12ac0 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72  d both the.** pr
12ad0 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61 69  efix and the tai
12ae0 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  l then write the
12af0 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74 20   prefix and set 
12b00 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a  the tail to all.
12b10 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20  ** zeros..**.** 
12b20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
12b30 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
12b40 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  lly written into
12b50 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d   buf[].  The num
12b60 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  ber.** of bytes 
12b70 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  in the zero-fill
12b80 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75  ed tail is inclu
12b90 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72  ded in the retur
12ba0 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20  n value only.** 
12bb0 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77  if those bytes w
12bc0 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75  ere zeroed in bu
12bd0 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c  f[]..*/ .u32 sql
12be0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
12bf0 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e  t(u8 *buf, int n
12c00 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Buf, Mem *pMem, 
12c10 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  int file_format)
12c20 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  {.  u32 serial_t
12c30 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ype = sqlite3Vdb
12c40 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d  eSerialType(pMem
12c50 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a  , file_format);.
12c60 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a    u32 len;..  /*
12c70 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61   Integer and Rea
12c80 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  l */.  if( seria
12c90 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72  l_type<=7 && ser
12ca0 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20  ial_type>0 ){.  
12cb0 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32    u64 v;.    u32
12cc0 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69   i;.    if( seri
12cd0 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
12ce0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
12cf0 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d  of(v)==sizeof(pM
12d00 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20  em->r) );.      
12d10 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d  memcpy(&v, &pMem
12d20 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b  ->r, sizeof(v));
12d30 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
12d40 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a  EndianFloat(v);.
12d50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12d60 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   v = pMem->u.i;.
12d70 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
12d80 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  i = sqlite3VdbeS
12d90 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
12da0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61  ial_type);.    a
12db0 73 73 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32  ssert( len<=(u32
12dc0 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69  )nBuf );.    whi
12dd0 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20  le( i-- ){.     
12de0 20 62 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76   buf[i] = (u8)(v
12df0 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20  &0xFF);.      v 
12e00 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20  >>= 8;.    }.   
12e10 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
12e20 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
12e30 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
12e40 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
12e50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
12e60 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
12e70 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
12e80 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a  )?pMem->u.nZero:
12e90 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
12ea0 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56  == (int)sqlite3V
12eb0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
12ec0 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
12ed0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
12ee0 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20  m->n<=nBuf );.  
12ef0 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
12f00 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c  .    memcpy(buf,
12f10 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a   pMem->z, len);.
12f20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
12f30 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
12f40 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70  {.      len += p
12f50 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
12f60 20 20 20 20 61 73 73 65 72 74 28 20 6e 42 75 66      assert( nBuf
12f70 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
12f80 20 6c 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66   len > (u32)nBuf
12f90 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20   ){.        len 
12fa0 3d 20 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20  = (u32)nBuf;.   
12fb0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
12fc0 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c  t(&buf[pMem->n],
12fd0 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29   0, len-pMem->n)
12fe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
12ff0 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
13000 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61  * NULL or consta
13010 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20  nts 0 or 1 */.  
13020 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
13030 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
13040 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
13050 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
13060 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
13070 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
13080 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
13090 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
130a0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
130b0 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20   bytes read..*/ 
130c0 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
130d0 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
130e0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
130f0 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
13100 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
13110 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
13120 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
13130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
13140 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
13150 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
13160 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
13170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13180 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
13190 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
131a0 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
131b0 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
131c0 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a     case 10:   /*
131d0 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
131e0 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
131f0 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65  case 11:   /* Re
13200 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
13210 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
13220 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20  e 0: {  /* NULL 
13230 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  */.      pMem->f
13240 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
13250 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13260 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20    }.    case 1: 
13270 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
13280 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
13290 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
132a0 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
132b0 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [0];.      pMem-
132c0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
132d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
132e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
132f0 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
13300 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
13310 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
13320 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  i = (((signed ch
13330 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c  ar)buf[0])<<8) |
13340 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70   buf[1];.      p
13350 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
13360 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
13370 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 2;.    }.    
13380 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
13390 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
133a0 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
133b0 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65  ->u.i = (((signe
133c0 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
133d0 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38  16) | (buf[1]<<8
133e0 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20  ) | buf[2];.    
133f0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
13400 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
13410 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20  eturn 3;.    }. 
13420 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
13430 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
13440 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
13450 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b  Mem->u.i = (buf[
13460 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31  0]<<24) | (buf[1
13470 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d  ]<<16) | (buf[2]
13480 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20  <<8) | buf[3];. 
13490 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
134a0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
134b0 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
134c0 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
134d0 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
134e0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
134f0 20 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67    u64 x = (((sig
13500 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
13510 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20  <<8) | buf[1];. 
13520 20 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75       u32 y = (bu
13530 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[2]<<24) | (buf
13540 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [3]<<16) | (buf[
13550 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b  4]<<8) | buf[5];
13560 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
13570 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d  2) | y;.      pM
13580 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
13590 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )&x;.      pMem-
135a0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
135b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
135c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
135d0 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
135e0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
135f0 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
13600 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
13610 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
13620 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32  u64 x;.      u32
13630 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   y;.#if !defined
13640 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66  (NDEBUG) && !def
13650 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
13660 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
13670 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79  .      /* Verify
13680 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61   that integers a
13690 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  nd floating poin
136a0 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65  t values use the
136b0 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62   same.      ** b
136c0 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20  yte order.  Or, 
136d0 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d  that if SQLITE_M
136e0 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
136f0 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20  T_FLOAT is.     
13700 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74   ** defined that
13710 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
13720 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65   point values re
13730 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20  ally are mixed. 
13740 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a       ** endian..
13750 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
13760 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20  tatic const u64 
13770 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66  t1 = ((u64)0x3ff
13780 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20  00000)<<32;.    
13790 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64    static const d
137a0 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a  ouble r1 = 1.0;.
137b0 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74        u64 t2 = t
137c0 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  1;.      swapMix
137d0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32  edEndianFloat(t2
137e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
137f0 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a   sizeof(r1)==siz
13800 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d  eof(t2) && memcm
13810 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65  p(&r1, &t2, size
13820 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65  of(r1))==0 );.#e
13830 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20  ndif..      x = 
13840 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
13850 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
13860 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
13870 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62  3];.      y = (b
13880 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[4]<<24) | (bu
13890 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[5]<<16) | (buf
138a0 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d  [6]<<8) | buf[7]
138b0 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
138c0 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69  32) | y;.      i
138d0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
138e0 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  6 ){.        pMe
138f0 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
13900 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  &x;.        pMem
13910 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
13920 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
13930 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13940 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
13950 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d  sizeof(pMem->r)=
13960 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77  =8 );.        sw
13970 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
13980 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d  at(x);.        m
13990 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20  emcpy(&pMem->r, 
139a0 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
139b0 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
139c0 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e  ags = sqlite3IsN
139d0 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45  aN(pMem->r) ? ME
139e0 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61  M_Null : MEM_Rea
139f0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
13a00 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d   return 8;.    }
13a10 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20  .    case 8:    
13a20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a  /* Integer 0 */.
13a30 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f      case 9: {  /
13a40 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20  * Integer 1 */. 
13a50 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
13a60 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a   serial_type-8;.
13a70 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
13a80 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
13a90 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
13aa0 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
13ab0 7b 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20  {.      u32 len 
13ac0 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
13ad0 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d  2)/2;.      pMem
13ae0 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
13af0 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
13b00 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d   = len;.      pM
13b10 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20  em->xDel = 0;.  
13b20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
13b30 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20  ype&0x01 ){.    
13b40 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
13b50 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f  = MEM_Str | MEM_
13b60 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  Ephem;.      }el
13b70 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  se{.        pMem
13b80 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c  ->flags = MEM_Bl
13b90 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a  ob | MEM_Ephem;.
13ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
13bb0 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a  turn len;.    }.
13bc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
13bd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  }.../*.** Given 
13be0 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e  the nKey-byte en
13bf0 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f  coding of a reco
13c00 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61  rd in pKey[], pa
13c10 72 73 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  rse the.** recor
13c20 64 20 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65  d into a Unpacke
13c30 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
13c40 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  e.  Return a poi
13c50 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20  nter to.** that 
13c60 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
13c70 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
13c80 63 74 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76  ction might prov
13c90 69 64 65 20 73 7a 53 70 61 63 65 20 62 79 74 65  ide szSpace byte
13ca0 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73  s of memory.** s
13cb0 70 61 63 65 20 61 74 20 70 53 70 61 63 65 2e 20  pace at pSpace. 
13cc0 20 54 68 69 73 20 73 70 61 63 65 20 63 61 6e 20   This space can 
13cd0 62 65 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20  be used to hold 
13ce0 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
13cf0 56 44 62 65 50 61 72 73 65 64 52 65 63 6f 72 64  VDbeParsedRecord
13d00 20 73 74 72 75 63 74 75 72 65 20 69 66 20 69 74   structure if it
13d10 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
13d20 2e 20 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e  .  If it is.** n
13d30 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 2c 20 73  ot big enough, s
13d40 70 61 63 65 20 69 73 20 6f 62 74 61 69 6e 65 64  pace is obtained
13d50 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
13d60 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  lloc()..**.** Th
13d70 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 75 63  e returned struc
13d80 74 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 63  ture should be c
13d90 6c 6f 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20  losed by a call 
13da0 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  to.** sqlite3Vdb
13db0 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
13dc0 65 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70  ecord()..*/ .Unp
13dd0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c  ackedRecord *sql
13de0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
13df0 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20  pack(.  KeyInfo 
13e00 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f  *pKeyInfo,     /
13e10 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
13e20 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66  out the record f
13e30 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ormat */.  int n
13e40 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
13e50 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
13e60 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
13e70 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
13e80 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
13e90 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
13ea0 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63  */.  char *pSpac
13eb0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  e,          /* U
13ec0 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61  naligned space a
13ed0 76 61 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64  vailable to hold
13ee0 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
13ef0 20 69 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20   int szSpace    
13f00 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
13f10 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62  of pSpace[] in b
13f20 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ytes */.){.  con
13f30 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
13f40 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
13f50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
13f60 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64  pKey;.  Unpacked
13f70 52 65 63 6f 72 64 20 2a 70 3b 20 20 2f 2a 20 54  Record *p;  /* T
13f80 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f  he unpacked reco
13f90 72 64 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  rd that we will 
13fa0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
13fb0 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
13fc0 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20  /* Memory space 
13fd0 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 70  needed to hold p
13fe0 2c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  , in bytes */.  
13ff0 69 6e 74 20 64 3b 0a 20 20 75 33 32 20 69 64 78  int d;.  u32 idx
14000 3b 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20  ;.  u16 u;      
14010 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
14020 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
14030 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   */.  u32 szHdr;
14040 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20  .  Mem *pMem;.  
14050 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20  int nOff;       
14060 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20      /* Increase 
14070 70 53 70 61 63 65 20 62 79 20 74 68 69 73 20 6d  pSpace by this m
14080 75 63 68 20 74 6f 20 38 2d 62 79 74 65 20 61 6c  uch to 8-byte al
14090 69 67 6e 20 69 74 20 2a 2f 0a 20 20 0a 20 20 2f  ign it */.  .  /
140a0 2a 0a 20 20 2a 2a 20 57 65 20 77 61 6e 74 20 74  *.  ** We want t
140b0 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e  o shift the poin
140c0 74 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75  ter pSpace up su
140d0 63 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d  ch that it is 8-
140e0 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20  byte aligned..  
140f0 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64  ** Thus, we need
14100 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20   to calculate a 
14110 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74  value, nOff, bet
14120 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f  ween 0 and 7, to
14130 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20   shift .  ** it 
14140 62 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69  by.  If pSpace i
14150 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65  s already 8-byte
14160 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73   aligned, nOff s
14170 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20  hould be zero.. 
14180 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20   */.  nOff = (8 
14190 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  - (SQLITE_PTR_TO
141a0 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37  _INT(pSpace) & 7
141b0 29 29 20 26 20 37 3b 0a 20 20 70 53 70 61 63 65  )) & 7;.  pSpace
141c0 20 2b 3d 20 6e 4f 66 66 3b 0a 20 20 73 7a 53 70   += nOff;.  szSp
141d0 61 63 65 20 2d 3d 20 6e 4f 66 66 3b 0a 20 20 6e  ace -= nOff;.  n
141e0 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
141f0 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63  zeof(UnpackedRec
14200 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d  ord)) + sizeof(M
14210 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e  em)*(pKeyInfo->n
14220 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20  Field+1);.  if( 
14230 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b  nByte>szSpace ){
14240 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
14250 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79  DbMallocRaw(pKey
14260 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29  Info->db, nByte)
14270 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
14280 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
14290 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b  ->flags = UNPACK
142a0 45 44 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20 55  ED_NEED_FREE | U
142b0 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53  NPACKED_NEED_DES
142c0 54 52 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TROY;.  }else{. 
142d0 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64     p = (Unpacked
142e0 52 65 63 6f 72 64 2a 29 70 53 70 61 63 65 3b 0a  Record*)pSpace;.
142f0 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55      p->flags = U
14300 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53  NPACKED_NEED_DES
14310 54 52 4f 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  TROY;.  }.  p->p
14320 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
14330 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20  fo;.  p->nField 
14340 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  = pKeyInfo->nFie
14350 6c 64 20 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65  ld + 1;.  p->aMe
14360 6d 20 3d 20 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a  m = pMem = (Mem*
14370 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55  )&((char*)p)[ROU
14380 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
14390 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20  kedRecord))];.  
143a0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
143b0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65  TE_ALIGNMENT(pMe
143c0 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65  m) );.  idx = ge
143d0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
143e0 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a  szHdr);.  d = sz
143f0 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20  Hdr;.  u = 0;.  
14400 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
14410 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20   && u<p->nField 
14420 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20  && d<=nKey ){.  
14430 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
14440 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67  e;..    idx += g
14450 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
14460 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79  [idx], serial_ty
14470 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  pe);.    pMem->e
14480 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
14490 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62  nc;.    pMem->db
144a0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
144b0 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
144c0 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e   = 0;.    pMem->
144d0 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
144e0 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62   d += sqlite3Vdb
144f0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
14500 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [d], serial_type
14510 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65  , pMem);.    pMe
14520 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20 20  m++;.    u++;.  
14530 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70  }.  assert( u<=p
14540 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
14550 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65  + 1 );.  p->nFie
14560 6c 64 20 3d 20 75 3b 0a 20 20 72 65 74 75 72 6e  ld = u;.  return
14570 20 28 76 6f 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a   (void*)p;.}../*
14580 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14590 20 64 65 73 74 72 6f 79 73 20 61 20 55 6e 70 61   destroys a Unpa
145a0 63 6b 65 64 52 65 63 6f 72 64 20 6f 62 6a 65 63  ckedRecord objec
145b0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
145c0 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61  e3VdbeDeleteUnpa
145d0 63 6b 65 64 52 65 63 6f 72 64 28 55 6e 70 61 63  ckedRecord(Unpac
145e0 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  kedRecord *p){. 
145f0 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 70   int i;.  Mem *p
14600 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Mem;..  assert( 
14610 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
14620 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ( p->flags & UNP
14630 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52  ACKED_NEED_DESTR
14640 4f 59 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  OY );.  for(i=0,
14650 20 70 4d 65 6d 3d 70 2d 3e 61 4d 65 6d 3b 20 69   pMem=p->aMem; i
14660 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 2c  <p->nField; i++,
14670 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 2f 2a   pMem++){.    /*
14680 20 54 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65   The unpacked re
14690 63 6f 72 64 20 69 73 20 61 6c 77 61 79 73 20 63  cord is always c
146a0 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68  onstructed by th
146b0 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
146c0 56 64 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64  VdbeUnpackRecord
146d0 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76  () function abov
146e0 65 2c 20 77 68 69 63 68 20 6d 61 6b 65 73 20 61  e, which makes a
146f0 6c 6c 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67  ll.    ** string
14700 73 20 61 6e 64 20 62 6c 6f 62 73 20 73 74 61 74  s and blobs stat
14710 69 63 2e 20 20 41 6e 64 20 6e 6f 6e 65 20 6f 66  ic.  And none of
14720 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 61 72   the elements ar
14730 65 0a 20 20 20 20 2a 2a 20 65 76 65 72 20 74 72  e.    ** ever tr
14740 61 6e 73 66 6f 72 6d 65 64 2c 20 73 6f 20 74 68  ansformed, so th
14750 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79  ere is never any
14760 74 68 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 2e  thing to delete.
14770 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14780 4e 45 56 45 52 28 70 4d 65 6d 2d 3e 7a 4d 61 6c  NEVER(pMem->zMal
14790 6c 6f 63 29 20 29 20 73 71 6c 69 74 65 33 56 64  loc) ) sqlite3Vd
147a0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65  beMemRelease(pMe
147b0 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  m);.  }.  if( p-
147c0 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
147d0 44 5f 4e 45 45 44 5f 46 52 45 45 20 29 7b 0a 20  D_NEED_FREE ){. 
147e0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
147f0 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  (p->pKeyInfo->db
14800 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
14810 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
14820 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77   compares the tw
14830 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20  o table rows or 
14840 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a  index records.**
14850 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e   specified by {n
14860 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64  Key1, pKey1} and
14870 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74   pPKey2.  It ret
14880 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c  urns a negative,
14890 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
148a0 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20  tive integer if 
148b0 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
148c0 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a  n, equal to or .
148d0 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
148e0 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79  key2.  The {nKey
148f0 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75  1, pKey1} key mu
14900 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20  st be a blob.** 
14910 63 72 65 61 74 65 64 20 62 79 20 74 68 20 4f 50  created by th OP
14920 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
14930 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20  de of the VDBE. 
14940 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b   The pPKey2.** k
14950 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72  ey must be a par
14960 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20  sed key such as 
14970 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
14980 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73   sqlite3VdbePars
14990 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b  eRecord..**.** K
149a0 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20  ey1 and Key2 do 
149b0 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74  not have to cont
149c0 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ain the same num
149d0 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a  ber of fields..*
149e0 2a 20 54 68 65 20 6b 65 79 20 77 69 74 68 20 66  * The key with f
149f0 65 77 65 72 20 66 69 65 6c 64 73 20 69 73 20 75  ewer fields is u
14a00 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20  sually compares 
14a10 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a 2a  less than the .*
14a20 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48  * longer key.  H
14a30 6f 77 65 76 65 72 20 69 66 20 74 68 65 20 55 4e  owever if the UN
14a40 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66  PACKED_INCRKEY f
14a50 6c 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20 69  lags in pPKey2 i
14a60 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65  s set.** and the
14a70 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73   common prefixes
14a80 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e   are equal, then
14a90 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
14aa0 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69  an key2..** Or i
14ab0 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d  f the UNPACKED_M
14ac0 41 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61 67  ATCH_PREFIX flag
14ad0 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20   is set and the 
14ae0 70 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a 20  prefixes are.** 
14af0 65 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20  equal, then the 
14b00 6b 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64 65  keys are conside
14b10 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 20  red to be equal 
14b20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74 73  and.** the parts
14b30 20 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d   beyond the comm
14b40 6f 6e 20 70 72 65 66 69 78 20 61 72 65 20 69 67  on prefix are ig
14b50 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
14b60 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e  the UNPACKED_IGN
14b70 4f 52 45 5f 52 4f 57 49 44 20 66 6c 61 67 20 69  ORE_ROWID flag i
14b80 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
14b90 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20  last byte of.** 
14ba0 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 70 4b  the header of pK
14bb0 65 79 31 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ey1 is ignored. 
14bc0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
14bd0 68 61 74 20 70 4b 65 79 31 20 69 73 0a 2a 2a 20  hat pKey1 is.** 
14be0 61 6e 20 69 6e 64 65 78 20 6b 65 79 2c 20 61 6e  an index key, an
14bf0 64 20 74 68 75 73 20 65 6e 64 73 20 77 69 74 68  d thus ends with
14c00 20 61 20 72 6f 77 69 64 20 76 61 6c 75 65 2e 20   a rowid value. 
14c10 20 54 68 65 20 6c 61 73 74 20 62 79 74 65 0a 2a   The last byte.*
14c20 2a 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  * of the header 
14c30 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62  will therefore b
14c40 65 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  e the serial typ
14c50 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 3a 0a  e of the rowid:.
14c60 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c 20 32 2c 20  ** one of 1, 2, 
14c70 33 2c 20 34 2c 20 35 2c 20 36 2c 20 38 2c 20 6f  3, 4, 5, 6, 8, o
14c80 72 20 39 20 2d 20 74 68 65 20 69 6e 74 65 67 65  r 9 - the intege
14c90 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a  r serial types..
14ca0 2a 2a 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  ** The serial ty
14cb0 70 65 20 6f 66 20 74 68 65 20 66 69 6e 61 6c 20  pe of the final 
14cc0 72 6f 77 69 64 20 77 69 6c 6c 20 61 6c 77 61 79  rowid will alway
14cd0 73 20 62 65 20 61 20 73 69 6e 67 6c 65 20 62 79  s be a single by
14ce0 74 65 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f 72 69  te..** By ignori
14cf0 6e 67 20 74 68 69 73 20 6c 61 73 74 20 62 79 74  ng this last byt
14d00 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2c  e of the header,
14d10 20 77 65 20 66 6f 72 63 65 20 74 68 65 20 63 6f   we force the co
14d20 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f 20 69  mparison.** to i
14d30 67 6e 6f 72 65 20 74 68 65 20 72 6f 77 69 64 20  gnore the rowid 
14d40 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 6b 65  at the end of ke
14d50 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  y1..*/.int sqlit
14d60 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
14d70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  are(.  int nKey1
14d80 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
14d90 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
14da0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
14db0 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
14dc0 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
14dd0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31 3b   */.){.  int d1;
14de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
14df0 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
14e00 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65  ] of next data e
14e10 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
14e20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f  idx1;          /
14e30 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
14e40 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61  ey[] of next hea
14e50 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  der element */. 
14e60 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20   u32 szHdr1;    
14e70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
14e80 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72   bytes in header
14e90 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   */.  int i = 0;
14ea0 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20  .  int nField;. 
14eb0 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
14ec0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
14ed0 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
14ee0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
14ef0 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49   *)pKey1;.  KeyI
14f00 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
14f10 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b   Mem mem1;..  pK
14f20 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
14f30 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d  >pKeyInfo;.  mem
14f40 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
14f50 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62  ->enc;.  mem1.db
14f60 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
14f70 0a 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20  .  mem1.flags = 
14f80 30 3b 0a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20  0;.  mem1.u.i = 
14f90 30 3b 20 20 2f 2a 20 6e 6f 74 20 6e 65 65 64 65  0;  /* not neede
14fa0 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e  d, here to silen
14fb0 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  ce compiler warn
14fc0 69 6e 67 20 2a 2f 0a 20 20 6d 65 6d 31 2e 7a 4d  ing */.  mem1.zM
14fd0 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 0a 20 20  alloc = 0;.  .  
14fe0 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74  idx1 = getVarint
14ff0 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31  32(aKey1, szHdr1
15000 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31  );.  d1 = szHdr1
15010 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e  ;.  if( pPKey2->
15020 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
15030 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29 7b  _IGNORE_ROWID ){
15040 0a 20 20 20 20 73 7a 48 64 72 31 2d 2d 3b 0a 20  .    szHdr1--;. 
15050 20 7d 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b   }.  nField = pK
15060 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a  eyInfo->nField;.
15070 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a    while( idx1<sz
15080 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32  Hdr1 && i<pPKey2
15090 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  ->nField ){.    
150a0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31  u32 serial_type1
150b0 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
150c0 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
150d0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
150e0 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
150f0 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d  . */.    idx1 +=
15100 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b   getVarint32( aK
15110 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c  ey1+idx1, serial
15120 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66  _type1 );.    if
15130 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73  ( d1>=nKey1 && s
15140 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15150 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
15160 79 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b  ype1)>0 ) break;
15170 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74  ..    /* Extract
15180 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62   the values to b
15190 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20  e compared..    
151a0 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  */.    d1 += sql
151b0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
151c0 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
151d0 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d  rial_type1, &mem
151e0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74  1);..    /* Do t
151f0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20  he comparison.  
15200 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
15210 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
15220 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e  &mem1, &pPKey2->
15230 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20  aMem[i],.       
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 20 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70      i<nField ? p
15260 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
15270 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ] : 0);.    if( 
15280 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  rc!=0 ){.      b
15290 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
152a0 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  i++;.  }..  /* N
152b0 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
152c0 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
152d0 20 6f 6e 20 6d 65 6d 31 2e 20 2a 2f 0a 20 20 69   on mem1. */.  i
152e0 66 28 20 4e 45 56 45 52 28 6d 65 6d 31 2e 7a 4d  f( NEVER(mem1.zM
152f0 61 6c 6c 6f 63 29 20 29 20 73 71 6c 69 74 65 33  alloc) ) sqlite3
15300 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
15310 6d 65 6d 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  mem1);..  /* If 
15320 74 68 65 20 50 52 45 46 49 58 5f 53 45 41 52 43  the PREFIX_SEARC
15330 48 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  H flag is set an
15340 64 20 61 6c 6c 20 66 69 65 6c 64 73 20 65 78 63  d all fields exc
15350 65 70 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20  ept the final.  
15360 2a 2a 20 72 6f 77 69 64 20 66 69 65 6c 64 20 77  ** rowid field w
15370 65 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  ere equal, then 
15380 63 6c 65 61 72 20 74 68 65 20 50 52 45 46 49 58  clear the PREFIX
15390 5f 53 45 41 52 43 48 20 66 6c 61 67 20 61 6e 64  _SEARCH flag and
153a0 20 73 65 74 20 0a 20 20 2a 2a 20 70 50 4b 65 79   set .  ** pPKey
153b0 32 2d 3e 72 6f 77 69 64 20 74 6f 20 74 68 65 20  2->rowid to the 
153c0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f 77  value of the row
153d0 69 64 20 66 69 65 6c 64 20 69 6e 20 28 70 4b 65  id field in (pKe
153e0 79 31 2c 20 6e 4b 65 79 31 29 2e 0a 20 20 2a 2a  y1, nKey1)..  **
153f0 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
15400 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65   the OP_IsUnique
15410 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20   opcode..  */.  
15420 69 66 28 20 28 70 50 4b 65 79 32 2d 3e 66 6c 61  if( (pPKey2->fla
15430 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs & UNPACKED_PR
15440 45 46 49 58 5f 53 45 41 52 43 48 29 20 26 26 20  EFIX_SEARCH) && 
15450 69 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e 46 69 65  i==(pPKey2->nFie
15460 6c 64 2d 31 29 20 29 7b 0a 20 20 20 20 61 73 73  ld-1) ){.    ass
15470 65 72 74 28 20 69 64 78 31 3d 3d 73 7a 48 64 72  ert( idx1==szHdr
15480 31 20 26 26 20 72 63 20 29 3b 0a 20 20 20 20 61  1 && rc );.    a
15490 73 73 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61 67  ssert( mem1.flag
154a0 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  s & MEM_Int );. 
154b0 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73     pPKey2->flags
154c0 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44 5f 50 52   &= ~UNPACKED_PR
154d0 45 46 49 58 5f 53 45 41 52 43 48 3b 0a 20 20 20  EFIX_SEARCH;.   
154e0 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 3d   pPKey2->rowid =
154f0 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 7d 0a 0a   mem1.u.i;.  }..
15500 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
15510 20 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65     /* rc==0 here
15520 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
15530 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
15540 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
15550 64 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65  d.    ** all the
15560 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
15570 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
15580 75 61 6c 2e 20 49 66 20 74 68 65 20 55 4e 50 41  ual. If the UNPA
15590 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a 20 20 20  CKED_INCRKEY.   
155a0 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c   ** flag is set,
155b0 20 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65 20   then break the 
155c0 74 69 65 20 62 79 20 74 72 65 61 74 69 6e 67 20  tie by treating 
155d0 6b 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e 0a  key2 as larger..
155e0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 55 50      ** If the UP
155f0 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54  ACKED_PREFIX_MAT
15600 43 48 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CH flag is set, 
15610 74 68 65 6e 20 6b 65 79 73 20 77 69 74 68 20 63  then keys with c
15620 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a 20  ommon prefixes. 
15630 20 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69 64     ** are consid
15640 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c  ered to be equal
15650 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  .  Otherwise, th
15660 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73 20  e longer key is 
15670 74 68 65 20 0a 20 20 20 20 2a 2a 20 6c 61 72 67  the .    ** larg
15680 65 72 2e 20 20 41 73 20 69 74 20 68 61 70 70 65  er.  As it happe
15690 6e 73 2c 20 74 68 65 20 70 50 4b 65 79 32 20 77  ns, the pPKey2 w
156a0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 68  ill always be th
156b0 65 20 6c 6f 6e 67 65 72 0a 20 20 20 20 2a 2a 20  e longer.    ** 
156c0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69  if there is a di
156d0 66 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2f  fference..    */
156e0 0a 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d  .    if( pPKey2-
156f0 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
15700 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20  D_INCRKEY ){.   
15710 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
15720 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32  }else if( pPKey2
15730 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
15740 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20  ED_PREFIX_MATCH 
15750 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61 76  ){.      /* Leav
15760 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 20 20 7d  e rc==0 */.    }
15770 65 6c 73 65 20 69 66 28 20 69 64 78 31 3c 73 7a  else if( idx1<sz
15780 48 64 72 31 20 29 7b 0a 20 20 20 20 20 20 72 63  Hdr1 ){.      rc
15790 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
157a0 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  lse if( pKeyInfo
157b0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20  ->aSortOrder && 
157c0 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  i<pKeyInfo->nFie
157d0 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ld.             
157e0 20 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61    && pKeyInfo->a
157f0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
15800 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20      rc = -rc;.  
15810 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
15820 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20  }. ../*.** pCur 
15830 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64  points at an ind
15840 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64  ex entry created
15850 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61   using the OP_Ma
15860 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
15870 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77  .** Read the row
15880 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65  id (the last fie
15890 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ld in the record
158a0 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69  ) and store it i
158b0 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74  n *rowid..** Ret
158c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
158d0 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
158e0 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  s, or an error c
158f0 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
15900 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20  *.** pCur might 
15910 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  be pointing to t
15920 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ext obtained fro
15930 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
15940 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f  base file..** So
15950 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e   the content can
15960 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
15970 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   Do appropriate 
15980 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f  checks on the co
15990 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ntent..*/.int sq
159a0 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
159b0 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42  d(sqlite3 *db, B
159c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
159d0 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
159e0 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
159f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
15a00 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
15a10 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
15a20 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
15a30 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
15a40 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
15a50 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
15a60 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
15a70 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
15a80 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
15a90 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
15aa0 4d 45 54 45 52 28 64 62 29 3b 0a 0a 20 20 2f 2a  METER(db);..  /*
15ab0 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   Get the size of
15ac0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
15ad0 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20  .  Only indices 
15ae0 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a  entries of less.
15af0 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61    ** than 2GiB a
15b00 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79  re support - any
15b10 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74  thing large must
15b20 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72   be database cor
15b30 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e  ruption..  ** An
15b40 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  y corruption is 
15b50 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69  detected in sqli
15b60 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
15b70 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20  lPtr(), though, 
15b80 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64  so.  ** this cod
15b90 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73  e can safely ass
15ba0 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65  ume that nCellKe
15bb0 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20  y is 32-bits  . 
15bc0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
15bd0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
15be0 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
15bf0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
15c00 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
15c10 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
15c20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
15c30 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20  TE_OK );     /* 
15c40 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76  pCur is always v
15c50 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20  alid so KeySize 
15c60 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20  cannot fail */. 
15c70 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b   assert( (nCellK
15c80 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ey & SQLITE_MAX_
15c90 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c  U32)==(u64)nCell
15ca0 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  Key );..  /* Rea
15cb0 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74  d in the complet
15cc0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
15cd0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a   index entry */.
15ce0 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20    memset(&m, 0, 
15cf0 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63  sizeof(m));.  rc
15d00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
15d10 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
15d20 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65   0, (int)nCellKe
15d30 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
15d40 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
15d50 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
15d60 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  The index entry 
15d70 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20  must begin with 
15d80 61 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f  a header size */
15d90 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69  .  (void)getVari
15da0 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73  nt32((u8*)m.z, s
15db0 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73  zHdr);.  testcas
15dc0 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20  e( szHdr==3 );. 
15dd0 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
15de0 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75  ==m.n );.  if( u
15df0 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20  nlikely(szHdr<3 
15e00 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e  || (int)szHdr>m.
15e10 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  n) ){.    goto i
15e20 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
15e30 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ion;.  }..  /* T
15e40 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66  he last field of
15e50 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c   the index shoul
15e60 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20  d be an integer 
15e70 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a  - the ROWID..  *
15e80 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
15e90 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61  e last entry rea
15ea0 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65  lly is an intege
15eb0 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  r. */.  (void)ge
15ec0 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26  tVarint32((u8*)&
15ed0 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79  m.z[szHdr-1], ty
15ee0 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74  peRowid);.  test
15ef0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
15f00 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =1 );.  testcase
15f10 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29  ( typeRowid==2 )
15f20 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
15f30 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20  peRowid==3 );.  
15f40 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
15f50 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74  wid==4 );.  test
15f60 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
15f70 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =5 );.  testcase
15f80 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29  ( typeRowid==6 )
15f90 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
15fa0 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20  peRowid==8 );.  
15fb0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
15fc0 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20  wid==9 );.  if( 
15fd0 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77  unlikely(typeRow
15fe0 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69  id<1 || typeRowi
15ff0 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d>9 || typeRowid
16000 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ==7) ){.    goto
16010 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
16020 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e  ption;.  }.  len
16030 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56  Rowid = sqlite3V
16040 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
16050 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74  (typeRowid);.  t
16060 65 73 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e  estcase( (u32)m.
16070 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  n==szHdr+lenRowi
16080 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  d );.  if( unlik
16090 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48  ely((u32)m.n<szH
160a0 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a  dr+lenRowid) ){.
160b0 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
160c0 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
160d0 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74   }..  /* Fetch t
160e0 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74  he integer off t
160f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
16100 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
16110 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
16120 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d  lGet((u8*)&m.z[m
16130 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79  .n-lenRowid], ty
16140 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20  peRowid, &v);.  
16150 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a  *rowid = v.u.i;.
16160 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
16170 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
16180 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16190 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
161a0 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72   if database cor
161b0 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
161c0 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20  ted after m has 
161d0 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  been.  ** alloca
161e0 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d  ted.  Free the m
161f0 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75   object and retu
16200 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
16210 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f  T. */.idx_rowid_
16220 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65  corruption:.  te
16230 73 74 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f  stcase( m.zMallo
16240 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  c!=0 );.  sqlite
16250 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
16260 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
16270 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
16280 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  T;.}../*.** Comp
16290 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74  are the key of t
162a0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74  he index entry t
162b0 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73  hat cursor pC is
162c0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61   pointing to aga
162d0 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20  inst.** the key 
162e0 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63  string in pUnpac
162f0 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  ked.  Write into
16300 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a   *pRes a number.
16310 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74  ** that is negat
16320 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
16330 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20  sitive if pC is 
16340 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
16350 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74   to,.** or great
16360 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65  er than pUnpacke
16370 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
16380 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
16390 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64  .**.** pUnpacked
163a0 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74   is either creat
163b0 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77  ed without a row
163c0 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74  id or is truncat
163d0 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  ed so that it.**
163e0 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64   omits the rowid
163f0 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
16400 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
16410 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
16420 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  entry.** is igno
16430 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65  red as well.  He
16440 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  nce, this routin
16450 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20  e only compares 
16460 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a  the prefixes .**
16470 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69   of the keys pri
16480 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20  or to the final 
16490 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65  rowid, not the e
164a0 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e  ntire key..*/.in
164b0 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
164c0 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 56 64  KeyCompare(.  Vd
164d0 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20  beCursor *pC,   
164e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
164f0 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61   cursor to compa
16500 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20  re against */.  
16510 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
16520 70 55 6e 70 61 63 6b 65 64 2c 20 20 2f 2a 20 55  pUnpacked,  /* U
16530 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20  npacked version 
16540 6f 66 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72  of key to compar
16550 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69  e against */.  i
16560 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
16570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
16580 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
16590 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
165a0 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
165b0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
165c0 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
165d0 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  Cur = pC->pCurso
165e0 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61  r;.  Mem m;..  a
165f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
16600 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
16610 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
16620 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
16630 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
16640 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
16650 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16660 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20  ;    /* pCur is 
16670 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
16680 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
16690 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c  ail */.  /* nCel
166a0 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73  lKey will always
166b0 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
166c0 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63  d 0xffffffff bec
166d0 61 75 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a  ause of the say.
166e0 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50    ** that btreeP
166f0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e  arseCellPtr() an
16700 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  d sqlite3GetVari
16710 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65  nt32() are imple
16720 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  mented */.  if( 
16730 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e  nCellKey<=0 || n
16740 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66  CellKey>0x7fffff
16750 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d  ff ){.    *res =
16760 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
16770 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
16780 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20   }.  memset(&m, 
16790 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20  0, sizeof(m));. 
167a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
167b0 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
167c0 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 69  ->pCursor, 0, (i
167d0 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  nt)nCellKey, 1, 
167e0 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
167f0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
16800 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55    }.  assert( pU
16810 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26  npacked->flags &
16820 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45   UNPACKED_IGNORE
16830 5f 52 4f 57 49 44 20 29 3b 0a 20 20 2a 72 65 73  _ROWID );.  *res
16840 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
16850 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c  cordCompare(m.n,
16860 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29   m.z, pUnpacked)
16870 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
16880 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
16890 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
168a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
168b0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
168c0 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65  e value to be re
168d0 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71  turned by subseq
168e0 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  uent calls to.**
168f0 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
16900 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  () on the databa
16910 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20  se handle 'db'. 
16920 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16930 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73  VdbeSetChanges(s
16940 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
16950 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65  nChange){.  asse
16960 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16970 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
16980 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e  ) );.  db->nChan
16990 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20  ge = nChange;.  
169a0 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
169b0 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a   += nChange;.}..
169c0 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  /*.** Set a flag
169d0 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20   in the vdbe to 
169e0 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
169f0 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69  e counter when i
16a00 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a  t is finalised.*
16a10 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76  * or reset..*/.v
16a20 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
16a30 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65  ountChanges(Vdbe
16a40 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67   *v){.  v->chang
16a50 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f  eCntOn = 1;.}../
16a60 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20  *.** Mark every 
16a70 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
16a80 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
16a90 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
16aa0 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65  nnection.** as e
16ab0 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  xpired..**.** An
16ac0 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65   expired stateme
16ad0 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65  nt means that re
16ae0 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
16af0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  he statement is.
16b00 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53  ** recommend.  S
16b10 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65  tatements expire
16b20 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70   when things hap
16b30 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68  pen that make th
16b40 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20  eir.** programs 
16b50 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76  obsolete.  Remov
16b60 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ing user-defined
16b70 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f   functions or co
16b80 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
16b90 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e  nces, or changin
16ba0 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  g an authorizati
16bb0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  on function are 
16bc0 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20  the types of.** 
16bd0 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65  things that make
16be0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
16bf0 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a  ents obsolete..*
16c00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
16c10 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
16c20 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  ements(sqlite3 *
16c30 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
16c40 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56    for(p = db->pV
16c50 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  dbe; p; p=p->pNe
16c60 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69  xt){.    p->expi
16c70 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  red = 1;.  }.}..
16c80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
16c90 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
16ca0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
16cb0 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
16cc0 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
16cd0 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
16ce0 20 76 2d 3e 64 62 3b 0a 7d 0a                     v->db;.}.