/ Hex Artifact Content
Login

Artifact 32d77382469c20aa5a971a8794deb1eafa8d5cb6:


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 0a 0a 2f 2a  SQLITE_DEBUG../*
18f0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1900: 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74  g type and funct
1910: 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20  ion are used to 
1920: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1930: 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69  all opcodes.** i
1940: 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72  n a Vdbe main pr
1950: 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f  ogram and each o
1960: 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61  f the sub-progra
1970: 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69 74  ms (triggers) it
1980: 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20   may .** invoke 
1990: 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69  directly or indi
19a0: 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c  rectly. It shoul
19b0: 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c  d be used as fol
19c0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70  lows:.**.**   Op
19d0: 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65   *pOp;.**   Vdbe
19e0: 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a  OpIter sIter;.**
19f0: 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49  .**   memset(&sI
1a00: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ter, 0, sizeof(s
1a10: 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74  Iter));.**   sIt
1a20: 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20  er.v = v;       
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20       // v is of 
1a50: 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20  type Vdbe* .**  
1a60: 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f   while( (pOp = o
1a70: 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72  pIterNext(&sIter
1a80: 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20  )) ){.**     // 
1a90: 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74  Do something wit
1aa0: 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20  h pOp.**   }.** 
1ab0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1ac0: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
1ad0: 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65  ub);.** .*/.type
1ae0: 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65 4f  def struct VdbeO
1af0: 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65 72  pIter VdbeOpIter
1b00: 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70 49  ;.struct VdbeOpI
1b10: 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b  ter {.  Vdbe *v;
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74     /* Vdbe to it
1b40: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
1b50: 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a  e opcodes of */.
1b60: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
1b70: 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  pSub;        /* 
1b80: 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  Array of subprog
1b90: 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  rams */.  int nS
1ba0: 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ub;             
1bb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1bc0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53  f entries in apS
1bd0: 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64  ub */.  int iAdd
1be0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
1bf0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1c00: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
1c10: 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  n to return */. 
1c20: 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20   int iSub;      
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
1c40: 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c   = main program,
1c50: 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70   1 = first sub-p
1c60: 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d  rogram etc. */.}
1c70: 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49  ;.static Op *opI
1c80: 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74  terNext(VdbeOpIt
1c90: 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a  er *p){.  Vdbe *
1ca0: 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a  v = p->v;.  Op *
1cb0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a  pRet = 0;.  Op *
1cc0: 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a  aOp;.  int nOp;.
1cd0: 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d  .  if( p->iSub<=
1ce0: 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20  p->nSub ){..    
1cf0: 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29  if( p->iSub==0 )
1d00: 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d  {.      aOp = v-
1d10: 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20  >aOp;.      nOp 
1d20: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65  = v->nOp;.    }e
1d30: 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  lse{.      aOp =
1d40: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75   p->apSub[p->iSu
1d50: 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20  b-1]->aOp;.     
1d60: 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b   nOp = p->apSub[
1d70: 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b  p->iSub-1]->nOp;
1d80: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1d90: 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20  t( p->iAddr<nOp 
1da0: 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26  );..    pRet = &
1db0: 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20  aOp[p->iAddr];. 
1dc0: 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20     p->iAddr++;. 
1dd0: 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d     if( p->iAddr=
1de0: 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  =nOp ){.      p-
1df0: 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >iSub++;.      p
1e00: 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  ->iAddr = 0;.   
1e10: 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52   }.  .    if( pR
1e20: 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  et->p4type==P4_S
1e30: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
1e40: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
1e50: 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f  p->nSub+1)*sizeo
1e60: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
1e70: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
1e80: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
1e90: 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nSub; j++){.   
1ea0: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75       if( p->apSu
1eb0: 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70  b[j]==pRet->p4.p
1ec0: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b  Program ) break;
1ed0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1ee0: 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b  f( j==p->nSub ){
1ef0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75  .        p->apSu
1f00: 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  b = sqlite3DbRea
1f10: 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62  llocOrFree(v->db
1f20: 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74  , p->apSub, nByt
1f30: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1f40: 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20  !p->apSub ){.   
1f50: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b         pRet = 0;
1f60: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1f70: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53            p->apS
1f80: 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20  ub[p->nSub++] = 
1f90: 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61  pRet->p4.pProgra
1fa0: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  m;.        }.   
1fb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1fc0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
1fd0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  ../*.** Check if
1fe0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f   the program sto
1ff0: 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73  red in the VM as
2000: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50  sociated with pP
2010: 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f  arse may.** thro
2020: 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70  w an ABORT excep
2030: 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68  tion (causing th
2040: 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74  e statement, but
2050: 20 6e 6f 74 20 74 72 61 6e 73 61 63 74 69 6f 6e   not transaction
2060: 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  .** to be rolled
2070: 20 62 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e   back). This con
2080: 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69  dition is true i
2090: 66 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  f the main progr
20a0: 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62  am or any.** sub
20b0: 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69  -programs contai
20c0: 6e 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  ns any of the fo
20d0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
20e0: 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68   *  OP_Halt with
20f0: 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54   P1=SQLITE_CONST
2100: 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f  RAINT and P2=OE_
2110: 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f  Abort..**   *  O
2120: 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74  P_HaltIfNull wit
2130: 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  h P1=SQLITE_CONS
2140: 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45  TRAINT and P2=OE
2150: 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20  _Abort..**   *  
2160: 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20  OP_Destroy.**   
2170: 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a  *  OP_VUpdate.**
2180: 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65     *  OP_VRename
2190: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f  .**   *  OP_FkCo
21a0: 75 6e 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30  unter with P2==0
21b0: 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65   (immediate fore
21c0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
21d0: 6e 74 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63  nt).**.** Then c
21e0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
21f0: 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d 61 79  lue of Parse.may
2200: 41 62 6f 72 74 20 69 73 20 74 72 75 65 20 69 66  Abort is true if
2210: 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79   an.** ABORT may
2220: 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66   be thrown, or f
2230: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20  alse otherwise. 
2240: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
2250: 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c  t does.** match,
2260: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
2270: 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ise. This functi
2280: 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  on is intended t
2290: 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a 20  o be used as.** 
22a0: 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65 72  part of an asser
22b0: 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74  t statement in t
22c0: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d  he compiler. Sim
22d0: 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ilar to:.**.**  
22e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
22f0: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
2300: 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  rt(pParse->pVdbe
2310: 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f  , pParse->mayAbo
2320: 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71  rt) );.*/.int sq
2330: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d  lite3VdbeAssertM
2340: 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a 76 2c  ayAbort(Vdbe *v,
2350: 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a   int mayAbort){.
2360: 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74 20 3d    int hasAbort =
2370: 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20   0;.  Op *pOp;. 
2380: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
2390: 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74  r;.  memset(&sIt
23a0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49  er, 0, sizeof(sI
23b0: 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76  ter));.  sIter.v
23c0: 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = v;..  while( 
23d0: 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78  (pOp = opIterNex
23e0: 74 28 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b  t(&sIter))!=0 ){
23f0: 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20  .    int opcode 
2400: 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20  = pOp->opcode;. 
2410: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
2420: 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63  P_Destroy || opc
2430: 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20  ode==OP_VUpdate 
2440: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52  || opcode==OP_VR
2450: 65 6e 61 6d 65 20 0a 23 69 66 6e 64 65 66 20 53  ename .#ifndef S
2460: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
2470: 47 4e 5f 4b 45 59 0a 20 20 20 20 20 7c 7c 20 28  GN_KEY.     || (
2480: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75  opcode==OP_FkCou
2490: 6e 74 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d  nter && pOp->p1=
24a0: 3d 31 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 30  =1 && pOp->p2==0
24b0: 29 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7c  ) .#endif.     |
24c0: 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48  | ((opcode==OP_H
24d0: 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  alt || opcode==O
24e0: 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20  P_HaltIfNull) . 
24f0: 20 20 20 20 20 26 26 20 28 70 4f 70 2d 3e 70 31       && (pOp->p1
2500: 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
2510: 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d  INT && pOp->p2==
2520: 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29  OE_Abort)).    )
2530: 7b 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72 74  {.      hasAbort
2540: 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
2550: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
2560: 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
2570: 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29  db, sIter.apSub)
2580: 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ;..  /* Return t
2590: 72 75 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d  rue if hasAbort=
25a0: 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66  =mayAbort. Or if
25b0: 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72   a malloc failur
25c0: 65 20 6f 63 63 75 72 65 64 2e 0a 20 20 2a 2a 20  e occured..  ** 
25d0: 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  If malloc failed
25e0: 2c 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65  , then the while
25f0: 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61  () loop above ma
2600: 79 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61  y not have itera
2610: 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ted.  ** through
2620: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64   all opcodes and
2630: 20 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65   hasAbort may be
2640: 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79   set incorrectly
2650: 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72  . Return.  ** tr
2660: 75 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65  ue for this case
2670: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
2680: 61 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20  assert() in the 
2690: 63 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20  callers frame.  
26a0: 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e  ** from failing.
26b0: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20    */.  return ( 
26c0: 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  v->db->mallocFai
26d0: 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d  led || hasAbort=
26e0: 3d 6d 61 79 41 62 6f 72 74 20 29 3b 0a 7d 0a 23  =mayAbort );.}.#
26f0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f  endif../*.** Loo
2700: 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 72  p through the pr
2710: 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ogram looking fo
2720: 72 20 50 32 20 76 61 6c 75 65 73 20 74 68 61 74  r P2 values that
2730: 20 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a   are negative.**
2740: 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63   on jump instruc
2750: 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63  tions.  Each suc
2760: 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  h value is a lab
2770: 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65  el.  Resolve the
2780: 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74  .** label by set
2790: 74 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75  ting the P2 valu
27a0: 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74  e to its correct
27b0: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e   non-zero value.
27c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
27d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
27e0: 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63  ce after all opc
27f0: 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69  odes have been i
2800: 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56  nserted..**.** V
2810: 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e  ariable *pMaxFun
2820: 63 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20  cArgs is set to 
2830: 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  the maximum valu
2840: 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75  e of any P2 argu
2850: 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f  ment .** to an O
2860: 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41  P_Function, OP_A
2870: 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69  ggStep or OP_VFi
2880: 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69  lter opcode. Thi
2890: 73 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a  s is used by .**
28a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
28b0: 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20  Ready() to size 
28c0: 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d  the Vdbe.apArg[]
28d0: 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
28e0: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32  c void resolveP2
28f0: 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20  Values(Vdbe *p, 
2900: 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  int *pMaxFuncArg
2910: 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  s){.  int i;.  i
2920: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70  nt nMaxArgs = *p
2930: 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f  MaxFuncArgs;.  O
2940: 70 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61  p *pOp;.  int *a
2950: 4c 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65  Label = p->aLabe
2960: 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  l;.  p->readOnly
2970: 20 3d 20 31 3b 0a 20 20 66 6f 72 28 70 4f 70 3d   = 1;.  for(pOp=
2980: 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70  p->aOp, i=p->nOp
2990: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  -1; i>=0; i--, p
29a0: 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70  Op++){.    u8 op
29b0: 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f  code = pOp->opco
29c0: 64 65 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 63  de;..    if( opc
29d0: 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e  ode==OP_Function
29e0: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41   || opcode==OP_A
29f0: 67 67 53 74 65 70 20 29 7b 0a 20 20 20 20 20 20  ggStep ){.      
2a00: 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78  if( pOp->p5>nMax
2a10: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
2a20: 3d 20 70 4f 70 2d 3e 70 35 3b 0a 23 69 66 6e 64  = pOp->p5;.#ifnd
2a30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2a40: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2a50: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
2a60: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 29 7b 0a  ==OP_VUpdate ){.
2a70: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
2a80: 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  2>nMaxArgs ) nMa
2a90: 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b  xArgs = pOp->p2;
2aa0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
2ab0: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
2ac0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 26 26 20  _Transaction && 
2ad0: 70 4f 70 2d 3e 70 32 21 3d 30 20 29 7b 0a 20 20  pOp->p2!=0 ){.  
2ae0: 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20      p->readOnly 
2af0: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
2b00: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2b10: 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20  TABLE.    }else 
2b20: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56  if( opcode==OP_V
2b30: 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Filter ){.      
2b40: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61 73 73  int n;.      ass
2b50: 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20  ert( p->nOp - i 
2b60: 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 61 73  >= 3 );.      as
2b70: 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70  sert( pOp[-1].op
2b80: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72  code==OP_Integer
2b90: 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 4f   );.      n = pO
2ba0: 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20  p[-1].p1;.      
2bb0: 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29  if( n>nMaxArgs )
2bc0: 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 23   nMaxArgs = n;.#
2bd0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
2be0: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
2bf0: 4f 70 63 6f 64 65 48 61 73 50 72 6f 70 65 72 74  OpcodeHasPropert
2c00: 79 28 6f 70 63 6f 64 65 2c 20 4f 50 46 4c 47 5f  y(opcode, OPFLG_
2c10: 4a 55 4d 50 29 20 26 26 20 70 4f 70 2d 3e 70 32  JUMP) && pOp->p2
2c20: 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  <0 ){.      asse
2c30: 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70  rt( -1-pOp->p2<p
2c40: 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20  ->nLabel );.    
2c50: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62    pOp->p2 = aLab
2c60: 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a  el[-1-pOp->p2];.
2c70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
2c80: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
2c90: 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70   p->aLabel);.  p
2ca0: 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20  ->aLabel = 0;.. 
2cb0: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d   *pMaxFuncArgs =
2cc0: 20 6e 4d 61 78 41 72 67 73 3b 0a 7d 0a 0a 2f 2a   nMaxArgs;.}../*
2cd0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
2ce0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
2cf0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
2d00: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  o be inserted..*
2d10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2d20: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62  eCurrentAddr(Vdb
2d30: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
2d40: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
2d50: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
2d60: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d  return p->nOp;.}
2d70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2d80: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
2d90: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
2da0: 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20  rray of opcodes 
2db0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
2dc0: 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 73 73  ** the Vdbe pass
2dd0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
2de0: 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20  argument. It is 
2df0: 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
2e00: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f  onsibility.** to
2e10: 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65   arrange for the
2e20: 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20   returned array 
2e30: 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  to be eventually
2e40: 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 68 65   freed using the
2e50: 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41   .** vdbeFreeOpA
2e60: 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e  rray() function.
2e70: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
2e80: 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69  turning, *pnOp i
2e90: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
2ea0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
2eb0: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  n the returned.*
2ec0: 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a  * array. Also, *
2ed0: 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74 20  pnMaxArg is set 
2ee0: 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  to the larger of
2ef0: 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
2f00: 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e  ue and .** the n
2f10: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2f20: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41   in the Vdbe.apA
2f30: 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69  rg[] array requi
2f40: 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74  red to execute t
2f50: 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  he .** returned 
2f60: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65  program..*/.Vdbe
2f70: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54  Op *sqlite3VdbeT
2f80: 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  akeOpArray(Vdbe 
2f90: 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69  *p, int *pnOp, i
2fa0: 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20  nt *pnMaxArg){. 
2fb0: 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70   VdbeOp *aOp = p
2fc0: 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->aOp;.  assert(
2fd0: 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e   aOp && !p->db->
2fe0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
2ff0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
3000: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
3010: 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20  Btree() was not 
3020: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56  called on this V
3030: 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  M */.  assert( p
3040: 2d 3e 61 4d 75 74 65 78 2e 6e 4d 75 74 65 78 3d  ->aMutex.nMutex=
3050: 3d 30 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65  =0 );..  resolve
3060: 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61  P2Values(p, pnMa
3070: 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d  xArg);.  *pnOp =
3080: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f   p->nOp;.  p->aO
3090: 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  p = 0;.  return 
30a0: 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  aOp;.}../*.** Ad
30b0: 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f  d a whole list o
30c0: 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  f operations to 
30d0: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74  the operation st
30e0: 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ack.  Return the
30f0: 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74  .** address of t
3100: 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69  he first operati
3110: 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74  on added..*/.int
3120: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3130: 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69  pList(Vdbe *p, i
3140: 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69  nt nOp, VdbeOpLi
3150: 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a  st const *aOp){.
3160: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73    int addr;.  as
3170: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
3180: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3190: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
31a0: 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c  + nOp > p->nOpAl
31b0: 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72 72  loc && growOpArr
31c0: 61 79 28 70 29 20 29 7b 0a 20 20 20 20 72 65 74  ay(p) ){.    ret
31d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64  urn 0;.  }.  add
31e0: 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  r = p->nOp;.  if
31f0: 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29 20  ( ALWAYS(nOp>0) 
3200: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
3210: 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e    VdbeOpList con
3220: 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20  st *pIn = aOp;. 
3230: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
3240: 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a  p; i++, pIn++){.
3250: 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20 70        int p2 = p
3260: 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56 64  In->p2;.      Vd
3270: 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d  beOp *pOut = &p-
3280: 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20  >aOp[i+addr];.  
3290: 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65      pOut->opcode
32a0: 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a   = pIn->opcode;.
32b0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d        pOut->p1 =
32c0: 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20   pIn->p1;.      
32d0: 69 66 28 20 70 32 3c 30 20 26 26 20 73 71 6c 69  if( p2<0 && sqli
32e0: 74 65 33 56 64 62 65 4f 70 63 6f 64 65 48 61 73  te3VdbeOpcodeHas
32f0: 50 72 6f 70 65 72 74 79 28 70 4f 75 74 2d 3e 6f  Property(pOut->o
3300: 70 63 6f 64 65 2c 20 4f 50 46 4c 47 5f 4a 55 4d  pcode, OPFLG_JUM
3310: 50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  P) ){.        pO
3320: 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b 20  ut->p2 = addr + 
3330: 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20 20 20  ADDR(p2);.      
3340: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
3350: 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20  Out->p2 = p2;.  
3360: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74      }.      pOut
3370: 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a  ->p3 = pIn->p3;.
3380: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79        pOut->p4ty
3390: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
33a0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e  .      pOut->p4.
33b0: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 75  p = 0;.      pOu
33c0: 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65  t->p5 = 0;.#ifde
33d0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
33e0: 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d       pOut->zComm
33f0: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ent = 0;.      i
3400: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  f( sqlite3VdbeAd
3410: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
3420: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
3430: 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72  rintOp(0, i+addr
3440: 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  , &p->aOp[i+addr
3450: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ]);.      }.#end
3460: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
3470: 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a  nOp += nOp;.  }.
3480: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
3490: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
34a0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
34b0: 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P1 operand for a
34c0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
34d0: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
34e0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
34f0: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
3500: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
3510: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
3520: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
3530: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3540: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
3550: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
3560: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
3570: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  the program..*/.
3580: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3590: 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70  ChangeP1(Vdbe *p
35a0: 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20  , int addr, int 
35b0: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
35c0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
35d0: 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69  ( addr>=0 );.  i
35e0: 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29  f( p->nOp>addr )
35f0: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
3600: 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p1 = val;.  }
3610: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
3620: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
3630: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P2 operand for
3640: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
3650: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
3660: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
3670: 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61  ul for setting a
3680: 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
3690: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
36a0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56  e3VdbeChangeP2(V
36b0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
36c0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
36d0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
36e0: 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20  assert( addr>=0 
36f0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e  );.  if( p->nOp>
3700: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
3710: 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61  Op[addr].p2 = va
3720: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
3730: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3740: 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61   of the P3 opera
3750: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
3760: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
3770: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3780: 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20  beChangeP3(Vdbe 
3790: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e  *p, int addr, in
37a0: 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  t val){.  assert
37b0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
37c0: 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20  rt( addr>=0 );. 
37d0: 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72   if( p->nOp>addr
37e0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
37f0: 64 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20  ddr].p3 = val;. 
3800: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
3810: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3820: 74 68 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66  the P5 operand f
3830: 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
3840: 6e 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70  ntly.** added op
3850: 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  eration..*/.void
3860: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3870: 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38  geP5(Vdbe *p, u8
3880: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
3890: 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   p!=0 );.  if( p
38a0: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73  ->aOp ){.    ass
38b0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
38c0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  .    p->aOp[p->n
38d0: 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a  Op-1].p5 = val;.
38e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
38f0: 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61  nge the P2 opera
3900: 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  nd of instructio
3910: 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69  n addr so that i
3920: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
3930: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
3940: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
3950: 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a  on to be coded..
3960: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3970: 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65  dbeJumpHere(Vdbe
3980: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
3990: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
39a0: 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70  ngeP2(p, addr, p
39b0: 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ->nOp);.}.../*.*
39c0: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
39d0: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
39e0: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
39f0: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
3a00: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
3a10: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
3a20: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
3a30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3a40: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
3a50: 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  nction(sqlite3 *
3a60: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65  db, FuncDef *pDe
3a70: 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  f){.  if( ALWAYS
3a80: 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66 2d  (pDef) && (pDef-
3a90: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
3aa0: 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29  FUNC_EPHEM)!=0 )
3ab0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
3ac0: 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b 0a 20  ree(db, pDef);. 
3ad0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
3ae0: 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69 66  te a P4 value if
3af0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73   necessary..*/.s
3b00: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
3b10: 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  4(sqlite3 *db, i
3b20: 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20  nt p4type, void 
3b30: 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20 29  *p4){.  if( p4 )
3b40: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 34  {.    switch( p4
3b50: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
3b60: 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20  se P4_REAL:.    
3b70: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a    case P4_INT64:
3b80: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
3b90: 50 52 49 4e 54 46 3a 0a 20 20 20 20 20 20 63 61  PRINTF:.      ca
3ba0: 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20  se P4_DYNAMIC:. 
3bb0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59       case P4_KEY
3bc0: 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65  INFO:.      case
3bd0: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 0a 20 20   P4_INTARRAY:.  
3be0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
3bf0: 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20  NFO_HANDOFF: {. 
3c00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
3c10: 46 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20  Free(db, p4);.  
3c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3c30: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
3c40: 50 34 5f 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20  P4_VDBEFUNC: {. 
3c50: 20 20 20 20 20 20 20 56 64 62 65 46 75 6e 63 20         VdbeFunc 
3c60: 2a 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64  *pVdbeFunc = (Vd
3c70: 62 65 46 75 6e 63 20 2a 29 70 34 3b 0a 20 20 20  beFunc *)p4;.   
3c80: 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72       freeEphemer
3c90: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  alFunction(db, p
3ca0: 56 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29  VdbeFunc->pFunc)
3cb0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3cc0: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
3cd0: 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30 29  ta(pVdbeFunc, 0)
3ce0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3cf0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 56 64 62  3DbFree(db, pVdb
3d00: 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  eFunc);.        
3d10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
3d20: 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e       case P4_FUN
3d30: 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20  CDEF: {.        
3d40: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
3d50: 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44  ction(db, (FuncD
3d60: 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  ef*)p4);.       
3d70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3d80: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45        case P4_ME
3d90: 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  M: {.        sql
3da0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73  ite3ValueFree((s
3db0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34  qlite3_value*)p4
3dc0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
3dd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3de0: 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b  case P4_VTAB : {
3df0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3e00: 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62  VtabUnlock((VTab
3e10: 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  le *)p4);.      
3e20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3e30: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 53  .      case P4_S
3e40: 55 42 50 52 4f 47 52 41 4d 20 3a 20 7b 0a 20 20  UBPROGRAM : {.  
3e50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3e60: 65 50 72 6f 67 72 61 6d 44 65 6c 65 74 65 28 64  eProgramDelete(d
3e70: 62 2c 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a  b, (SubProgram *
3e80: 29 70 34 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  )p4, 1);.       
3e90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3ea0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
3eb0: 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63  ** Free the spac
3ec0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
3ed0: 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76  aOp and any p4 v
3ee0: 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  alues allocated 
3ef0: 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64  for the.** opcod
3f00: 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  es contained wit
3f10: 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e  hin. If aOp is n
3f20: 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73  ot NULL it is as
3f30: 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
3f40: 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73   .** nOp entries
3f50: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
3f60: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
3f70: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f  y(sqlite3 *db, O
3f80: 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29  p *aOp, int nOp)
3f90: 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20  {.  if( aOp ){. 
3fa0: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20     Op *pOp;.    
3fb0: 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70  for(pOp=aOp; pOp
3fc0: 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b  <&aOp[nOp]; pOp+
3fd0: 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  +){.      freeP4
3fe0: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
3ff0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69  , pOp->p4.p);.#i
4000: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4010: 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  G.      sqlite3D
4020: 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a  bFree(db, pOp->z
4030: 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66  Comment);.#endif
4040: 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
4050: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4060: 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a  db, aOp);.}../*.
4070: 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
4080: 20 72 65 66 2d 63 6f 75 6e 74 20 6f 6e 20 74 68   ref-count on th
4090: 65 20 53 75 62 50 72 6f 67 72 61 6d 20 73 74 72  e SubProgram str
40a0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
40b0: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61   the.** second a
40c0: 72 67 75 6d 65 6e 74 2e 20 49 66 20 74 68 65 20  rgument. If the 
40d0: 72 65 66 2d 63 6f 75 6e 74 20 72 65 61 63 68 65  ref-count reache
40e0: 73 20 7a 65 72 6f 2c 20 66 72 65 65 20 74 68 65  s zero, free the
40f0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
4100: 2a 20 54 68 65 20 61 72 72 61 79 20 6f 66 20 56  * The array of V
4110: 44 42 45 20 6f 70 63 6f 64 65 73 20 73 74 6f 72  DBE opcodes stor
4120: 65 64 20 61 73 20 53 75 62 50 72 6f 67 72 61 6d  ed as SubProgram
4130: 2e 61 4f 70 20 69 73 20 66 72 65 65 64 20 69 66  .aOp is freed if
4140: 0a 2a 2a 20 65 69 74 68 65 72 20 74 68 65 20 72  .** either the r
4150: 65 66 2d 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ef-count reaches
4160: 20 7a 65 72 6f 20 6f 72 20 70 61 72 61 6d 65 74   zero or paramet
4170: 65 72 20 66 72 65 65 6f 70 20 69 73 20 6e 6f 6e  er freeop is non
4180: 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e  -zero..**.** Sin
4190: 63 65 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  ce the array of 
41a0: 6f 70 63 6f 64 65 73 20 70 6f 69 6e 74 65 64 20  opcodes pointed 
41b0: 74 6f 20 62 79 20 53 75 62 50 72 6f 67 72 61 6d  to by SubProgram
41c0: 2e 61 4f 70 20 6d 61 79 20 64 69 72 65 63 74 6c  .aOp may directl
41d0: 79 0a 2a 2a 20 6f 72 20 69 6e 64 69 72 65 63 74  y.** or indirect
41e0: 6c 79 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 66  ly contain a ref
41f0: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 53 75  erence to the Su
4200: 62 50 72 6f 67 72 61 6d 20 73 74 72 75 63 74 75  bProgram structu
4210: 72 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 42 79  re itself..** By
4220: 20 70 61 73 73 69 6e 67 20 61 20 6e 6f 6e 2d 7a   passing a non-z
4230: 65 72 6f 20 66 72 65 65 6f 70 20 70 61 72 61 6d  ero freeop param
4240: 65 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72  eter, the caller
4250: 20 6d 61 79 20 65 6e 73 75 72 65 20 74 68 61 74   may ensure that
4260: 20 61 6c 6c 0a 2a 2a 20 53 75 62 50 72 6f 67 72   all.** SubProgr
4270: 61 6d 20 73 74 72 75 63 74 75 72 65 73 20 61 6e  am structures an
4280: 64 20 74 68 65 69 72 20 61 4f 70 20 61 72 72 61  d their aOp arra
4290: 79 73 20 61 72 65 20 66 72 65 65 64 2c 20 65 76  ys are freed, ev
42a0: 65 6e 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a  en when there.**
42b0: 20 61 72 65 20 73 75 63 68 20 63 69 72 63 75 6c   are such circul
42c0: 61 72 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ar references..*
42d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
42e0: 62 65 50 72 6f 67 72 61 6d 44 65 6c 65 74 65 28  beProgramDelete(
42f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 75 62  sqlite3 *db, Sub
4300: 50 72 6f 67 72 61 6d 20 2a 70 2c 20 69 6e 74 20  Program *p, int 
4310: 66 72 65 65 6f 70 29 7b 0a 20 20 69 66 28 20 70  freeop){.  if( p
4320: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4330: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
4340: 20 69 66 28 20 66 72 65 65 6f 70 20 7c 7c 20 70   if( freeop || p
4350: 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20  ->nRef==1 ){.   
4360: 20 20 20 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e     Op *aOp = p->
4370: 61 4f 70 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f  aOp;.      p->aO
4380: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 76 64 62  p = 0;.      vdb
4390: 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
43a0: 20 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20   aOp, p->nOp);. 
43b0: 20 20 20 20 20 70 2d 3e 6e 4f 70 20 3d 20 30 3b       p->nOp = 0;
43c0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 52  .    }.    p->nR
43d0: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  ef--;.    if( p-
43e0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
43f0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4400: 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  db, p);.    }.  
4410: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  }.}.../*.** Chan
4420: 67 65 20 4e 20 6f 70 63 6f 64 65 73 20 73 74 61  ge N opcodes sta
4430: 72 74 69 6e 67 20 61 74 20 61 64 64 72 20 74 6f  rting at addr to
4440: 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64   No-ops..*/.void
4450: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4460: 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70  geToNoop(Vdbe *p
4470: 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20  , int addr, int 
4480: 4e 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70  N){.  if( p->aOp
4490: 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   ){.    VdbeOp *
44a0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
44b0: 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr];.    sqlite3
44c0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
44d0: 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a    while( N-- ){.
44e0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
44f0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
4500: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 20 20  p->p4.p);.      
4510: 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73  memset(pOp, 0, s
4520: 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a  izeof(pOp[0]));.
4530: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
4540: 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  e = OP_Noop;.   
4550: 20 20 20 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a     pOp++;.    }.
4560: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
4570: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
4580: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
4590: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
45a0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
45b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
45c0: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
45d0: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
45e0: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
45f0: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
4600: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
4610: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
4620: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
4630: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
4640: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
4650: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
4660: 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72  then the P4 oper
4670: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
4680: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
4690: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
46a0: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
46b0: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
46c0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
46d0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
46e0: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
46f0: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
4700: 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP4 up to and in
4710: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
4720: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
4730: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
4740: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
4750: 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d  P4..**.** If n==
4760: 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65  P4_KEYINFO it me
4770: 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73 20  ans that zP4 is 
4780: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  a pointer to a K
4790: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
47a0: 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d  ..** A copy is m
47b0: 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49 6e  ade of the KeyIn
47c0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 74  fo structure int
47d0: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
47e0: 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
47f0: 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20  3_malloc, to be 
4800: 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56  freed when the V
4810: 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  dbe is finalized
4820: 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e  ..** n==P4_KEYIN
4830: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63  FO_HANDOFF indic
4840: 61 74 65 73 20 74 68 61 74 20 7a 50 34 20 70 6f  ates that zP4 po
4850: 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66  ints to a KeyInf
4860: 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73  o structure.** s
4870: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
4880: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
4890: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  has obtained fro
48a0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
48b0: 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  . The .** caller
48c0: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65   should not free
48d0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c   the allocation,
48e0: 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
48f0: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
4900: 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e  is.** finalized.
4910: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
4920: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
4930: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
4940: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
4950: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
4960: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
4970: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
4980: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
4990: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
49a0: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
49b0: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
49c0: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
49d0: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
49e0: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
49f0: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
4a00: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
4a10: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
4a20: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
4a30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4a40: 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65  dbeChangeP4(Vdbe
4a50: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63   *p, int addr, c
4a60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
4a70: 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f  int n){.  Op *pO
4a80: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
4a90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ;.  assert( p!=0
4aa0: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
4ab0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
4ac0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
4ad0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
4ae0: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->aOp==0 || db->
4af0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
4b00: 20 20 20 20 69 66 20 28 20 6e 21 3d 50 34 5f 4b      if ( n!=P4_K
4b10: 45 59 49 4e 46 4f 20 26 26 20 6e 21 3d 50 34 5f  EYINFO && n!=P4_
4b20: 56 54 41 42 20 29 20 7b 0a 20 20 20 20 20 20 66  VTAB ) {.      f
4b30: 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f  reeP4(db, n, (vo
4b40: 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50  id*)*(char**)&zP
4b50: 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  4);.    }.    re
4b60: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
4b70: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
4b80: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70    assert( addr<p
4b90: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61  ->nOp );.  if( a
4ba0: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
4bb0: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
4bc0: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
4bd0: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65  aOp[addr];.  fre
4be0: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
4bf0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
4c00: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
4c10: 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e  ;.  if( n==P4_IN
4c20: 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  T32 ){.    /* No
4c30: 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73  te: this cast is
4c40: 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74   safe, because t
4c50: 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70  he origin data p
4c60: 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a  oint was an int.
4c70: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20      ** that was 
4c80: 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74  cast to a (const
4c90: 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20   char *). */.   
4ca0: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c   pOp->p4.i = SQL
4cb0: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a  ITE_PTR_TO_INT(z
4cc0: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
4cd0: 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b  type = P4_INT32;
4ce0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34  .  }else if( zP4
4cf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  ==0 ){.    pOp->
4d00: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f  p4.p = 0;.    pO
4d10: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
4d20: 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  OTUSED;.  }else 
4d30: 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46  if( n==P4_KEYINF
4d40: 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  O ){.    KeyInfo
4d50: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
4d60: 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74  int nField, nByt
4d70: 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d  e;..    nField =
4d80: 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29   ((KeyInfo*)zP4)
4d90: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42  ->nField;.    nB
4da0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b  yte = sizeof(*pK
4db0: 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c  eyInfo) + (nFiel
4dc0: 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79  d-1)*sizeof(pKey
4dd0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20  Info->aColl[0]) 
4de0: 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b  + nField;.    pK
4df0: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
4e00: 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  Malloc( nByte );
4e10: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  .    pOp->p4.pKe
4e20: 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
4e30: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e  ;.    if( pKeyIn
4e40: 66 6f 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  fo ){.      u8 *
4e50: 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  aSortOrder;.    
4e60: 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66    memcpy(pKeyInf
4e70: 6f 2c 20 7a 50 34 2c 20 6e 42 79 74 65 29 3b 0a  o, zP4, nByte);.
4e80: 20 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72        aSortOrder
4e90: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f   = pKeyInfo->aSo
4ea0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69  rtOrder;.      i
4eb0: 66 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b  f( aSortOrder ){
4ec0: 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66  .        pKeyInf
4ed0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  o->aSortOrder = 
4ee0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
4ef0: 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  &pKeyInfo->aColl
4f00: 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20  [nField];.      
4f10: 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66    memcpy(pKeyInf
4f20: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61  o->aSortOrder, a
4f30: 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c  SortOrder, nFiel
4f40: 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
4f50: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
4f60: 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20  P4_KEYINFO;.    
4f70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
4f80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4f90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d   = 1;.      pOp-
4fa0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
4fb0: 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  USED;.    }.  }e
4fc0: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45  lse if( n==P4_KE
4fd0: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b  YINFO_HANDOFF ){
4fe0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
4ff0: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
5000: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5010: 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c  4_KEYINFO;.  }el
5020: 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41  se if( n==P4_VTA
5030: 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  B ){.    pOp->p4
5040: 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b  .p = (void*)zP4;
5050: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
5060: 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20 20 20   = P4_VTAB;.    
5070: 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28  sqlite3VtabLock(
5080: 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a  (VTable *)zP4);.
5090: 20 20 20 20 61 73 73 65 72 74 28 20 28 28 56 54      assert( ((VT
50a0: 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d  able *)zP4)->db=
50b0: 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73  =p->db );.  }els
50c0: 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20  e if( n<0 ){.   
50d0: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f   pOp->p4.p = (vo
50e0: 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70  id*)zP4;.    pOp
50f0: 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e  ->p4type = (sign
5100: 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c  ed char)n;.  }el
5110: 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30  se{.    if( n==0
5120: 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   ) n = sqlite3St
5130: 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20  rlen30(zP4);.   
5140: 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c   pOp->p4.z = sql
5150: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d  ite3DbStrNDup(p-
5160: 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20  >db, zP4, n);.  
5170: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5180: 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a  P4_DYNAMIC;.  }.
5190: 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
51a0: 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  G./*.** Change t
51b0: 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
51c0: 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  e the most recen
51d0: 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75  tly coded instru
51e0: 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e  ction.  Or.** in
51f0: 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64  sert a No-op and
5200: 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74   add the comment
5210: 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73   to that new ins
5220: 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a  truction.  This.
5230: 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64  ** makes the cod
5240: 65 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64  e easier to read
5250: 20 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e   during debuggin
5260: 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73  g.  None of this
5270: 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61   happens.** in a
5280: 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c   production buil
5290: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
52a0: 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64  e3VdbeComment(Vd
52b0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
52c0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
52d0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
52e0: 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
52f0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  n;.  assert( p->
5300: 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d  nOp>0 || p->aOp=
5310: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5320: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e  p->aOp==0 || p->
5330: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
5340: 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e  omment==0 || p->
5350: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5360: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
5370: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70   ){.    char **p
5380: 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  z = &p->aOp[p->n
5390: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a  Op-1].zComment;.
53a0: 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
53b0: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73   zFormat);.    s
53c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
53d0: 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70  db, *pz);.    *p
53e0: 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  z = sqlite3VMPri
53f0: 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d  ntf(p->db, zForm
5400: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
5410: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76  end(ap);.  }.}.v
5420: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e  oid sqlite3VdbeN
5430: 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  oopComment(Vdbe 
5440: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
5450: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
5460: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
5470: 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
5480: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5490: 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(p, OP_Noop);
54a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
54b0: 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  p>0 || p->aOp==0
54c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
54d0: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
54e0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
54f0: 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ment==0 || p->db
5500: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5510: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29  ;.  if( p->nOp )
5520: 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20  {.    char **pz 
5530: 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  = &p->aOp[p->nOp
5540: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20  -1].zComment;.  
5550: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
5560: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c  Format);.    sql
5570: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
5580: 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20  , *pz);.    *pz 
5590: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
55a0: 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  f(p->db, zFormat
55b0: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
55c0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  d(ap);.  }.}.#en
55d0: 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a  dif  /* NDEBUG *
55e0: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
55f0: 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  the opcode for a
5600: 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20   given address. 
5610: 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73 20   If the address 
5620: 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72  is -1, then.** r
5630: 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72  eturn the most r
5640: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
5650: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49   opcode..**.** I
5660: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
5670: 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20  ation error has 
5680: 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 74  occurred prior t
5690: 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66  o the calling of
56a0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
56b0: 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72  , then a pointer
56c0: 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65   to a dummy Vdbe
56d0: 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  Op will be retur
56e0: 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64  ned.  That opcod
56f0: 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65  e.** is readable
5700: 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2c 20 62   and writable, b
5710: 75 74 20 69 74 20 68 61 73 20 6e 6f 20 65 66 66  ut it has no eff
5720: 65 63 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ect.  The return
5730: 20 6f 66 20 61 20 64 75 6d 6d 79 0a 2a 2a 20 6f   of a dummy.** o
5740: 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65  pcode allows the
5750: 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75   call to continu
5760: 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 20 61 66  e functioning af
5770: 74 65 72 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20  ter a OOM fault 
5780: 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e  without.** havin
5790: 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65  g to check to se
57a0: 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20  e if the return 
57b0: 66 72 6f 6d 20 74 68 69 73 20 72 6f 75 74 69 6e  from this routin
57c0: 65 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69  e is a valid poi
57d0: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 62 6f 75  nter..**.** Abou
57e0: 74 20 74 68 65 20 23 69 66 64 65 66 20 53 51 4c  t the #ifdef SQL
57f0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 3a 20  ITE_OMIT_TRACE: 
5800: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
5810: 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
5820: 20 63 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c 65 73   called.** unles
5830: 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54 68 69  s p->nOp>0.  Thi
5840: 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
5850: 74 68 65 20 61 62 73 65 6e 73 65 20 6f 66 20 53  the absense of S
5860: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5870: 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54 72 61 63 65  ,.** an OP_Trace
5880: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
5890: 61 6c 77 61 79 73 20 69 6e 73 65 72 74 65 64 20  always inserted 
58a0: 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  by sqlite3VdbeGe
58b0: 74 28 29 20 61 73 20 73 6f 6f 6e 20 61 73 0a 2a  t() as soon as.*
58c0: 2a 20 61 20 6e 65 77 20 56 44 42 45 20 69 73 20  * a new VDBE is 
58d0: 63 72 65 61 74 65 64 2e 20 20 53 6f 20 77 65 20  created.  So we 
58e0: 61 72 65 20 66 72 65 65 20 74 6f 20 73 65 74 20  are free to set 
58f0: 61 64 64 72 20 74 6f 20 70 2d 3e 6e 4f 70 2d 31  addr to p->nOp-1
5900: 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69   without.** havi
5910: 6e 67 20 74 6f 20 64 6f 75 62 6c 65 2d 63 68 65  ng to double-che
5920: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
5930: 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
5940: 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e  is non-negative.
5950: 20 42 75 74 0a 2a 2a 20 69 66 20 53 51 4c 49 54   But.** if SQLIT
5960: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 69 73 20  E_OMIT_TRACE is 
5970: 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4f 50 5f  defined, the OP_
5980: 54 72 61 63 65 20 69 73 20 6f 6d 69 74 74 65 64  Trace is omitted
5990: 20 61 6e 64 20 77 65 20 64 6f 20 6e 65 65 64 20   and we do need 
59a0: 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68 65 20  to.** check the 
59b0: 76 61 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f 70 2d  value of p->nOp-
59c0: 31 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  1 before continu
59d0: 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ing..*/.VdbeOp *
59e0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
59f0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
5a00: 64 72 29 7b 0a 20 20 73 74 61 74 69 63 20 56 64  dr){.  static Vd
5a10: 62 65 4f 70 20 64 75 6d 6d 79 3b 0a 20 20 61 73  beOp dummy;.  as
5a20: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
5a30: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
5a40: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
5a50: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
5a60: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20  _OMIT_TRACE.    
5a70: 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20  if( p->nOp==0 ) 
5a80: 72 65 74 75 72 6e 20 26 64 75 6d 6d 79 3b 0a 23  return &dummy;.#
5a90: 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 20 3d  endif.    addr =
5aa0: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d   p->nOp - 1;.  }
5ab0: 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72  .  assert( (addr
5ac0: 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e  >=0 && addr<p->n
5ad0: 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  Op) || p->db->ma
5ae0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
5af0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
5b00: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
5b10: 65 74 75 72 6e 20 26 64 75 6d 6d 79 3b 0a 20 20  eturn &dummy;.  
5b20: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
5b30: 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  n &p->aOp[addr];
5b40: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66  .  }.}..#if !def
5b50: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
5b60: 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65  _EXPLAIN) || !de
5b70: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a  fined(NDEBUG) \.
5b80: 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28       || defined(
5b90: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
5ba0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5bb0: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d  DEBUG)./*.** Com
5bc0: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68  pute a string th
5bd0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
5be0: 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f   P4 parameter fo
5bf0: 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  r an opcode..** 
5c00: 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e  Use zTemp for an
5c10: 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f  y required tempo
5c20: 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63  rary buffer spac
5c30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
5c40: 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20  r *displayP4(Op 
5c50: 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d  *pOp, char *zTem
5c60: 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20  p, int nTemp){. 
5c70: 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65   char *zP4 = zTe
5c80: 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54  mp;.  assert( nT
5c90: 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69  emp>=20 );.  swi
5ca0: 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  tch( pOp->p4type
5cb0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f   ){.    case P4_
5cc0: 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a 0a  KEYINFO_STATIC:.
5cd0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
5ce0: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
5cf0: 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79   i, j;.      Key
5d00: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
5d10: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
5d20: 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  o;.      sqlite3
5d30: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
5d40: 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f   zTemp, "keyinfo
5d50: 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  (%d", pKeyInfo->
5d60: 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69  nField);.      i
5d70: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
5d80: 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  30(zTemp);.     
5d90: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79   for(j=0; j<pKey
5da0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b  Info->nField; j+
5db0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
5dc0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65  Seq *pColl = pKe
5dd0: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b  yInfo->aColl[j];
5de0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
5df0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
5e00: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
5e10: 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a  trlen30(pColl->z
5e20: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
5e30: 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36   if( i+n>nTemp-6
5e40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5e50: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
5e60: 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20  ,",...",4);.    
5e70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5e80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5e90: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
5ea0: 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 20  = ',';.         
5eb0: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
5ec0: 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70 4b 65  SortOrder && pKe
5ed0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
5ee0: 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[j] ){.        
5ef0: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
5f00: 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '-';.          
5f10: 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
5f20: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43  py(&zTemp[i], pC
5f30: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b  oll->zName,n+1);
5f40: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
5f50: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
5f60: 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36   if( i+4<nTemp-6
5f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
5f80: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22  mcpy(&zTemp[i],"
5f90: 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20  ,nil",4);.      
5fa0: 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20      i += 4;.    
5fb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5fc0: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
5fd0: 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d   ')';.      zTem
5fe0: 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[i] = 0;.      
5ff0: 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20  assert( i<nTemp 
6000: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6010: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6020: 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20  4_COLLSEQ: {.   
6030: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
6040: 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c  l = pOp->p4.pCol
6050: 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
6060: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6070: 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71   zTemp, "collseq
6080: 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d  (%.20s)", pColl-
6090: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  >zName);.      b
60a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
60b0: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
60c0: 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66   {.      FuncDef
60d0: 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34   *pDef = pOp->p4
60e0: 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  .pFunc;.      sq
60f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6100: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73  Temp, zTemp, "%s
6110: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61  (%d)", pDef->zNa
6120: 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  me, pDef->nArg);
6130: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6140: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6150: 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73  INT64: {.      s
6160: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6170: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
6180: 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  lld", *pOp->p4.p
6190: 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  I64);.      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 33 32 3a 20 7b 0a 20 20  e P4_INT32: {.  
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 64 22 2c 20 70 4f 70 2d 3e 70 34  p, "%d", pOp->p4
61f0: 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .i);.      break
6200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6210: 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20   P4_REAL: {.    
6220: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6230: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6240: 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e   "%.16g", *pOp->
6250: 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20  p4.pReal);.     
6260: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6270: 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b    case P4_MEM: {
6280: 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  .      Mem *pMem
6290: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b   = pOp->p4.pMem;
62a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
62b0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
62c0: 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20  M_Null)==0 );.  
62d0: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
62e0: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ags & MEM_Str ){
62f0: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70  .        zP4 = p
6300: 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65  Mem->z;.      }e
6310: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
6320: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
6330: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6340: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6350: 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20   zTemp, "%lld", 
6360: 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20  pMem->u.i);.    
6370: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
6380: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
6390: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        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 2e  Temp, zTemp, "%.
63c0: 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a  16g", pMem->r);.
63d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
63e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
63f0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  m->flags & MEM_B
6400: 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  lob );.        z
6410: 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20  P4 = "(blob)";. 
6420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
6430: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
6440: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
6450: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
6460: 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20  ase P4_VTAB: {. 
6470: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
6480: 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  b *pVtab = pOp->
6490: 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
64a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
64b0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
64c0: 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25  Temp, "vtab:%p:%
64d0: 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62  p", pVtab, pVtab
64e0: 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20  ->pModule);.    
64f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
6500: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
6510: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
6520: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6530: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6540: 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a  p, "intarray");.
6550: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6560: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53   }.    case P4_S
6570: 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20  UBPROGRAM: {.   
6580: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6590: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
65a0: 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20  , "program");.  
65b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
65c0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
65d0: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d        zP4 = pOp-
65e0: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28  >p4.z;.      if(
65f0: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20   zP4==0 ){.     
6600: 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a     zP4 = zTemp;.
6610: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d          zTemp[0]
6620: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
6630: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
6640: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
6650: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
6660: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  if../*.** Declar
6670: 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68  e to the Vdbe th
6680: 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a  at the BTree obj
6690: 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69  ect at db->aDb[i
66a0: 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f  ] is used..*/.vo
66b0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  id sqlite3VdbeUs
66c0: 65 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c  esBtree(Vdbe *p,
66d0: 20 69 6e 74 20 69 29 7b 0a 20 20 69 6e 74 20 6d   int i){.  int m
66e0: 61 73 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ask;.  assert( i
66f0: 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e  >=0 && i<p->db->
6700: 6e 44 62 20 26 26 20 69 3c 73 69 7a 65 6f 66 28  nDb && i<sizeof(
6710: 75 33 32 29 2a 38 20 29 3b 0a 20 20 61 73 73 65  u32)*8 );.  asse
6720: 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f  rt( i<(int)sizeo
6730: 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a  f(p->btreeMask)*
6740: 38 20 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 28  8 );.  mask = ((
6750: 75 33 32 29 31 29 3c 3c 69 3b 0a 20 20 69 66 28  u32)1)<<i;.  if(
6760: 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26   (p->btreeMask &
6770: 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
6780: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d   p->btreeMask |=
6790: 20 6d 61 73 6b 3b 0a 20 20 20 20 73 71 6c 69 74   mask;.    sqlit
67a0: 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61  e3BtreeMutexArra
67b0: 79 49 6e 73 65 72 74 28 26 70 2d 3e 61 4d 75 74  yInsert(&p->aMut
67c0: 65 78 2c 20 70 2d 3e 64 62 2d 3e 61 44 62 5b 69  ex, p->db->aDb[i
67d0: 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ].pBt);.  }.}...
67e0: 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45  #if defined(VDBE
67f0: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
6800: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
6810: 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  G)./*.** Print a
6820: 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20   single opcode. 
6830: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
6840: 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
6850: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  ing only..*/.voi
6860: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
6870: 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c  ntOp(FILE *pOut,
6880: 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70   int pc, Op *pOp
6890: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a  ){.  char *zP4;.
68a0: 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b    char zPtr[50];
68b0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
68c0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d  char *zFormat1 =
68d0: 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20   "%4d %-13s %4d 
68e0: 25 34 64 20 25 34 64 20 25 2d 34 73 20 25 2e 32  %4d %4d %-4s %.2
68f0: 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70  X %s\n";.  if( p
6900: 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20  Out==0 ) pOut = 
6910: 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20  stdout;.  zP4 = 
6920: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a  displayP4(pOp, z
6930: 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72  Ptr, sizeof(zPtr
6940: 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f  ));.  fprintf(pO
6950: 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63  ut, zFormat1, pc
6960: 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  , .      sqlite3
6970: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
6980: 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31  opcode), pOp->p1
6990: 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e  , pOp->p2, pOp->
69a0: 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35  p3, zP4, pOp->p5
69b0: 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
69c0: 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f 70 2d  DEBUG.      pOp-
69d0: 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d  >zComment ? pOp-
69e0: 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a 23  >zComment : "".#
69f0: 65 6c 73 65 0a 20 20 20 20 20 20 22 22 0a 23 65  else.      "".#e
6a00: 6e 64 69 66 0a 20 20 29 3b 0a 20 20 66 66 6c 75  ndif.  );.  fflu
6a10: 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64  sh(pOut);.}.#end
6a20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  if../*.** Releas
6a30: 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20  e an array of N 
6a40: 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a  Mem elements.*/.
6a50: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
6a60: 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20  aseMemArray(Mem 
6a70: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66  *p, int N){.  if
6a80: 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20  ( p && N ){.    
6a90: 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 20 73  Mem *pEnd;.    s
6aa0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
6ab0: 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f  db;.    u8 mallo
6ac0: 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d  c_failed = db->m
6ad0: 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20  allocFailed;.   
6ae0: 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b   for(pEnd=&p[N];
6af0: 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20   p<pEnd; p++){. 
6b00: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70       assert( (&p
6b10: 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b  [1])==pEnd || p[
6b20: 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29  0].db==p[1].db )
6b30: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ;..      /* This
6b40: 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79   block is really
6b50: 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73   an inlined vers
6b60: 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
6b70: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20  beMemRelease(). 
6b80: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b       ** that tak
6b90: 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  es advantage of 
6ba0: 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
6bb0: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61  e memory cell va
6bc0: 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  lue is .      **
6bd0: 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55   being set to NU
6be0: 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73 69  LL after releasi
6bf0: 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72  ng any dynamic r
6c00: 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20  esources..      
6c10: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
6c20: 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f  justification fo
6c30: 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f  r duplicating co
6c40: 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f 72  de is that accor
6c50: 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a  ding to .      *
6c60: 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69  * callgrind, thi
6c70: 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74 61  s causes a certa
6c80: 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f 20  in test case to 
6c90: 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37 20  hit the CPU 4.7 
6ca0: 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e  .      ** percen
6cb0: 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75  t less (x86 linu
6cc0: 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34  x, gcc version 4
6cd0: 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20  .1.2, -O6) than 
6ce0: 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  if .      ** sql
6cf0: 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29  ite3MemRelease()
6d00: 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f   were called fro
6d10: 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32  m here. With -O2
6d20: 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20  , this jumps.   
6d30: 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72     ** to 6.6 per
6d40: 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63  cent. The test c
6d50: 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67  ase is inserting
6d60: 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20   1000 rows into 
6d70: 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a  a table .      *
6d80: 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65  * with no indexe
6d90: 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  s using a single
6da0: 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52 54   prepared INSERT
6db0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64   statement, bind
6dc0: 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  () .      ** and
6dd0: 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74   reset(). Insert
6de0: 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e  s are grouped in
6df0: 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  to a transaction
6e00: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
6e10: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d   if( p->flags&(M
6e20: 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d  EM_Agg|MEM_Dyn|M
6e30: 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77  EM_Frame|MEM_Row
6e40: 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Set) ){.        
6e50: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
6e60: 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20  lease(p);.      
6e70: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61  }else if( p->zMa
6e80: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
6e90: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
6ea0: 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  , p->zMalloc);. 
6eb0: 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f         p->zMallo
6ec0: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  c = 0;.      }..
6ed0: 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d        p->flags =
6ee0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d   MEM_Null;.    }
6ef0: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
6f00: 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66  ailed = malloc_f
6f10: 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ailed;.  }.}../*
6f20: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62  .** Delete a Vdb
6f30: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e  eFrame object an
6f40: 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20  d its contents. 
6f50: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
6f60: 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
6f70: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f  ed by the OP_Pro
6f80: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73  gram opcode in s
6f90: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
6fa0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6fb0: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
6fc0: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a  (VdbeFrame *p){.
6fd0: 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a    int i;.  Mem *
6fe0: 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65  aMem = VdbeFrame
6ff0: 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75  Mem(p);.  VdbeCu
7000: 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28  rsor **apCsr = (
7010: 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61  VdbeCursor **)&a
7020: 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d  Mem[p->nChildMem
7030: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
7040: 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b  p->nChildCsr; i+
7050: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
7060: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d  dbeFreeCursor(p-
7070: 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20  >v, apCsr[i]);. 
7080: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
7090: 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43  rray(aMem, p->nC
70a0: 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69  hildMem);.  sqli
70b0: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e  te3DbFree(p->v->
70c0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 0a 23 69 66 64  db, p);.}...#ifd
70d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
70e0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
70f0: 4e 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  NT.int sqlite3Vd
7100: 62 65 52 65 6c 65 61 73 65 42 75 66 66 65 72 73  beReleaseBuffers
7110: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
7120: 20 69 69 3b 0a 20 20 69 6e 74 20 6e 46 72 65 65   ii;.  int nFree
7130: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
7140: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7150: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
7160: 20 29 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20   );.  for(ii=1; 
7170: 69 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 69 2b  ii<=p->nMem; ii+
7180: 2b 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65  +){.    Mem *pMe
7190: 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 69 5d  m = &p->aMem[ii]
71a0: 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e  ;.    if( pMem->
71b0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
71c0: 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  et ){.      sqli
71d0: 74 65 33 52 6f 77 53 65 74 43 6c 65 61 72 28 70  te3RowSetClear(p
71e0: 4d 65 6d 2d 3e 75 2e 70 52 6f 77 53 65 74 29 3b  Mem->u.pRowSet);
71f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
7200: 4d 65 6d 2d 3e 7a 20 26 26 20 70 4d 65 6d 2d 3e  Mem->z && pMem->
7210: 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 20 29 7b  flags&MEM_Dyn ){
7220: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
7230: 70 4d 65 6d 2d 3e 78 44 65 6c 20 29 3b 0a 20 20  pMem->xDel );.  
7240: 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 71 6c      nFree += sql
7250: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
7260: 28 70 4d 65 6d 2d 3e 64 62 2c 20 70 4d 65 6d 2d  (pMem->db, pMem-
7270: 3e 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  >z);.      sqlit
7280: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
7290: 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  (pMem);.    }.  
72a0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 46 72 65 65  }.  return nFree
72b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
72c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
72d0: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
72e0: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
72f0: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
7300: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
7310: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
7320: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
7330: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
7340: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
7350: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
7360: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
7370: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
7380: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
7390: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
73a0: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
73b0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
73c0: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
73d0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
73e0: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68  explain==1, each
73f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
7400: 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a  listed.  When.**
7410: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20   p->explain==2, 
7420: 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20  only OP_Explain 
7430: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
7440: 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73   listed and thes
7450: 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69  e.** are shown i
7460: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f  n a different fo
7470: 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69  rmat.  p->explai
7480: 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20  n==2 is used to 
7490: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50  implement.** EXP
74a0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
74b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
74c0: 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20  dbeList(.  Vdbe 
74d0: 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *p              
74e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
74f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f   */.){.  int nRo
7500: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
7510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7520: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
7530: 20 72 6f 77 73 20 74 6f 20 72 65 74 75 72 6e 20   rows to return 
7540: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  */.  int nSub = 
7550: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
7560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7570: 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ber of sub-vdbes
7580: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
7590: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
75a0: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
75b0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
75c0: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a  of sub-vdbes */.
75d0: 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b    Mem *pSub = 0;
75e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
75f0: 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b   p->db;.  int i;
7600: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
7610: 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 20 2a 70 4d  TE_OK;.  Mem *pM
7620: 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53  em = p->pResultS
7630: 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  et = &p->aMem[1]
7640: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
7650: 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73  explain );.  ass
7660: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
7670: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b  DBE_MAGIC_RUN );
7680: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d  .  assert( db->m
7690: 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47  agic==SQLITE_MAG
76a0: 49 43 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73  IC_BUSY );.  ass
76b0: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
76c0: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
76d0: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70  SQLITE_BUSY || p
76e0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
76f0: 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  EM );..  /* Even
7700: 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63   though this opc
7710: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ode does not use
7720: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73   dynamic strings
7730: 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65   for.  ** the re
7740: 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c  sult, result col
7750: 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20  umns may become 
7760: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
7770: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
7780: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
7790: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
77a0: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
77b0: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
77c0: 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
77d0: 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38  MemArray(pMem, 8
77e0: 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  );..  if( p->rc=
77f0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
7800: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
7810: 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63  pens if a malloc
7820: 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c  () inside a call
7830: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   to sqlite3_colu
7840: 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20  mn_text() or.   
7850: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
7860: 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c  mn_text16() fail
7870: 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e  ed.  */.    db->
7880: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
7890: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
78a0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
78b0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
78c0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
78d0: 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
78e0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
78f0: 69 73 20 0a 20 20 2a 2a 20 45 58 50 4c 41 49 4e  is .  ** EXPLAIN
7900: 20 70 72 6f 67 72 61 6d 2e 20 20 2a 2f 0a 20 20   program.  */.  
7910: 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  nRow = p->nOp;. 
7920: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
7930: 3d 31 20 29 7b 0a 20 20 20 20 70 53 75 62 20 3d  =1 ){.    pSub =
7940: 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20   &p->aMem[9];.  
7950: 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67    if( pSub->flag
7960: 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  s&MEM_Blob ){.  
7970: 20 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d      nSub = pSub-
7980: 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29  >n/sizeof(Vdbe*)
7990: 3b 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20  ;.      apSub = 
79a0: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
79b0: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20  Sub->z;.    }.  
79c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
79d0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  b; i++){.      n
79e0: 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d  Row += apSub[i]-
79f0: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >nOp;.    }.  }.
7a00: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70  .  do{.    i = p
7a10: 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  ->pc++;.  }while
7a20: 28 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65  ( i<nRow && p->e
7a30: 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e  xplain==2 && p->
7a40: 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f  aOp[i].opcode!=O
7a50: 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69  P_Explain );.  i
7a60: 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20  f( i>=nRow ){.  
7a70: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
7a80: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
7a90: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
7aa0: 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73  se if( db->u1.is
7ab0: 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20  Interrupted ){. 
7ac0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
7ad0: 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20  E_INTERRUPT;.   
7ae0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
7af0: 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  OR;.    sqlite3S
7b00: 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
7b10: 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20  rMsg, db, "%s", 
7b20: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d  sqlite3ErrStr(p-
7b30: 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  >rc));.  }else{.
7b40: 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
7b50: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66   Op *pOp;.    if
7b60: 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  ( i<p->nOp ){.  
7b70: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f      pOp = &p->aO
7b80: 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  p[i];.    }else{
7b90: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
7ba0: 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b      i -= p->nOp;
7bb0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
7bc0: 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  i>=apSub[j]->nOp
7bd0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
7be0: 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e  i -= apSub[j]->n
7bf0: 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Op;.      }.    
7c00: 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a    pOp = &apSub[j
7c10: 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  ]->aOp[i];.    }
7c20: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
7c30: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
7c40: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
7c50: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
7c60: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
7c70: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
7c80: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20  pMem->u.i = i;  
7c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7cb0: 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   Program counter
7cc0: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b   */.      pMem++
7cd0: 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ;.  .      pMem-
7ce0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61  >flags = MEM_Sta
7cf0: 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  tic|MEM_Str|MEM_
7d00: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
7d10: 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ->z = (char*)sql
7d20: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
7d30: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a  Op->opcode);  /*
7d40: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   Opcode */.     
7d50: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
7d60: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65  !=0 );.      pMe
7d70: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
7d80: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
7d90: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  .      pMem->typ
7da0: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
7db0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
7dc0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
7dd0: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20        pMem++;.. 
7de0: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34       if( pOp->p4
7df0: 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47  type==P4_SUBPROG
7e00: 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  RAM ){.        i
7e10: 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62  nt nByte = (nSub
7e20: 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  +1)*sizeof(SubPr
7e30: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20  ogram*);.       
7e40: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
7e50: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b  for(j=0; j<nSub;
7e60: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
7e70: 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70   if( apSub[j]==p
7e80: 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20  Op->p4.pProgram 
7e90: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
7ea0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
7eb0: 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45  ==nSub && SQLITE
7ec0: 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65  _OK==sqlite3Vdbe
7ed0: 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42  MemGrow(pSub, nB
7ee0: 79 74 65 2c 20 31 29 20 29 7b 0a 20 20 20 20 20  yte, 1) ){.     
7ef0: 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75       apSub = (Su
7f00: 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62  bProgram **)pSub
7f10: 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ->z;.          a
7f20: 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70  pSub[nSub++] = p
7f30: 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b  Op->p4.pProgram;
7f40: 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d  .          pSub-
7f50: 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c  >flags |= MEM_Bl
7f60: 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ob;.          pS
7f70: 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a  ub->n = nSub*siz
7f80: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
7f90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7fa0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
7fb0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
7fc0: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
7fd0: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20  u.i = pOp->p1;  
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ff0: 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f          /* P1 */
8000: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
8010: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
8020: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
8030: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
8040: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
8050: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
8060: 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
8070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8080: 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  2 */.    pMem->t
8090: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
80a0: 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  EGER;.    pMem++
80b0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78  ;..    if( p->ex
80c0: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
80d0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
80e0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
80f0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
8100: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p3;             
8110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8120: 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P3 */.      pMem
8130: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
8140: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70  INTEGER;.      p
8150: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  Mem++;.    }..  
8160: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
8170: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33  eMemGrow(pMem, 3
8180: 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20 20  2, 0) ){        
8190: 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20      /* P4 */.   
81a0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
81b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
81c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
81d0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
81e0: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61   }.    pMem->fla
81f0: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
8200: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
8210: 20 20 20 7a 20 3d 20 64 69 73 70 6c 61 79 50 34     z = displayP4
8220: 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33  (pOp, pMem->z, 3
8230: 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d 70  2);.    if( z!=p
8240: 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  Mem->z ){.      
8250: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
8260: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31  tStr(pMem, z, -1
8270: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
8280: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8290: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
82a0: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
82b0: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
82c0: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
82d0: 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  z);.      pMem->
82e0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
82f0: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  8;.    }.    pMe
8300: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
8310: 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b  _TEXT;.    pMem+
8320: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  +;..    if( p->e
8330: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
8340: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
8350: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20  beMemGrow(pMem, 
8360: 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  4, 0) ){.       
8370: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
8380: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
8390: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
83a0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
83b0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
83c0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e  >flags = MEM_Dyn
83d0: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
83e0: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  m;.      pMem->n
83f0: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
8400: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20  te3_snprintf(3, 
8410: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c  pMem->z, "%.2x",
8420: 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20   pOp->p5);   /* 
8430: 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P5 */.      pMem
8440: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
8450: 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d  TEXT;.      pMem
8460: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
8470: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
8480: 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c  +;.  .#ifdef SQL
8490: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
84a0: 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  if( pOp->zCommen
84b0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  t ){.        pMe
84c0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
84d0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
84e0: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70       pMem->z = p
84f0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20  Op->zComment;.  
8500: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
8510: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
8520: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
8530: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
8540: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
8550: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
8560: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
8570: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
8580: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
8590: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
85a0: 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  M_Null;         
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
85c0: 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20   Comment */.    
85d0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
85e0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20   SQLITE_NULL;.  
85f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
8600: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
8610: 20 38 20 2d 20 35 2a 28 70 2d 3e 65 78 70 6c 61   8 - 5*(p->expla
8620: 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63  in-1);.    p->rc
8630: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8640: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
8650: 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  W;.  }.  return 
8660: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
8670: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
8680: 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AIN */..#ifdef S
8690: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
86a0: 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20  * Print the SQL 
86b0: 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f  that was used to
86c0: 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45   generate a VDBE
86d0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
86e0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
86f0: 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ntSql(Vdbe *p){.
8700: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e    int nOp = p->n
8710: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  Op;.  VdbeOp *pO
8720: 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29  p;.  if( nOp<1 )
8730: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d   return;.  pOp =
8740: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69   &p->aOp[0];.  i
8750: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
8760: 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d  OP_Trace && pOp-
8770: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
8780: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
8790: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77  pOp->p4.z;.    w
87a0: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73  hile( sqlite3Iss
87b0: 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a  pace(*z) ) z++;.
87c0: 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a      printf("SQL:
87d0: 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20   [%s]\n", z);.  
87e0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
87f0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8800: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
8810: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
8820: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a  ABLE_IOTRACE)./*
8830: 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54  .** Print an IOT
8840: 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f  RACE message sho
8850: 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74  wing SQL content
8860: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8870: 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28  3VdbeIOTraceSql(
8880: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
8890: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
88a0: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
88b0: 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63  f( sqlite3IoTrac
88c0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
88d0: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
88e0: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
88f0: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70  >aOp[0];.  if( p
8900: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54  Op->opcode==OP_T
8910: 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e  race && pOp->p4.
8920: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  z!=0 ){.    int 
8930: 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a  i, j;.    char z
8940: 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69  [1000];.    sqli
8950: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
8960: 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c  eof(z), z, "%s",
8970: 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20   pOp->p4.z);.   
8980: 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65   for(i=0; sqlite
8990: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20  3Isspace(z[i]); 
89a0: 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a  i++){}.    for(j
89b0: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
89c0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
89d0: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29  3Isspace(z[i]) )
89e0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
89f0: 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20  i-1]!=' ' ){.   
8a00: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
8a10: 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ' ';.        }. 
8a20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8a30: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
8a40: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
8a50: 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20  .    z[j] = 0;. 
8a60: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
8a70: 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29  e("SQL %s\n", z)
8a80: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
8a90: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  * !SQLITE_OMIT_T
8aa0: 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45  RACE && SQLITE_E
8ab0: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f  NABLE_IOTRACE */
8ac0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
8ad0: 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69   space from a fi
8ae0: 78 65 64 20 73 69 7a 65 20 62 75 66 66 65 72 2e  xed size buffer.
8af0: 20 20 4d 61 6b 65 20 2a 70 70 20 70 6f 69 6e 74    Make *pp point
8b00: 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63   to the.** alloc
8b10: 61 74 65 64 20 73 70 61 63 65 2e 20 20 28 4e 6f  ated space.  (No
8b20: 74 65 3a 20 20 70 70 20 69 73 20 61 20 63 68 61  te:  pp is a cha
8b30: 72 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  r* rather than a
8b40: 20 76 6f 69 64 2a 2a 20 74 6f 0a 2a 2a 20 77 6f   void** to.** wo
8b50: 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 6f  rk around the po
8b60: 69 6e 74 65 72 20 61 6c 69 61 73 69 6e 67 20 72  inter aliasing r
8b70: 75 6c 65 73 20 6f 66 20 43 2e 29 20 20 2a 70 70  ules of C.)  *pp
8b80: 20 73 68 6f 75 6c 64 20 69 6e 69 74 69 61 6c 6c   should initiall
8b90: 79 0a 2a 2a 20 62 65 20 7a 65 72 6f 2e 20 20 49  y.** be zero.  I
8ba0: 66 20 2a 70 70 20 69 73 20 6e 6f 74 20 7a 65 72  f *pp is not zer
8bb0: 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
8bc0: 61 74 20 74 68 65 20 73 70 61 63 65 20 68 61 73  at the space has
8bd0: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
8be0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
8bf0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
8c00: 20 6e 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79   noop..**.** nBy
8c10: 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  te is the number
8c20: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
8c30: 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  ce needed..**.**
8c40: 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74 20 74   *ppFrom point t
8c50: 6f 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63  o available spac
8c60: 65 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74  e and pEnd point
8c70: 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  s to the end of 
8c80: 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  the.** available
8c90: 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70   space..**.** *p
8ca0: 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74  nByte is a count
8cb0: 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  er of the number
8cc0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
8cd0: 63 65 20 74 68 61 74 20 68 61 76 65 20 66 61 69  ce that have fai
8ce0: 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61  led.** to alloca
8cf0: 74 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  te.  If there is
8d00: 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70   insufficient sp
8d10: 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74  ace in *ppFrom t
8d20: 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a  o satisfy the.**
8d30: 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69   request, then i
8d40: 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65  ncrement *pnByte
8d50: 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   by the amount o
8d60: 66 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a  f the request..*
8d70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c  /.static void al
8d80: 6c 6f 63 53 70 61 63 65 28 0a 20 20 63 68 61 72  locSpace(.  char
8d90: 20 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20   *pp,           
8da0: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 65 74 20   /* IN/OUT: Set 
8db0: 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  *pp to point to 
8dc0: 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
8dd0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
8de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8df0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
8e00: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75   allocate */.  u
8e10: 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20  8 **ppFrom,     
8e20: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41      /* IN/OUT: A
8e30: 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70 70  llocate from *pp
8e40: 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45  From */.  u8 *pE
8e50: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd,            /
8e60: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62  * Pointer to 1 b
8e70: 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  yte past the end
8e80: 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66 66   of *ppFrom buff
8e90: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42  er */.  int *pnB
8ea0: 79 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20  yte          /* 
8eb0: 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61  If allocation ca
8ec0: 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69 6e  nnot be made, in
8ed0: 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20  crement *pnByte 
8ee0: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
8ef0: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
8f00: 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b  MENT(*ppFrom) );
8f10: 0a 20 20 69 66 28 20 28 2a 28 76 6f 69 64 2a 2a  .  if( (*(void**
8f20: 29 70 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  )pp)==0 ){.    n
8f30: 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42  Byte = ROUND8(nB
8f40: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 26 28  yte);.    if( &(
8f50: 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20  *ppFrom)[nByte] 
8f60: 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  <= pEnd ){.     
8f70: 20 2a 28 76 6f 69 64 2a 2a 29 70 70 20 3d 20 28   *(void**)pp = (
8f80: 76 6f 69 64 20 2a 29 2a 70 70 46 72 6f 6d 3b 0a  void *)*ppFrom;.
8f90: 20 20 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d        *ppFrom +=
8fa0: 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 65 6c 73   nByte;.    }els
8fb0: 65 7b 0a 20 20 20 20 20 20 2a 70 6e 42 79 74 65  e{.      *pnByte
8fc0: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d   += nByte;.    }
8fd0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  .  }.}../*.** Pr
8fe0: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20  epare a virtual 
8ff0: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63  machine for exec
9000: 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76  ution.  This inv
9010: 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63  olves things suc
9020: 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69  h.** as allocati
9030: 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61  ng stack space a
9040: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
9050: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
9060: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
9070: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
9080: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
9090: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
90a0: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
90b0: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
90c0: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
90d0: 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  This is the only
90e0: 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 61 20 56   way to move a V
90f0: 44 42 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  DBE from VDBE_MA
9100: 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56  GIC_INIT to.** V
9110: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a  DBE_MAGIC_RUN..*
9120: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9130: 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
9140: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20   more than once 
9150: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 76 69 72 74  on a single virt
9160: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20  ual machine..** 
9170: 54 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 69  The first call i
9180: 73 20 6d 61 64 65 20 77 68 69 6c 65 20 63 6f 6d  s made while com
9190: 70 69 6c 69 6e 67 20 74 68 65 20 53 51 4c 20 73  piling the SQL s
91a0: 74 61 74 65 6d 65 6e 74 2e 20 53 75 62 73 65 71  tatement. Subseq
91b0: 75 65 6e 74 0a 2a 2a 20 63 61 6c 6c 73 20 61 72  uent.** calls ar
91c0: 65 20 6d 61 64 65 20 61 73 20 70 61 72 74 20 6f  e made as part o
91d0: 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66  f the process of
91e0: 20 72 65 73 65 74 74 69 6e 67 20 61 20 73 74 61   resetting a sta
91f0: 74 65 6d 65 6e 74 20 74 6f 20 62 65 0a 2a 2a 20  tement to be.** 
9200: 72 65 2d 65 78 65 63 75 74 65 64 20 28 66 72 6f  re-executed (fro
9210: 6d 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  m a call to sqli
9220: 74 65 33 5f 72 65 73 65 74 28 29 29 2e 20 54 68  te3_reset()). Th
9230: 65 20 6e 56 61 72 2c 20 6e 4d 65 6d 2c 20 6e 43  e nVar, nMem, nC
9240: 75 72 73 6f 72 20 0a 2a 2a 20 61 6e 64 20 69 73  ursor .** and is
9250: 45 78 70 6c 61 69 6e 20 70 61 72 61 6d 65 74 65  Explain paramete
9260: 72 73 20 61 72 65 20 6f 6e 6c 79 20 70 61 73 73  rs are only pass
9270: 65 64 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  ed correct value
9280: 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
9290: 0a 2a 2a 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  .** the function
92a0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 4f 6e 20 73   is called. On s
92b0: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 2c  ubsequent calls,
92c0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65   from sqlite3_re
92d0: 73 65 74 28 29 2c 20 6e 56 61 72 0a 2a 2a 20 69  set(), nVar.** i
92e0: 73 20 70 61 73 73 65 64 20 2d 31 20 61 6e 64 20  s passed -1 and 
92f0: 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72 20 61 6e  nMem, nCursor an
9300: 64 20 69 73 45 78 70 6c 61 69 6e 20 61 72 65 20  d isExplain are 
9310: 61 6c 6c 20 70 61 73 73 65 64 20 7a 65 72 6f 2e  all passed zero.
9320: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9330: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20  VdbeMakeReady(. 
9340: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9360: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20  /* The VDBE */. 
9370: 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20 20 20   int nVar,      
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9390: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27  /* Number of '?'
93a0: 20 73 65 65 20 69 6e 20 74 68 65 20 53 51 4c 20   see in the SQL 
93b0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
93c0: 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20  nt nMem,        
93d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
93e0: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72   Number of memor
93f0: 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63  y cells to alloc
9400: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ate */.  int nCu
9410: 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  rsor,           
9420: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9430: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 74 6f 20  r of cursors to 
9440: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e  allocate */.  in
9450: 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9470: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
9480: 66 20 61 72 67 73 20 69 6e 20 53 75 62 50 72 6f  f args in SubPro
9490: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 69  grams */.  int i
94a0: 73 45 78 70 6c 61 69 6e 2c 20 20 20 20 20 20 20  sExplain,       
94b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
94c0: 65 20 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e  e if the EXPLAIN
94d0: 20 6b 65 79 77 6f 72 64 73 20 69 73 20 70 72 65   keywords is pre
94e0: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 75 73  sent */.  int us
94f0: 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 20 20  esStmtJournal   
9500: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
9510: 20 74 6f 20 73 65 74 20 56 64 62 65 2e 75 73 65   to set Vdbe.use
9520: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 2a 2f 0a  sStmtJournal */.
9530: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
9540: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
9550: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  b;..  assert( p!
9560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9570: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
9580: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20  AGIC_INIT );..  
9590: 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  /* There should 
95a0: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
95b0: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  opcode..  */.  a
95c0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
95d0: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
95e0: 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d   magic to VDBE_M
95f0: 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20  AGIC_RUN sooner 
9600: 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
9610: 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63  r. */.  p->magic
9620: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
9630: 4e 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63  N;..  /* For eac
9640: 68 20 63 75 72 73 6f 72 20 72 65 71 75 69 72 65  h cursor require
9650: 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  d, also allocate
9660: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20   a memory cell. 
9670: 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c  Memory.  ** cell
9680: 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f  s (nMem+1-nCurso
9690: 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73  r)..nMem, inclus
96a0: 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20  ive, will never 
96b0: 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20  be used by.  ** 
96c0: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
96d0: 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79 20 61  . Instead they a
96e0: 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  re used to alloc
96f0: 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20  ate space for.  
9700: 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74  ** VdbeCursor/Bt
9710: 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65  Cursor structure
9720: 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d  s. The blob of m
9730: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
9740: 20 77 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73   with .  ** curs
9750: 6f 72 20 30 20 69 73 20 73 74 6f 72 65 64 20 69  or 0 is stored i
9760: 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d  n memory cell nM
9770: 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20  em. Memory cell 
9780: 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74  (nMem-1).  ** st
9790: 6f 72 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66  ores the blob of
97a0: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
97b0: 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 31  ed with cursor 1
97c0: 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  , etc..  **.  **
97d0: 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63   See also: alloc
97e0: 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a  ateCursor()..  *
97f0: 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72  /.  nMem += nCur
9800: 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  sor;..  /* Alloc
9810: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
9820: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 2c 20  mory registers, 
9830: 53 51 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56  SQL variables, V
9840: 44 42 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20  DBE cursors and 
9850: 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74  .  ** an array t
9860: 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75  o marshal SQL fu
9870: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
9880: 20 69 6e 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c   in. This is onl
9890: 79 20 64 6f 6e 65 20 74 68 65 0a 20 20 2a 2a 20  y done the.  ** 
98a0: 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
98b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
98c0: 65 64 20 66 6f 72 20 61 20 67 69 76 65 6e 20 56  ed for a given V
98d0: 44 42 45 2c 20 6e 6f 74 20 77 68 65 6e 20 69 74  DBE, not when it
98e0: 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 63   is.  ** being c
98f0: 61 6c 6c 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  alled from sqlit
9900: 65 33 5f 72 65 73 65 74 28 29 20 74 6f 20 72 65  e3_reset() to re
9910: 73 65 74 20 74 68 65 20 76 69 72 74 75 61 6c 20  set the virtual 
9920: 6d 61 63 68 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20  machine..  */.  
9930: 69 66 28 20 6e 56 61 72 3e 3d 30 20 26 26 20 41  if( nVar>=0 && A
9940: 4c 57 41 59 53 28 64 62 2d 3e 6d 61 6c 6c 6f 63  LWAYS(db->malloc
9950: 46 61 69 6c 65 64 3d 3d 30 29 20 29 7b 0a 20 20  Failed==0) ){.  
9960: 20 20 75 38 20 2a 7a 43 73 72 20 3d 20 28 75 38    u8 *zCsr = (u8
9970: 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   *)&p->aOp[p->nO
9980: 70 5d 3b 0a 20 20 20 20 75 38 20 2a 7a 45 6e 64  p];.    u8 *zEnd
9990: 20 3d 20 28 75 38 20 2a 29 26 70 2d 3e 61 4f 70   = (u8 *)&p->aOp
99a0: 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 0a 20  [p->nOpAlloc];. 
99b0: 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20     int nByte;.  
99c0: 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65    resolveP2Value
99d0: 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20  s(p, &nArg);.   
99e0: 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
99f0: 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 73 53 74  nal = (u8)usesSt
9a00: 6d 74 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 69  mtJournal;.    i
9a10: 66 28 20 69 73 45 78 70 6c 61 69 6e 20 26 26 20  f( isExplain && 
9a20: 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 20  nMem<10 ){.     
9a30: 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 20 20   nMem = 10;.    
9a40: 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 43 73  }.    memset(zCs
9a50: 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29  r, 0, zEnd-zCsr)
9a60: 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 28 7a  ;.    zCsr += (z
9a70: 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26 37 3b  Csr - (u8*)0)&7;
9a80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 45 49 47  .    assert( EIG
9a90: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
9aa0: 54 28 7a 43 73 72 29 20 29 3b 0a 0a 20 20 20 20  T(zCsr) );..    
9ab0: 64 6f 20 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  do {.      nByte
9ac0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 6c 6c 6f   = 0;.      allo
9ad0: 63 53 70 61 63 65 28 28 63 68 61 72 2a 29 26 70  cSpace((char*)&p
9ae0: 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a  ->aMem, nMem*siz
9af0: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
9b00: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
9b10: 20 20 20 20 20 20 61 6c 6c 6f 63 53 70 61 63 65        allocSpace
9b20: 28 28 63 68 61 72 2a 29 26 70 2d 3e 61 56 61 72  ((char*)&p->aVar
9b30: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65  , nVar*sizeof(Me
9b40: 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  m), &zCsr, zEnd,
9b50: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20   &nByte);.      
9b60: 61 6c 6c 6f 63 53 70 61 63 65 28 28 63 68 61 72  allocSpace((char
9b70: 2a 29 26 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72  *)&p->apArg, nAr
9b80: 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20  g*sizeof(Mem*), 
9b90: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
9ba0: 79 74 65 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f  yte);.      allo
9bb0: 63 53 70 61 63 65 28 28 63 68 61 72 2a 29 26 70  cSpace((char*)&p
9bc0: 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69  ->azVar, nVar*si
9bd0: 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43  zeof(char*), &zC
9be0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
9bf0: 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 53 70  );.      allocSp
9c00: 61 63 65 28 28 63 68 61 72 2a 29 26 70 2d 3e 61  ace((char*)&p->a
9c10: 70 43 73 72 2c 20 0a 20 20 20 20 20 20 20 20 20  pCsr, .         
9c20: 20 20 20 20 20 20 20 20 6e 43 75 72 73 6f 72 2a          nCursor*
9c30: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
9c40: 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  r*), &zCsr, zEnd
9c50: 2c 20 26 6e 42 79 74 65 0a 20 20 20 20 20 20 29  , &nByte.      )
9c60: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 42 79 74  ;.      if( nByt
9c70: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  e ){.        p->
9c80: 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  pFree = sqlite3D
9c90: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
9ca0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nByte);.      }.
9cb0: 20 20 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e        zCsr = p->
9cc0: 70 46 72 65 65 3b 0a 20 20 20 20 20 20 7a 45 6e  pFree;.      zEn
9cd0: 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d  d = &zCsr[nByte]
9ce0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 42  ;.    }while( nB
9cf0: 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  yte && !db->mall
9d00: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20  ocFailed );..   
9d10: 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75   p->nCursor = (u
9d20: 31 36 29 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20  16)nCursor;.    
9d30: 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20  if( p->aVar ){. 
9d40: 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28       p->nVar = (
9d50: 75 31 36 29 6e 56 61 72 3b 0a 20 20 20 20 20 20  u16)nVar;.      
9d60: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b  for(n=0; n<nVar;
9d70: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   n++){.        p
9d80: 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20  ->aVar[n].flags 
9d90: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
9da0: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
9db0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a  b = db;.      }.
9dc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
9dd0: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 70  >aMem ){.      p
9de0: 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20  ->aMem--;       
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9e00: 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72  * aMem[] goes fr
9e10: 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20  om 1..nMem */.  
9e20: 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
9e30: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
9e40: 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74      /*       not
9e50: 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20   from 0..nMem-1 
9e60: 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31  */.      for(n=1
9e70: 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b  ; n<=nMem; n++){
9e80: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  .        p->aMem
9e90: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
9ea0: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d  Null;.        p-
9eb0: 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aMem[n].db = db
9ec0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9ed0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
9ee0: 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 6e 3d  E_DEBUG.  for(n=
9ef0: 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b  1; n<p->nMem; n+
9f00: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
9f10: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64  p->aMem[n].db==d
9f20: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
9f30: 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20  .  p->pc = -1;. 
9f40: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
9f50: 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63  OK;.  p->errorAc
9f60: 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
9f70: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d  .  p->explain |=
9f80: 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d   isExplain;.  p-
9f90: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
9fa0: 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43  GIC_RUN;.  p->nC
9fb0: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
9fc0: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20  cacheCtr = 1;.  
9fd0: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
9fe0: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70  ormat = 255;.  p
9ff0: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
a000: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
a010: 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e  OFILE.  {.    in
a020: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
a030: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
a040: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69  {.      p->aOp[i
a050: 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  ].cnt = 0;.     
a060: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
a070: 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  s = 0;.    }.  }
a080: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
a090: 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75   Close a VDBE cu
a0a0: 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65  rsor and release
a0b0: 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63   all the resourc
a0c0: 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a  es that cursor .
a0d0: 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f  ** happens to ho
a0e0: 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
a0f0: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
a100: 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43  r(Vdbe *p, VdbeC
a110: 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69  ursor *pCx){.  i
a120: 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20  f( pCx==0 ){.   
a130: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
a140: 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20  f( pCx->pBt ){. 
a150: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
a160: 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a  lose(pCx->pBt);.
a170: 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e      /* The pCx->
a180: 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20  pCursor will be 
a190: 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61  close automatica
a1a0: 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74  lly, if it exist
a1b0: 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65  s, by.    ** the
a1c0: 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a   call above. */.
a1d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d    }else if( pCx-
a1e0: 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
a1f0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
a200: 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75  eCursor(pCx->pCu
a210: 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  rsor);.  }.#ifnd
a220: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
a230: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
a240: 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  ( pCx->pVtabCurs
a250: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
a260: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
a270: 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78  VtabCursor = pCx
a280: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  ->pVtabCursor;. 
a290: 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
a2a0: 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
a2b0: 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b   = pCx->pModule;
a2c0: 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  .    p->inVtabMe
a2d0: 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 28 76  thod = 1;.    (v
a2e0: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
a2f0: 79 4f 66 66 28 70 2d 3e 64 62 29 3b 0a 20 20 20  yOff(p->db);.   
a300: 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
a310: 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20  (pVtabCursor);. 
a320: 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
a330: 53 61 66 65 74 79 4f 6e 28 70 2d 3e 64 62 29 3b  SafetyOn(p->db);
a340: 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  .    p->inVtabMe
a350: 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  thod = 0;.  }.#e
a360: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ndif.}../*.** Co
a370: 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 73 74  py the values st
a380: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62 65  ored in the Vdbe
a390: 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 65 20  Frame structure 
a3a0: 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68 69  to its Vdbe. Thi
a3b0: 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f  s.** is used, fo
a3c0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
a3d0: 61 20 74 72 69 67 67 65 72 20 73 75 62 2d 70 72  a trigger sub-pr
a3e0: 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20  ogram is halted 
a3f0: 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f  to restore.** co
a400: 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69  ntrol to the mai
a410: 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e  n program..*/.in
a420: 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  t sqlite3VdbeFra
a430: 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 46 72  meRestore(VdbeFr
a440: 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20  ame *pFrame){.  
a450: 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65  Vdbe *v = pFrame
a460: 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20  ->v;.  v->aOp = 
a470: 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76  pFrame->aOp;.  v
a480: 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e  ->nOp = pFrame->
a490: 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d  nOp;.  v->aMem =
a4a0: 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20   pFrame->aMem;. 
a4b0: 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d   v->nMem = pFram
a4c0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70  e->nMem;.  v->ap
a4d0: 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70  Csr = pFrame->ap
a4e0: 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f  Csr;.  v->nCurso
a4f0: 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72  r = pFrame->nCur
a500: 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61  sor;.  v->db->la
a510: 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65  stRowid = pFrame
a520: 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76  ->lastRowid;.  v
a530: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61  ->nChange = pFra
a540: 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72  me->nChange;.  r
a550: 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63  eturn pFrame->pc
a560: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
a570: 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a   all cursors..**
a580: 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65  .** Also release
a590: 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d   any dynamic mem
a5a0: 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20  ory held by the 
a5b0: 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61  VM in the Vdbe.a
a5c0: 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63  Mem memory .** c
a5d0: 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20  ell array. This 
a5e0: 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  is necessary as 
a5f0: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
a600: 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69  array may contai
a610: 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f  n.** pointers to
a620: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
a630: 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e  ts, which may in
a640: 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f   turn contain po
a650: 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65  inters to.** ope
a660: 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74  n cursors..*/.st
a670: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41  atic void closeA
a680: 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a  llCursors(Vdbe *
a690: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72  p){.  if( p->pFr
a6a0: 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
a6b0: 72 61 6d 65 20 2a 70 46 72 61 6d 65 20 3d 20 70  rame *pFrame = p
a6c0: 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f  ->pFrame;.    fo
a6d0: 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61  r(pFrame=p->pFra
a6e0: 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72  me; pFrame->pPar
a6f0: 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61  ent; pFrame=pFra
a700: 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  me->pParent);.  
a710: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
a720: 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65  meRestore(pFrame
a730: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61  );.  }.  p->pFra
a740: 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72  me = 0;.  p->nFr
a750: 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ame = 0;..  if( 
a760: 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20  p->apCsr ){.    
a770: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
a780: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
a790: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64  ; i++){.      Vd
a7a0: 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70  beCursor *pC = p
a7b0: 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20  ->apCsr[i];.    
a7c0: 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20    if( pC ){.    
a7d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
a7e0: 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29  reeCursor(p, pC)
a7f0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43  ;.        p->apC
a800: 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  sr[i] = 0;.     
a810: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
a820: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
a830: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
a840: 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70  y(&p->aMem[1], p
a850: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a  ->nMem);.  }.}..
a860: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74  /*.** Clean up t
a870: 68 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63  he VM after exec
a880: 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ution..**.** Thi
a890: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61  s routine will a
a8a0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
a8b0: 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20  se any cursors, 
a8c0: 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a  lists, and/or.**
a8d0: 20 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65   sorters that we
a8e0: 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49  re left open.  I
a8f0: 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74  t also deletes t
a900: 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20  he values of.** 
a910: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65  variables in the
a920: 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a   aVar[] array..*
a930: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c  /.static void Cl
a940: 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a  eanup(Vdbe *p){.
a950: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a960: 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53  p->db;..#ifdef S
a970: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
a980: 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28   Execute assert(
a990: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
a9a0: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
a9b0: 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64  Vdbe.apCsr[] and
a9c0: 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d   .  ** Vdbe.aMem
a9d0: 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61  [] arrays have a
a9e0: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61  lready been clea
a9f0: 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e  ned up.  */.  in
aa00: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
aa10: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
aa20: 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70  +) assert( p->ap
aa30: 43 73 72 3d 3d 30 20 7c 7c 20 70 2d 3e 61 70 43  Csr==0 || p->apC
aa40: 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 66 6f  sr[i]==0 );.  fo
aa50: 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65  r(i=1; i<=p->nMe
aa60: 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  m; i++) assert( 
aa70: 70 2d 3e 61 4d 65 6d 3d 3d 30 20 7c 7c 20 70 2d  p->aMem==0 || p-
aa80: 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d  >aMem[i].flags==
aa90: 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 23 65 6e 64  MEM_Null );.#end
aaa0: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  if..  sqlite3DbF
aab0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
aac0: 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
aad0: 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73  g = 0;.  p->pRes
aae0: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  ultSet = 0;.}../
aaf0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d  *.** Set the num
ab00: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
ab10: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
ab20: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
ab30: 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65  his SQL.** state
ab40: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  ment. This is no
ab50: 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  w set at compile
ab60: 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68   time, rather th
ab70: 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65  an during.** exe
ab80: 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64  cution of the vd
ab90: 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68  be program so th
aba0: 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  at sqlite3_colum
abb0: 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a  n_count() can.**
abc0: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   be called on an
abd0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
abe0: 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74  efore sqlite3_st
abf0: 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ep()..*/.void sq
ac00: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
ac10: 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ols(Vdbe *p, int
ac20: 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20   nResColumn){.  
ac30: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
ac40: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
ac50: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
ac60: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
ac70: 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
ac80: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
ac90: 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74  NAME_N);.  sqlit
aca0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
acb0: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d  aColName);.  n =
acc0: 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e   nResColumn*COLN
acd0: 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73  AME_N;.  p->nRes
ace0: 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52  Column = (u16)nR
acf0: 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61  esColumn;.  p->a
ad00: 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61  ColName = pColNa
ad10: 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74  me = (Mem*)sqlit
ad20: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
ad30: 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e  b, sizeof(Mem)*n
ad40: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f   );.  if( p->aCo
ad50: 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  lName==0 ) retur
ad60: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  n;.  while( n-- 
ad70: 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e  > 0 ){.    pColN
ad80: 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  ame->flags = MEM
ad90: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e  _Null;.    pColN
ada0: 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  ame->db = p->db;
adb0: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b  .    pColName++;
adc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
add0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
ade0: 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20  e idx'th column 
adf0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
ae00: 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  y the SQL statem
ae10: 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75  ent..** zName mu
ae20: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
ae30: 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61  to a nul termina
ae40: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ted string..**.*
ae50: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  * This call must
ae60: 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61   be made after a
ae70: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
ae80: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29  VdbeSetNumCols()
ae90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61  ..**.** The fina
aea0: 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65  l parameter, xDe
aeb0: 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  l, must be one o
aec0: 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  f SQLITE_DYNAMIC
aed0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a  , SQLITE_STATIC.
aee0: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41  ** or SQLITE_TRA
aef0: 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73  NSIENT. If it is
af00: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
af10: 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72   then the buffer
af20: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
af30: 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20  y zName will be 
af40: 66 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33  freed by sqlite3
af50: 44 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68  DbFree() when th
af60: 65 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f  e vdbe is destro
af70: 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  yed..*/.int sqli
af80: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
af90: 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  e(.  Vdbe *p,   
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afb0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65        /* Vdbe be
afc0: 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a  ing configured *
afd0: 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20  /.  int idx,    
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aff0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
b000: 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70   column zName ap
b010: 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  plies to */.  in
b020: 74 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20  t var,          
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b040: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c  * One of the COL
b050: 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73  NAME_* constants
b060: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
b070: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
b080: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
b090: 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
b0a0: 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20  aining name */. 
b0b0: 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
b0c0: 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  id*)            
b0d0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61    /* Memory mana
b0e0: 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20  gement strategy 
b0f0: 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  for zName */.){.
b100: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20    int rc;.  Mem 
b110: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73  *pColName;.  ass
b120: 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73  ert( idx<p->nRes
b130: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65  Column );.  asse
b140: 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f  rt( var<COLNAME_
b150: 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  N );.  if( p->db
b160: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b170: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a  {.    assert( !z
b180: 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51  Name || xDel!=SQ
b190: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a  LITE_DYNAMIC );.
b1a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b1b0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61  E_NOMEM;.  }.  a
b1c0: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61  ssert( p->aColNa
b1d0: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e  me!=0 );.  pColN
b1e0: 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e  ame = &(p->aColN
b1f0: 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e  ame[idx+var*p->n
b200: 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72  ResColumn]);.  r
b210: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
b220: 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d  emSetStr(pColNam
b230: 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  e, zName, -1, SQ
b240: 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29  LITE_UTF8, xDel)
b250: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
b260: 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28  0 || !zName || (
b270: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26  pColName->flags&
b280: 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a  MEM_Term)!=0 );.
b290: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b2a0: 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20  /*.** A read or 
b2b0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
b2c0: 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  n may or may not
b2d0: 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61   be active on da
b2e0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
b2f0: 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61   db. If a transa
b300: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c  ction is active,
b310: 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74   commit it. If t
b320: 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69  here is a.** wri
b330: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  te-transaction s
b340: 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61  panning more tha
b350: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
b360: 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ile, this routin
b370: 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20  e.** takes care 
b380: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
b390: 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a  urnal trickery..
b3a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
b3b0: 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33  beCommit(sqlite3
b3c0: 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
b3d0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
b3e0: 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e  Trans = 0;  /* N
b3f0: 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73  umber of databas
b400: 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76  es with an activ
b410: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
b420: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ion */.  int rc 
b430: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
b440: 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d  nt needXcommit =
b450: 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   0;..#ifdef SQLI
b460: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
b470: 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74  ABLE.  /* With t
b480: 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69  his option, sqli
b490: 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73  te3VtabSync() is
b4a0: 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73   defined to be s
b4b0: 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49  imply .  ** SQLI
b4c0: 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f  TE_OK so p is no
b4d0: 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20  t used. .  */.  
b4e0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
b4f0: 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  (p);.#endif..  /
b500: 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
b510: 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61  nything else, ca
b520: 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63  ll the xSync() c
b530: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a  allback for any.
b540: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64    ** virtual mod
b550: 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74  ule tables writt
b560: 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73  en in this trans
b570: 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73  action. This has
b580: 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65   to.  ** be done
b590: 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e   before determin
b5a0: 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61  ing whether a ma
b5b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
b5c0: 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69  e is .  ** requi
b5d0: 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63  red, as an xSync
b5e0: 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20  () callback may 
b5f0: 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20  add an attached 
b600: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f  database.  ** to
b610: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
b620: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
b630: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62  lite3VtabSync(db
b640: 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  , &p->zErrMsg);.
b650: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b660: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
b670: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
b680: 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d  This loop determ
b690: 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20  ines (a) if the 
b6a0: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75  commit hook shou
b6b0: 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e  ld be invoked an
b6c0: 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d  d.  ** (b) how m
b6d0: 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  any database fil
b6e0: 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69  es have open wri
b6f0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c  te transactions,
b700: 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75   not .  ** inclu
b710: 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61  ding the temp da
b720: 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69  tabase. (b) is i
b730: 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65  mportant because
b740: 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20   if more than . 
b750: 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65   ** one database
b760: 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65   file has an ope
b770: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
b780: 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f  ion, a master jo
b790: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
b7a0: 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
b7b0: 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74  an atomic commit
b7c0: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d  ..  */ .  for(i=
b7d0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
b7e0: 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a  +){ .    Btree *
b7f0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
b800: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71  .pBt;.    if( sq
b810: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
b820: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
b830: 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20    needXcommit = 
b840: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d  1;.      if( i!=
b850: 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20  1 ) nTrans++;.  
b860: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
b870: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77   there are any w
b880: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
b890: 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65  s at all, invoke
b8a0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
b8b0: 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63   */.  if( needXc
b8c0: 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f  ommit && db->xCo
b8d0: 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  mmitCallback ){.
b8e0: 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
b8f0: 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a  3SafetyOff(db);.
b900: 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f      rc = db->xCo
b910: 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d  mmitCallback(db-
b920: 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20  >pCommitArg);.  
b930: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
b940: 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20  afetyOn(db);.   
b950: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
b960: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b970: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d  ONSTRAINT;.    }
b980: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73  .  }..  /* The s
b990: 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20  imple case - no 
b9a0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
b9b0: 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
b9c0: 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20   counting the.  
b9d0: 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  ** TEMP database
b9e0: 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74  ) has a transact
b9f0: 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68  ion active.   Th
ba00: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
ba10: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74  or the.  ** mast
ba20: 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a  er-journal..  **
ba30: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74  .  ** If the ret
ba40: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c  urn value of sql
ba50: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
ba60: 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f  name() is a zero
ba70: 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72   length.  ** str
ba80: 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ing, it means th
ba90: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
baa0: 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61  is :memory: or a
bab0: 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20   temp file.  In 
bac0: 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20  .  ** that case 
bad0: 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
bae0: 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66  t atomic multi-f
baf0: 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20  ile commits, so 
bb00: 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69  use the .  ** si
bb10: 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74  mple case then t
bb20: 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30  oo..  */.  if( 0
bb30: 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
bb40: 30 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  0(sqlite3BtreeGe
bb50: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
bb60: 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c  b[0].pBt)).   ||
bb70: 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a   nTrans<=1.  ){.
bb80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
bb90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
bba0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
bbb0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
bbc0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
bbd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
bbe0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
bbf0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
bc00: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
bc10: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
bc20: 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  }..    /* Do the
bc30: 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20   commit only if 
bc40: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75  all databases su
bc50: 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c  ccessfully compl
bc60: 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20  ete phase 1. .  
bc70: 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74    ** If one of t
bc80: 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  he BtreeCommitPh
bc90: 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66  aseOne() calls f
bca0: 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63  ails, this indic
bcb0: 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49  ates an.    ** I
bcc0: 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65  O error while de
bcd0: 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
bce0: 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66  ting a journal f
bcf0: 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b  ile. It is unlik
bd00: 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20  ely,.    ** but 
bd10: 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e  could happen. In
bd20: 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64   this case aband
bd30: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
bd40: 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
bd50: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  or..    */.    f
bd60: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
bd70: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
bd80: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
bd90: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
bda0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
bdb0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
bdc0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
bdd0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
bde0: 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20  seTwo(pBt);.    
bdf0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
be00: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
be10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
be20: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
be30: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
be40: 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65  The complex case
be50: 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75   - There is a mu
be60: 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74  lti-file write-t
be70: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
be80: 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71  e..  ** This req
be90: 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a  uires a master j
bea0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
beb0: 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61  nsure the transa
bec0: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ction is.  ** co
bed0: 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79  mmitted atomicly
bee0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
bef0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
bf00: 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71  O.  else{.    sq
bf10: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
bf20: 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20  = db->pVfs;.    
bf30: 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
bf40: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
bf50: 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69  ter = 0;   /* Fi
bf60: 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le-name for the 
bf70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a  master journal *
bf80: 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
bf90: 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71   *zMainFile = sq
bfa0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
bfb0: 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
bfc0: 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  .pBt);.    sqlit
bfd0: 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
bfe0: 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66   = 0;.    i64 of
bff0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  fset = 0;.    in
c000: 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53  t res;..    /* S
c010: 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a  elect a master j
c020: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
c030: 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
c040: 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a     u32 iRandom;.
c050: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
c060: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
c070: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
c080: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
c090: 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61  f(iRandom), &iRa
c0a0: 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61  ndom);.      zMa
c0b0: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  ster = sqlite3MP
c0c0: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a  rintf(db, "%s-mj
c0d0: 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65  %08X", zMainFile
c0e0: 2c 20 69 52 61 6e 64 6f 6d 26 30 78 37 66 66 66  , iRandom&0x7fff
c0f0: 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28  ffff);.      if(
c100: 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !zMaster ){.   
c110: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c120: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
c130: 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
c140: 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
c150: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
c160: 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
c170: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68  , &res);.    }wh
c180: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
c190: 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20  OK && res );.   
c1a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c1b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  OK ){.      /* O
c1c0: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
c1d0: 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20  ournal. */.     
c1e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
c1f0: 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20  penMalloc(pVfs, 
c200: 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65  zMaster, &pMaste
c210: 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51  r, .          SQ
c220: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
c230: 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
c240: 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20  CREATE|.        
c250: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
c260: 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f  CLUSIVE|SQLITE_O
c270: 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
c280: 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  AL, 0.      );. 
c290: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
c2a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c2b0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
c2c0: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
c2d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
c2e0: 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
c2f0: 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
c300: 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  f each database 
c310: 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e  file in the tran
c320: 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  saction into the
c330: 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74   new.    ** mast
c340: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
c350: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
c360: 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
c370: 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61  t close.    ** a
c380: 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  nd delete the ma
c390: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c3a0: 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76  e. All the indiv
c3b0: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
c3c0: 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c  les.    ** still
c3d0: 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20   have 'null' as 
c3e0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
c3f0: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74  al pointer, so t
c400: 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20  hey will roll.  
c410: 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65    ** back indepe
c420: 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69  ndently if a fai
c430: 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20  lure occurs..   
c440: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
c450: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
c460: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
c470: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
c480: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69  pBt;.      if( i
c490: 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ==1 ) continue; 
c4a0: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
c4b0: 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f  TEMP database */
c4c0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
c4d0: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
c4e0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
c4f0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
c500: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
c510: 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
c520: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
c530: 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20  ( zFile[0]==0 ) 
c540: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
c550: 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61  nore :memory: da
c560: 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20  tabases */.     
c570: 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63     if( !needSync
c580: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
c590: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42  eSyncDisabled(pB
c5a0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
c5b0: 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
c5c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c5d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
c5e0: 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69  ite(pMaster, zFi
c5f0: 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  le, sqlite3Strle
c600: 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66  n30(zFile)+1, of
c610: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f  fset);.        o
c620: 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33  ffset += sqlite3
c630: 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
c640: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  1;.        if( r
c650: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c660: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c670: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
c680: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
c690: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
c6a0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
c6b0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
c6c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
c6d0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
c6e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
c6f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c700: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
c710: 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ync the master j
c720: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
c730: 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e  the IOCAP_SEQUEN
c740: 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20  TIAL device.    
c750: 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  ** flag is set t
c760: 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
c770: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
c780: 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20  if( needSync .  
c790: 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65     && 0==(sqlite
c7a0: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
c7b0: 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72  eristics(pMaster
c7c0: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
c7d0: 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20  EQUENTIAL).     
c7e0: 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
c7f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
c800: 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  c(pMaster, SQLIT
c810: 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a  E_SYNC_NORMAL)).
c820: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
c830: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
c840: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
c850: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
c860: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
c870: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c880: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
c890: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
c8a0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
c8b0: 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65   /* Sync all the
c8c0: 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76   db files involv
c8d0: 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ed in the transa
c8e0: 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20  ction. The same 
c8f0: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73  call.    ** sets
c900: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
c910: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65  nal pointer in e
c920: 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  ach individual j
c930: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a  ournal. If.    *
c940: 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
c950: 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64  s here, do not d
c960: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
c970: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
c980: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
c990: 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73  the error occurs
c9a0: 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73   during the firs
c9b0: 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  t call to.    **
c9c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
c9d0: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74  mitPhaseOne(), t
c9e0: 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63  hen there is a c
c9f0: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20  hance that the. 
ca00: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
ca10: 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62  rnal file will b
ca20: 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20  e orphaned. But 
ca30: 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65  we cannot delete
ca40: 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63   it,.    ** in c
ca50: 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ase the master j
ca60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
ca70: 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74   was written int
ca80: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
ca90: 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65    ** file before
caa0: 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63   the failure occ
cab0: 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  urred..    */.  
cac0: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
cad0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
cae0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
caf0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
cb00: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
cb10: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
cb20: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
cb30: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
cb40: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a  tPhaseOne(pBt, z
cb50: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  Master);.      }
cb60: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
cb70: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
cb80: 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  aster);.    if( 
cb90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cba0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
cbb0: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
cbc0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
cbd0: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
cbe0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * Delete the mas
cbf0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cc00: 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74  . This commits t
cc10: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
cc20: 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69  After.    ** doi
cc30: 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65  ng this the dire
cc40: 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20  ctory is synced 
cc50: 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79  again before any
cc60: 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20   individual.    
cc70: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ** transaction f
cc80: 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64  iles are deleted
cc90: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
cca0: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
ccb0: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
ccc0: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
ccd0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
cce0: 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  er);.    zMaster
ccf0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
cd00: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
cd10: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
cd20: 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64  /* All files and
cd30: 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76   directories hav
cd40: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
cd50: 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f  ynced, so the fo
cd60: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63  llowing.    ** c
cd70: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
cd80: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
cd90: 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c  wo() are only cl
cda0: 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a  osing files and.
cdb0: 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20      ** deleting 
cdc0: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f  or truncating jo
cdd0: 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74  urnals. If somet
cde0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
cdf0: 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
ce00: 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77  s is happening w
ce10: 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63  e don't really c
ce20: 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69  are. The integri
ce30: 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ty of the.    **
ce40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
ce50: 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65  already guarante
ce60: 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72  ed, but some str
ce70: 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61  ay 'cold' journa
ce80: 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65  ls.    ** may be
ce90: 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52   lying around. R
cea0: 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
ceb0: 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c  r code won't hel
cec0: 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a  p matters..    *
ced0: 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  /.    disable_si
cee0: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
cef0: 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s();.    sqlite3
cf00: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
cf10: 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  c();.    for(i=0
cf20: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
cf30: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
cf40: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
cf50: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
cf60: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
cf70: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
cf80: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b  itPhaseTwo(pBt);
cf90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
cfa0: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
cfb0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
cfc0: 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
cfd0: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a  d_io_errors();..
cfe0: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
cff0: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  ommit(db);.  }.#
d000: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
d010: 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  rc;.}../* .** Th
d020: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
d030: 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  s that the sqlit
d040: 65 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74  e3.activeVdbeCnt
d050: 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a   count variable.
d060: 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e  ** matches the n
d070: 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20  umber of vdbe's 
d080: 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69  in the list sqli
d090: 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61  te3.pVdbe that a
d0a0: 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  re.** currently 
d0b0: 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72  active. An asser
d0c0: 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68  tion fails if th
d0d0: 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20  e two counts do 
d0e0: 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68  not match..** Th
d0f0: 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  is is an interna
d100: 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c  l self-check onl
d110: 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e  y - it is not an
d120: 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65   essential proce
d130: 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a  ssing.** step..*
d140: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e  *.** This is a n
d150: 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69  o-op if NDEBUG i
d160: 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69  s defined..*/.#i
d170: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
d180: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63  tic void checkAc
d190: 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69  tiveVdbeCnt(sqli
d1a0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
d1b0: 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d   *p;.  int cnt =
d1c0: 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65   0;.  int nWrite
d1d0: 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e   = 0;.  p = db->
d1e0: 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20  pVdbe;.  while( 
d1f0: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
d200: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
d210: 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d  C_RUN && p->pc>=
d220: 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  0 ){.      cnt++
d230: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
d240: 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72  eadOnly==0 ) nWr
d250: 69 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ite++;.    }.   
d260: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
d270: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74   }.  assert( cnt
d280: 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ==db->activeVdbe
d290: 43 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Cnt );.  assert(
d2a0: 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 77 72 69   nWrite==db->wri
d2b0: 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23  teVdbeCnt );.}.#
d2c0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65  else.#define che
d2d0: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
d2e0: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
d2f0: 20 46 6f 72 20 65 76 65 72 79 20 42 74 72 65 65   For every Btree
d300: 20 74 68 61 74 20 69 6e 20 64 61 74 61 62 61 73   that in databas
d310: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
d320: 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 62 65  which .** has be
d330: 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22 74 72  en modified, "tr
d340: 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64 61 74  ip" or invalidat
d350: 65 20 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e  e each cursor in
d360: 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65 20 6d  .** that Btree m
d370: 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6d  ight have been m
d380: 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61 74 20  odified so that 
d390: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61  the cursor.** ca
d3a0: 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  n never be used 
d3b0: 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68 61 70  again.  This hap
d3c0: 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c  pens when a roll
d3d0: 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e  back.*** occurs.
d3e0: 20 20 57 65 20 68 61 76 65 20 74 6f 20 74 72 69    We have to tri
d3f0: 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  p all the other 
d400: 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a  cursors, even.**
d410: 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68   cursor from oth
d420: 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66 65 72  er VMs in differ
d430: 65 6e 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ent database con
d440: 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20  nections,.** so 
d450: 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
d460: 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65  m try to use the
d470: 20 64 61 74 61 20 61 74 20 77 68 69 63 68 20 74   data at which t
d480: 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e  hey.** were poin
d490: 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68 20 6e  ting and which n
d4a0: 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ow may have been
d4b0: 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20   changed due.** 
d4c0: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  to the rollback.
d4d0: 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  .**.** Remember 
d4e0: 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20  that a rollback 
d4f0: 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62 6c 65  can delete table
d500: 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a  s complete and.*
d510: 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74 70 61  * reorder rootpa
d520: 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73 20 6e  ges.  So it is n
d530: 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 6a 75  ot sufficient ju
d540: 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68  st to save.** th
d550: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
d560: 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76 65 20  ursor.  We have 
d570: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68  to invalidate th
d580: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74  e cursor.** so t
d590: 68 61 74 20 69 74 20 69 73 20 6e 65 76 65 72 20  hat it is never 
d5a0: 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73  used again..*/.s
d5b0: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
d5c0: 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
d5d0: 64 69 66 69 65 64 42 74 72 65 65 73 28 73 71 6c  difiedBtrees(sql
d5e0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
d5f0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
d600: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
d610: 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64      Btree *p = d
d620: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
d630: 20 20 20 69 66 28 20 70 20 26 26 20 73 71 6c 69     if( p && sqli
d640: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
d650: 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71  s(p) ){.      sq
d660: 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
d670: 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51 4c 49  lCursors(p, SQLI
d680: 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d  TE_ABORT);.    }
d690: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
d6a0: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
d6b0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
d6c0: 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20  gument opened a 
d6d0: 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
d6e0: 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20  ction,.** close 
d6f0: 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74  it now. Argument
d700: 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74   eOp must be eit
d710: 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
d720: 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56  LLBACK or.** SAV
d730: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
d740: 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
d750: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
d760: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  n the statement.
d770: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
d780: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  s rolled back. I
d790: 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49  f eOp is SAVEPOI
d7a0: 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
d7b0: 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65   the .** stateme
d7c0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
d7d0: 73 20 63 6f 6d 6d 74 74 65 64 2e 0a 2a 2a 0a 2a  s commtted..**.*
d7e0: 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
d7f0: 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49   occurs, an SQLI
d800: 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
d810: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
d820: 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
d830: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
d840: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
d850: 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56  CloseStatement(V
d860: 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29  dbe *p, int eOp)
d870: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e  {.  sqlite3 *con
d880: 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  st db = p->db;. 
d890: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d8a0: 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d  _OK;..  /* If p-
d8b0: 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67  >iStatement is g
d8c0: 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
d8d0: 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64 62 65  , then this Vdbe
d8e0: 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20   opened a .  ** 
d8f0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
d900: 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c  ction that shoul
d910: 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65  d be closed here
d920: 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70  . The only excep
d930: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61  tion.  ** is tha
d940: 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61  t an IO error ma
d950: 79 20 68 61 76 65 20 6f 63 63 75 72 65 64 2c 20  y have occured, 
d960: 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67  causing an emerg
d970: 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20  ency rollback.. 
d980: 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
d990: 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74   (db->nStatement
d9a0: 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20  ==0), and there 
d9b0: 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  is nothing to do
d9c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
d9d0: 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70  >nStatement && p
d9e0: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  ->iStatement ){.
d9f0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
da00: 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f  onst int iSavepo
da10: 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d  int = p->iStatem
da20: 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65  ent-1;..    asse
da30: 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  rt( eOp==SAVEPOI
da40: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65  NT_ROLLBACK || e
da50: 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  Op==SAVEPOINT_RE
da60: 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65  LEASE);.    asse
da70: 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  rt( db->nStateme
da80: 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  nt>0 );.    asse
da90: 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  rt( p->iStatemen
daa0: 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65  t==(db->nStateme
dab0: 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  nt+db->nSavepoin
dac0: 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  t) );..    for(i
dad0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
dae0: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20  ++){ .      int 
daf0: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
db00: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
db10: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
db20: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
db30: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
db40: 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
db50: 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
db60: 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
db70: 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
db80: 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
db90: 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
dba0: 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
dbb0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
dbc0: 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2==SQLITE_OK ){.
dbd0: 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
dbe0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
dbf0: 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
dc00: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
dc10: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
dc20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
dc30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
dc40: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
dc50: 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc2;.        }.
dc60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dc70: 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
dc80: 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74  --;.    p->iStat
dc90: 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20  ement = 0;..    
dca0: 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
dcb0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
dcc0: 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
dcd0: 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f  back, also resto
dce0: 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64  re the .    ** d
dcf0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20  atabase handles 
dd00: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
dd10: 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74  int counter to t
dd20: 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64 20  he value it had 
dd30: 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  when .    ** the
dd40: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
dd50: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
dd60: 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  d.  */.    if( e
dd70: 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
dd80: 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
dd90: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
dda0: 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43  s = p->nStmtDefC
ddb0: 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ons;.    }.  }. 
ddc0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ddd0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
dde0: 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75  s compiled to su
ddf0: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
de00: 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62  he mode and to b
de10: 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a  e threadsafe,.**
de20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62   this routine ob
de30: 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20  tains the mutex 
de40: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
de50: 65 61 63 68 20 42 74 53 68 61 72 65 64 20 73 74  each BtShared st
de60: 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20  ructure.** that 
de70: 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20  may be accessed 
de80: 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  by the VM passed
de90: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
dea0: 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 0a   In doing so it.
deb0: 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68  ** sets the BtSh
dec0: 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f  ared.db member o
ded0: 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74  f each of the Bt
dee0: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
def0: 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74  s, ensuring.** t
df00: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
df10: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
df20: 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
df30: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
df40: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
df50: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
df60: 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74  but does support
df70: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
df80: 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69  de, then.** sqli
df90: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
dfa0: 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  () is invoked to
dfb0: 20 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65   set the BtShare
dfc0: 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a  d.db variables.*
dfd0: 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68  * of all of BtSh
dfe0: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20  ared structures 
dff0: 61 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74  accessible via t
e000: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
e010: 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  le .** associate
e020: 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e 20 4f  d with the VM. O
e030: 66 20 63 6f 75 72 73 65 20 6f 6e 6c 79 20 61 20  f course only a 
e040: 73 75 62 73 65 74 20 6f 66 20 74 68 65 73 65 20  subset of these 
e050: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 77 69  structures.** wi
e060: 6c 6c 20 62 65 20 61 63 63 65 73 73 65 64 20 62  ll be accessed b
e070: 79 20 74 68 65 20 56 4d 2c 20 61 6e 64 20 77 65  y the VM, and we
e080: 20 63 6f 75 6c 64 20 75 73 65 20 56 64 62 65 2e   could use Vdbe.
e090: 62 74 72 65 65 4d 61 73 6b 20 74 6f 20 66 69 67  btreeMask to fig
e0a0: 75 72 65 0a 2a 2a 20 74 68 61 74 20 73 75 62 73  ure.** that subs
e0b0: 65 74 20 6f 75 74 2c 20 62 75 74 20 74 68 65 72  et out, but ther
e0c0: 65 20 69 73 20 6e 6f 20 61 64 76 61 6e 74 61 67  e is no advantag
e0d0: 65 20 74 6f 20 64 6f 69 6e 67 20 73 6f 2e 0a 2a  e to doing so..*
e0e0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
e0f0: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
e100: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75   and does not su
e110: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
e120: 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a  he mode, this.**
e130: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
e140: 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  o-op..*/.#ifndef
e150: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
e160: 52 45 44 5f 43 41 43 48 45 0a 76 6f 69 64 20 73  RED_CACHE.void s
e170: 71 6c 69 74 65 33 56 64 62 65 4d 75 74 65 78 41  qlite3VdbeMutexA
e180: 72 72 61 79 45 6e 74 65 72 28 56 64 62 65 20 2a  rrayEnter(Vdbe *
e190: 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  p){.#if SQLITE_T
e1a0: 48 52 45 41 44 53 41 46 45 0a 20 20 73 71 6c 69  HREADSAFE.  sqli
e1b0: 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72  te3BtreeMutexArr
e1c0: 61 79 45 6e 74 65 72 28 26 70 2d 3e 61 4d 75 74  ayEnter(&p->aMut
e1d0: 65 78 29 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  ex);.#else.  sql
e1e0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
e1f0: 6c 28 70 2d 3e 64 62 29 3b 0a 23 65 6e 64 69 66  l(p->db);.#endif
e200: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
e210: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
e220: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
e230: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
e240: 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61  ed by the databa
e250: 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73  se .** handle as
e260: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
e270: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
e280: 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62  n argument is ab
e290: 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  out to be .** co
e2a0: 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72  mmitted. If ther
e2b0: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
e2c0: 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  g deferred forei
e2d0: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
e2e0: 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c  t.** violations,
e2f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
e300: 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c  RROR. Otherwise,
e310: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
e320: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
e330: 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69  utstanding FK vi
e340: 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69  olations and thi
e350: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
e360: 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  ns .** SQLITE_ER
e370: 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73  ROR, set the res
e380: 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f  ult of the VM to
e390: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
e3a0: 4e 54 20 61 6e 64 20 77 72 69 74 65 0a 2a 2a 20  NT and write.** 
e3b0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
e3c0: 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74   to it. Then ret
e3d0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
e3e0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
e3f0: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
e400: 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  _KEY.int sqlite3
e410: 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65  VdbeCheckFk(Vdbe
e420: 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65   *p, int deferre
e430: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  d){.  sqlite3 *d
e440: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
e450: 20 28 64 65 66 65 72 72 65 64 20 26 26 20 64 62   (deferred && db
e460: 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3e  ->nDeferredCons>
e470: 30 29 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64  0) || (!deferred
e480: 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72   && p->nFkConstr
e490: 61 69 6e 74 3e 30 29 20 29 7b 0a 20 20 20 20 70  aint>0) ){.    p
e4a0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ->rc = SQLITE_CO
e4b0: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 70 2d  NSTRAINT;.    p-
e4c0: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
e4d0: 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c  E_Abort;.    sql
e4e0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
e4f0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
e500: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
e510: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b  traint failed");
e520: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e530: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
e540: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e550: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
e560: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
e570: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
e580: 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
e590: 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
e5a0: 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
e5b0: 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
e5c0: 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
e5d0: 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
e5e0: 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
e5f0: 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
e600: 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
e610: 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
e620: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
e630: 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
e640: 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
e650: 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
e660: 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
e670: 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
e680: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49  E_MAGIC_HALT.  I
e690: 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f  t is harmless to
e6a0: 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e  .** call this on
e6b0: 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e   a VM that is in
e6c0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49   the SQLITE_MAGI
e6d0: 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a  C_HALT state..**
e6e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
e6f0: 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
e700: 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
e710: 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
e720: 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
e730: 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
e740: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
e750: 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
e760: 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
e770: 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
e780: 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
e790: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
e7a0: 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
e7b0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
e7c0: 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  t(Vdbe *p){.  in
e7d0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e7f0: 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   Used to store t
e800: 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20  ransient return 
e810: 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  codes */.  sqlit
e820: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
e830: 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
e840: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
e850: 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
e860: 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
e870: 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
e880: 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
e890: 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
e8a0: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
e8b0: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
e8c0: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
e8d0: 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
e8e0: 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
e8f0: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
e900: 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20  ollowing errors 
e910: 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  occur:.  **.  **
e920: 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45       SQLITE_NOME
e930: 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  M.  **     SQLIT
e940: 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20  E_IOERR.  **    
e950: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a   SQLITE_FULL.  *
e960: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54  *     SQLITE_INT
e970: 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  ERRUPT.  **.  **
e980: 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e   Then the intern
e990: 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68  al cache might h
e9a0: 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e  ave been left in
e9b0: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
e9c0: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65  .  ** state.  We
e9d0: 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
e9e0: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
e9f0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
ea00: 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e  there is.  ** on
ea10: 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  e, or the comple
ea20: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
ea30: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
ea40: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
ea50: 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28  ion..  */..  if(
ea60: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
ea70: 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
ea80: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
ea90: 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c  ;.  }.  closeAll
eaa0: 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66  Cursors(p);.  if
eab0: 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
eac0: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20  _MAGIC_RUN ){.  
ead0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
eae0: 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41  OK;.  }.  checkA
eaf0: 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
eb00: 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69  ;..  /* No commi
eb10: 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  t or rollback ne
eb20: 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67  eded if the prog
eb30: 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65  ram never starte
eb40: 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  d */.  if( p->pc
eb50: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d  >=0 ){.    int m
eb60: 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79  rc;   /* Primary
eb70: 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   error code from
eb80: 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e   p->rc */.    in
eb90: 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d  t eStatementOp =
eba0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70   0;.    int isSp
ebb0: 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20  ecialError;     
ebc0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
ebd0: 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65 63   true if a 'spec
ebe0: 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20  ial' error */.. 
ebf0: 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62     /* Lock all b
ec00: 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68  trees used by th
ec10: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
ec20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
ec30: 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 70 29  texArrayEnter(p)
ec40: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
ec50: 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  for one of the s
ec60: 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f  pecial errors */
ec70: 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63  .    mrc = p->rc
ec80: 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61 73 73   & 0xff;.    ass
ec90: 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
eca0: 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
ecb0: 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 65 72 72   );  /* This err
ecc0: 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 65 78 69  or no longer exi
ecd0: 73 74 73 20 2a 2f 0a 20 20 20 20 69 73 53 70 65  sts */.    isSpe
ece0: 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d  cialError = mrc=
ecf0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
ed00: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   mrc==SQLITE_IOE
ed10: 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR.             
ed20: 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d          || mrc==
ed30: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
ed40: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
ed50: 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73  FULL;.    if( is
ed60: 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a  SpecialError ){.
ed70: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
ed80: 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f  query was read-o
ed90: 6e 6c 79 2c 20 77 65 20 6e 65 65 64 20 64 6f 20  nly, we need do 
eda0: 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61  no rollback at a
edb0: 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  ll. Otherwise,. 
edc0: 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 65 64 20       ** proceed 
edd0: 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
ede0: 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20   handling..     
edf0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
ee00: 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72  ->readOnly || mr
ee10: 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c!=SQLITE_INTERR
ee20: 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  UPT ){.        i
ee30: 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f  f( (mrc==SQLITE_
ee40: 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51  NOMEM || mrc==SQ
ee50: 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d  LITE_FULL) && p-
ee60: 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
ee70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53   ){.          eS
ee80: 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
ee90: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
eea0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
eeb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
eec0: 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f  are forced to ro
eed0: 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69  ll back the acti
eee0: 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ve transaction. 
eef0: 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20  Before doing.   
ef00: 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62         ** so, ab
ef10: 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74  ort any other st
ef20: 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61  atements this ha
ef30: 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68  ndle currently h
ef40: 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20  as active..     
ef50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
ef60: 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73    invalidateCurs
ef70: 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72  orsOnModifiedBtr
ef80: 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ees(db);.       
ef90: 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
efa0: 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
efb0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
efc0: 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
efd0: 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  .          db->a
efe0: 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
eff0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f000: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
f010: 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61  heck for immedia
f020: 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76  te foreign key v
f030: 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  iolations. */.  
f040: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
f050: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f060: 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
f070: 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Fk(p, 0);.    }.
f080: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
f090: 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
f0a0: 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
f0b0: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
f0c0: 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20  tive writer .   
f0d0: 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20   ** VM, then we 
f0e0: 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
f0f0: 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
f100: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
f110: 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
f120: 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
f130: 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
f140: 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
f150: 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
f160: 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
f170: 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
f180: 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rred. .    */.  
f190: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74    if( !sqlite3Vt
f1a0: 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20  abInSync(db) .  
f1b0: 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f     && db->autoCo
f1c0: 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62  mmit .     && db
f1d0: 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 3d 3d  ->writeVdbeCnt==
f1e0: 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29  (p->readOnly==0)
f1f0: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69   .    ){.      i
f200: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
f210: 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72  _OK || (p->error
f220: 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
f230: 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72  && !isSpecialErr
f240: 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  or) ){.        i
f250: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  f( sqlite3VdbeCh
f260: 65 63 6b 46 6b 28 70 2c 20 31 29 20 29 7b 0a 20  eckFk(p, 1) ){. 
f270: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f280: 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c  BtreeMutexArrayL
f290: 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29  eave(&p->aMutex)
f2a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
f2b0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
f2c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f2d0: 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
f2e0: 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
f2f0: 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
f300: 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
f310: 66 75 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ful .        ** 
f320: 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41  or hit an 'OR FA
f330: 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  IL' constraint a
f340: 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
f350: 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
f360: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20  .        ** key 
f370: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68  constraints to h
f380: 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73  old up the trans
f390: 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  action. This mea
f3a0: 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20  ns a commit .   
f3b0: 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69       ** is requi
f3c0: 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  red.  */.       
f3d0: 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74   rc = vdbeCommit
f3e0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
f3f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f400: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
f410: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75    sqlite3BtreeMu
f420: 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26 70  texArrayLeave(&p
f430: 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 20 20 20  ->aMutex);.     
f440: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f450: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
f460: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
f470: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f480: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
f490: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
f4a0: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
f4b0: 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  b);.        }els
f4c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  e{.          db-
f4d0: 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
f4e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   0;.          sq
f4f0: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
f500: 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
f510: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f520: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
f530: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
f540: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l(db);.      }. 
f550: 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d       db->nStatem
f560: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ent = 0;.    }el
f570: 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e  se if( eStatemen
f580: 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tOp==0 ){.      
f590: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
f5a0: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72  E_OK || p->error
f5b0: 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
f5c0: 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
f5d0: 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
f5e0: 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20  INT_RELEASE;.   
f5f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
f600: 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
f610: 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
f620: 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
f630: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
f640: 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
f650: 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
f660: 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69  ateCursorsOnModi
f670: 66 69 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a  fiedBtrees(db);.
f680: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
f690: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
f6a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
f6b0: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
f6c0: 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
f6d0: 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
f6e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f6f0: 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74  .    /* If eStat
f700: 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a  ementOp is non-z
f710: 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74  ero, then a stat
f720: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
f730: 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  n needs to.    *
f740: 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  * be committed o
f750: 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43  r rolled back. C
f760: 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43  all sqlite3VdbeC
f770: 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20  loseStatement() 
f780: 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e  to.    ** do so.
f790: 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   If this operati
f7a0: 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
f7b0: 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72  ror, and the cur
f7c0: 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  rent statement. 
f7d0: 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65     ** error code
f7e0: 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72   is SQLITE_OK or
f7f0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
f800: 4e 54 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65  NT, then set the
f810: 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f   error.    ** co
f820: 64 65 20 74 6f 20 74 68 65 20 6e 65 77 20 76 61  de to the new va
f830: 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lue..    */.    
f840: 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
f850: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
f860: 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
f870: 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61  tatement(p, eSta
f880: 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20  tementOp);.     
f890: 20 69 66 28 20 72 63 20 26 26 20 28 70 2d 3e 72   if( rc && (p->r
f8a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
f8b0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  p->rc==SQLITE_CO
f8c0: 4e 53 54 52 41 49 4e 54 29 20 29 7b 0a 20 20 20  NSTRAINT) ){.   
f8d0: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
f8e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f8f0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
f900: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
f910: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
f920: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f930: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
f940: 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55  was an INSERT, U
f950: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
f960: 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74  and no statement
f970: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
f980: 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c   ** has been rol
f990: 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65  led back, update
f9a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
f9b0: 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d  nnection change-
f9c0: 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
f9d0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
f9e0: 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20  geCntOn ){.     
f9f0: 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
fa00: 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p!=SAVEPOINT_ROL
fa10: 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
fa20: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fa30: 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
fa40: 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65  hange);.      }e
fa50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
fa60: 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
fa70: 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  es(db, 0);.     
fa80: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61   }.      p->nCha
fa90: 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  nge = 0;.    }. 
faa0: 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   .    /* Rollbac
fab0: 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20  k or commit any 
fac0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74  schema changes t
fad0: 68 61 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f  hat occurred. */
fae0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  .    if( p->rc!=
faf0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d  SQLITE_OK && db-
fb00: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e  >flags&SQLITE_In
fb10: 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20  ternChanges ){. 
fb20: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65       sqlite3Rese
fb30: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
fb40: 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62  db, 0);.      db
fb50: 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66  ->flags = (db->f
fb60: 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e  lags | SQLITE_In
fb70: 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20  ternChanges);.  
fb80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
fb90: 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f  ase the locks */
fba0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
fbb0: 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65  eMutexArrayLeave
fbc0: 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20  (&p->aMutex);.  
fbd0: 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  }..  /* We have 
fbe0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c  successfully hal
fbf0: 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74  ted and closed t
fc00: 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74  he VM.  Record t
fc10: 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69  his fact. */.  i
fc20: 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
fc30: 20 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62     db->activeVdb
fc40: 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20  eCnt--;.    if( 
fc50: 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  !p->readOnly ){.
fc60: 20 20 20 20 20 20 64 62 2d 3e 77 72 69 74 65 56        db->writeV
fc70: 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a  dbeCnt--;.    }.
fc80: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
fc90: 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 3d 64  activeVdbeCnt>=d
fca0: 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20  b->writeVdbeCnt 
fcb0: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  );.  }.  p->magi
fcc0: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48  c = VDBE_MAGIC_H
fcd0: 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69  ALT;.  checkActi
fce0: 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20  veVdbeCnt(db);. 
fcf0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
fd00: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
fd10: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
fd20: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
fd30: 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
fd40: 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  it flag is set t
fd50: 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79  o true, then any
fd60: 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65   locks that were
fd70: 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f   held.  ** by co
fd80: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65  nnection db have
fd90: 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73   now been releas
fda0: 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ed. Call sqlite3
fdb0: 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b  ConnectionUnlock
fdc0: 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e  ed() .  ** to in
fdd0: 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65  voke any require
fde0: 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20  d unlock-notify 
fdf0: 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a  callbacks..  */.
fe00: 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f    if( db->autoCo
fe10: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  mmit ){.    sqli
fe20: 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c  te3ConnectionUnl
fe30: 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a  ocked(db);.  }..
fe40: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63    assert( db->ac
fe50: 74 69 76 65 56 64 62 65 43 6e 74 3e 30 20 7c 7c  tiveVdbeCnt>0 ||
fe60: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
fe70: 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65  =0 || db->nState
fe80: 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74  ment==0 );.  ret
fe90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
fea0: 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44  .../*.** Each VD
feb0: 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73  BE holds the res
fec0: 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ult of the most 
fed0: 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73  recent sqlite3_s
fee0: 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e  tep() call.** in
fef0: 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f   p->rc.  This ro
ff00: 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20  utine sets that 
ff10: 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53  result back to S
ff20: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69  QLITE_OK..*/.voi
ff30: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
ff40: 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62  etStepResult(Vdb
ff50: 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d  e *p){.  p->rc =
ff60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
ff70: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20  *.** Clean up a 
ff80: 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
ff90: 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20  tion but do not 
ffa0: 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20  delete the VDBE 
ffb0: 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69  just yet..** Wri
ffc0: 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
ffd0: 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72  sages into *pzEr
ffe0: 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68  rMsg.  Return th
fff0: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a  e result code..*
10000 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  *.** After this 
10010 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20  routine is run, 
10020 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20  the VDBE should 
10030 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65  be ready to be e
10040 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e  xecuted.** again
10050 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20  ..**.** To look 
10060 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61  at it another wa
10070 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
10080 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65  resets the state
10090 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75   of the.** virtu
100a0 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20  al machine from 
100b0 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f  VDBE_MAGIC_RUN o
100c0 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  r VDBE_MAGIC_HAL
100d0 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42  T back to.** VDB
100e0 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f  E_MAGIC_INIT..*/
100f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
10100 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a  Reset(Vdbe *p){.
10110 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
10120 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20   db = p->db;..  
10130 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64  /* If the VM did
10140 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70   not run to comp
10150 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20  letion or if it 
10160 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20  encountered an. 
10170 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20   ** error, then 
10180 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76  it might not hav
10190 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72  e been halted pr
101a0 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74  operly.  So halt
101b0 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20  .  ** it now..  
101c0 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74  */.  (void)sqlit
101d0 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a  e3SafetyOn(db);.
101e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c    sqlite3VdbeHal
101f0 74 28 70 29 3b 0a 20 20 28 76 6f 69 64 29 73 71  t(p);.  (void)sq
10200 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64  lite3SafetyOff(d
10210 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  b);..  /* If the
10220 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e   VDBE has be run
10230 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c   even partially,
10240 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74   then transfer t
10250 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  he error code.  
10260 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  ** and error mes
10270 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44  sage from the VD
10280 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  BE into the main
10290 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
102a0 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69  ure.  But.  ** i
102b0 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a  f the VDBE has j
102c0 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20  ust been set to 
102d0 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20  run but has not 
102e0 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65  actually execute
102f0 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72  d any.  ** instr
10300 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61  uctions yet, lea
10310 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ve the main data
10320 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72  base error infor
10330 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64  mation unchanged
10340 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
10350 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  pc>=0 ){.    if(
10360 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20   p->zErrMsg ){. 
10370 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
10380 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
10390 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61  .      sqlite3Va
103a0 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
103b0 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67  rr,-1,p->zErrMsg
103c0 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c  ,SQLITE_UTF8,SQL
103d0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
103e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
103f0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
10400 20 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64        db->errCod
10410 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20  e = p->rc;.     
10420 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
10430 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
10440 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67        p->zErrMsg
10450 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
10460 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
10470 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
10480 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20  db, p->rc, 0);. 
10490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
104a0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
104b0 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
104c0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
104d0 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78  ( p->rc && p->ex
104e0 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  pired ){.    /* 
104f0 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67  The expired flag
10500 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20   was set on the 
10510 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20  VDBE before the 
10520 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a  first call.    *
10530 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  * to sqlite3_ste
10540 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74  p(). For consist
10550 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69  ency (since sqli
10560 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20  te3_step() was. 
10570 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73     ** called), s
10580 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
10590 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61  error in this ca
105a0 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20  se as well..    
105b0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
105c0 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30  ror(db, p->rc, 0
105d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
105e0 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
105f0 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d  rr, -1, p->zErrM
10600 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  sg, SQLITE_UTF8,
10610 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
10620 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  T);.    sqlite3D
10630 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
10640 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
10650 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a  rrMsg = 0;.  }..
10660 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c    /* Reclaim all
10670 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
10680 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20  the VDBE.  */.  
10690 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f  Cleanup(p);..  /
106a0 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67  * Save profiling
106b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
106c0 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e  m this VDBE run.
106d0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42  .  */.#ifdef VDB
106e0 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
106f0 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
10700 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
10710 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
10720 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
10730 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
10740 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
10750 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  -- ");.      for
10760 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
10770 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
10780 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78  rintf(out, "%02x
10790 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  ", p->aOp[i].opc
107a0 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
107b0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
107c0 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f   "\n");.      fo
107d0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
107e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
107f0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64  printf(out, "%6d
10800 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c   %10lld %8lld ",
10810 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
10820 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20  Op[i].cnt,.     
10830 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
10840 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20  cycles,.        
10850 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
10860 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  >0 ? p->aOp[i].c
10870 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e  ycles/p->aOp[i].
10880 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20  cnt : 0.        
10890 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
108a0 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75  e3VdbePrintOp(ou
108b0 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
108c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
108d0 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
108e0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
108f0 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
10900 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72  _MAGIC_INIT;.  r
10910 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62  eturn p->rc & db
10920 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f  ->errMask;.}. ./
10930 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e  *.** Clean up an
10940 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20  d delete a VDBE 
10950 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
10960 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
10970 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ger which is.** 
10980 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
10990 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f    Write any erro
109a0 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69  r message text i
109b0 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a  nto *pzErrMsg..*
109c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
109d0 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a  eFinalize(Vdbe *
109e0 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
109f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
10a00 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
10a10 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d  AGIC_RUN || p->m
10a20 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
10a30 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20  _HALT ){.    rc 
10a40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  = sqlite3VdbeRes
10a50 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  et(p);.    asser
10a60 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e  t( (rc & p->db->
10a70 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a  errMask)==rc );.
10a80 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
10a90 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65  eDelete(p);.  re
10aa0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10ab0 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72  * Call the destr
10ac0 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61  uctor for each a
10ad0 75 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20  uxdata entry in 
10ae0 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68  pVdbeFunc for wh
10af0 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ich.** the corre
10b00 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20  sponding bit in 
10b10 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20  mask is clear.  
10b20 41 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 20  Auxdata entries 
10b30 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65  beyond 31.** are
10b40 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65   always destroye
10b50 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61  d.  To destroy a
10b60 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72 69  ll auxdata entri
10b70 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a  es, call this.**
10b80 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61   routine with ma
10b90 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sk==0..*/.void s
10ba0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
10bb0 41 75 78 44 61 74 61 28 56 64 62 65 46 75 6e 63  AuxData(VdbeFunc
10bc0 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74   *pVdbeFunc, int
10bd0 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b   mask){.  int i;
10be0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56  .  for(i=0; i<pV
10bf0 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69  dbeFunc->nAux; i
10c00 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
10c10 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20  AuxData *pAux = 
10c20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75  &pVdbeFunc->apAu
10c30 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69  x[i];.    if( (i
10c40 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 28  >31 || !(mask&((
10c50 28 75 33 32 29 31 29 3c 3c 69 29 29 29 20 26 26  (u32)1)<<i))) &&
10c60 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20   pAux->pAux ){. 
10c70 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78       if( pAux->x
10c80 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
10c90 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28    pAux->xDelete(
10ca0 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pAux->pAux);.   
10cb0 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d     }.      pAux-
10cc0 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d  >pAux = 0;.    }
10cd0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
10ce0 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56  lete an entire V
10cf0 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  DBE..*/.void sql
10d00 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56  ite3VdbeDelete(V
10d10 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
10d20 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e  e3 *db;..  if( N
10d30 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
10d40 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  urn;.  db = p->d
10d50 62 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  b;.  if( p->pPre
10d60 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
10d70 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
10d80 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
10d90 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56    assert( db->pV
10da0 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62  dbe==p );.    db
10db0 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65  ->pVdbe = p->pNe
10dc0 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
10dd0 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
10de0 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
10df0 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
10e00 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
10e10 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
10e20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
10e30 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
10e40 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
10e50 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 76 64  COLNAME_N);.  vd
10e60 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
10e70 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70  , p->aOp, p->nOp
10e80 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
10e90 65 65 28 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c  ee(db, p->aLabel
10ea0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
10eb0 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
10ec0 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
10ed0 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c  Free(db, p->zSql
10ee0 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  );.  p->magic = 
10ef0 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b  VDBE_MAGIC_DEAD;
10f00 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
10f10 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a  (db, p->pFree);.
10f20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
10f30 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
10f40 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
10f50 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79  ursor p is ready
10f60 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
10f70 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69  e the row to whi
10f80 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  ch it.** was las
10f90 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52  t positioned.  R
10fa0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
10fb0 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61  ode if an OOM fa
10fc0 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72  ult or I/O error
10fd0 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20  .** prevents us 
10fe0 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67  from positioning
10ff0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69   the cursor to i
11000 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74  ts correct posit
11010 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ion..**.** If a 
11020 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
11030 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
11040 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
11050 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
11060 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66   MoveTo now.  If
11070 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64   no move is pend
11080 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  ing, check to se
11090 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73  e if the row has
110a0 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64   been.** deleted
110b0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
110c0 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69  the cursor and i
110d0 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74  f it has, mark t
110e0 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e  he row as.** a N
110f0 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49  ULL row..**.** I
11100 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
11110 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
11120 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
11130 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77  row and that row
11140 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e   has.** not been
11150 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
11160 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
11170 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  or, then this ro
11180 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
11190 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
111a0 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
111b0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
111c0 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72  .  if( p->deferr
111d0 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20  edMoveto ){.    
111e0 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66  int res, rc;.#if
111f0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
11200 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
11210 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
11220 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  unt;.#endif.    
11230 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62  assert( p->isTab
11240 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  le );.    rc = s
11250 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
11260 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43 75  oUnpacked(p->pCu
11270 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65  rsor, 0, p->move
11280 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65  toTarget, 0, &re
11290 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  s);.    if( rc )
112a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
112b0 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70  p->lastRowid = p
112c0 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b 0a  ->movetoTarget;.
112d0 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61      p->rowidIsVa
112e0 6c 69 64 20 3d 20 41 4c 57 41 59 53 28 72 65 73  lid = ALWAYS(res
112f0 3d 3d 30 29 20 3f 31 3a 30 3b 0a 20 20 20 20 69  ==0) ?1:0;.    i
11300 66 28 20 4e 45 56 45 52 28 72 65 73 3c 30 29 20  f( NEVER(res<0) 
11310 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
11320 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
11330 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29  ->pCursor, &res)
11340 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
11350 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11360 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
11370 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33  TEST.    sqlite3
11380 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
11390 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64  .#endif.    p->d
113a0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
113b0 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53  0;.    p->cacheS
113c0 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
113d0 41 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ALE;.  }else if(
113e0 20 41 4c 57 41 59 53 28 70 2d 3e 70 43 75 72 73   ALWAYS(p->pCurs
113f0 6f 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 68  or) ){.    int h
11400 61 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74  asMoved;.    int
11410 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
11420 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
11430 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68 61  (p->pCursor, &ha
11440 73 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69 66 28  sMoved);.    if(
11450 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
11460 0a 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76 65  .    if( hasMove
11470 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61  d ){.      p->ca
11480 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
11490 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20 70  E_STALE;.      p
114a0 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20  ->nullRow = 1;. 
114b0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
114c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
114d0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
114e0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  ing functions:.*
114f0 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  *.** sqlite3Vdbe
11500 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20  SerialType().** 
11510 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
11520 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71  lTypeLen().** sq
11530 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c  lite3VdbeSerialL
11540 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
11550 64 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a  dbeSerialPut().*
11560 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
11570 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65  ialGet().**.** e
11580 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63  ncapsulate the c
11590 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69  ode that seriali
115a0 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73  zes values for s
115b0 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65  torage in SQLite
115c0 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64  .** data and ind
115d0 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68  ex records. Each
115e0 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75   serialized valu
115f0 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a  e consists of a.
11600 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27  ** 'serial-type'
11610 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64   and a blob of d
11620 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20  ata. The serial 
11630 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74  type is an 8-byt
11640 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e  e unsigned.** in
11650 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73  teger, stored as
11660 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
11670 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e   In an SQLite in
11680 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20  dex record, the 
11690 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73  serial type is s
116a0 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62  tored directly b
116b0 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f  efore.** the blo
116c0 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  b of data that i
116d0 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
116e0 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63  . In a table rec
116f0 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a  ord, all serial.
11700 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f  ** types are sto
11710 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  red at the start
11720 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20   of the record, 
11730 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66  and the blobs of
11740 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20   data at.** the 
11750 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65  end. Hence these
11760 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77   functions allow
11770 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68   the caller to h
11780 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72  andle the.** ser
11790 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74  ial-type and dat
117a0 61 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c  a blob seperatel
117b0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  y..**.** The fol
117c0 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73  lowing table des
117d0 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f  cribes the vario
117e0 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73  us storage class
117f0 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a  es for data:.**.
11800 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65  **   serial type
11810 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66          bytes of
11820 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a   data      type.
11830 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
11840 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
11850 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
11860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
11870 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
11880 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
11890 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20        NULL.**   
118a0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
118b0 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
118c0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
118d0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20  eger.**      2  
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118f0 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
11900 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
11910 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20  *      3        
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20               3  
11930 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
11940 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
11950 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20   4              
11960 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20         4        
11970 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
11980 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20  er.**      5    
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119a0 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69   6            si
119b0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
119c0 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
119d0 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
119e0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
119f0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37  nteger.**      7
11a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a10 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
11a20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20    IEEE float.** 
11a30 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
11a40 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
11a50 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
11a60 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20  constant 0.**   
11a70 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20     9            
11a80 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
11a90 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
11aa0 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20  nstant 1.**     
11ab0 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20  10,11           
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ad0 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72      reserved for
11ae0 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20   expansion.**   
11af0 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20   N>=12 and even 
11b00 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20        (N-12)/2  
11b10 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20        BLOB.**   
11b20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20   N>=13 and odd  
11b30 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20        (N-13)/2  
11b40 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a        text.**.**
11b50 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70   The 8 and 9 typ
11b60 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e  es were added in
11b70 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72   3.3.0, file for
11b80 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65  mat 4.  Prior ve
11b90 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c  rsions.** of SQL
11ba0 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64  ite will not und
11bb0 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65  erstand those se
11bc0 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a  rial types..*/..
11bd0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11be0 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72   serial-type for
11bf0 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
11c00 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33  d in pMem..*/.u3
11c10 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
11c20 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65  ialType(Mem *pMe
11c30 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d  m, int file_form
11c40 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73  at){.  int flags
11c50 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a   = pMem->flags;.
11c60 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20    int n;..  if( 
11c70 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
11c80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
11c90 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
11ca0 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f  MEM_Int ){.    /
11cb0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65  * Figure out whe
11cc0 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32  ther to use 1, 2
11cd0 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65  , 4, 6 or 8 byte
11ce0 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65  s. */.#   define
11cf0 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69   MAX_6BYTE ((((i
11d00 36 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c  64)0x00008000)<<
11d10 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69  32)-1).    i64 i
11d20 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
11d30 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28    u64 u;.    if(
11d40 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20   file_format>=4 
11d50 26 26 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a 20  && (i&1)==i ){. 
11d60 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28 75       return 8+(u
11d70 33 32 29 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  32)i;.    }.    
11d80 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69  u = i<0 ? -i : i
11d90 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37  ;.    if( u<=127
11da0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
11db0 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20   if( u<=32767 ) 
11dc0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
11dd0 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72  ( u<=8388607 ) r
11de0 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28  eturn 3;.    if(
11df0 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   u<=2147483647 )
11e00 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69   return 4;.    i
11e10 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20  f( u<=MAX_6BYTE 
11e20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20  ) return 5;.    
11e30 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20  return 6;.  }.  
11e40 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65  if( flags&MEM_Re
11e50 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  al ){.    return
11e60 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   7;.  }.  assert
11e70 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c  ( pMem->db->mall
11e80 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67  ocFailed || flag
11e90 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  s&(MEM_Str|MEM_B
11ea0 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d  lob) );.  n = pM
11eb0 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61  em->n;.  if( fla
11ec0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
11ed0 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e  .    n += pMem->
11ee0 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 61  u.nZero;.  }.  a
11ef0 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20  ssert( n>=0 );. 
11f00 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b   return ((n*2) +
11f10 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45   12 + ((flags&ME
11f20 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a  M_Str)!=0));.}..
11f30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11f40 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   length of the d
11f50 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ata correspondin
11f60 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
11f70 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a  d serial-type..*
11f80 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
11f90 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
11fa0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
11fb0 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
11fc0 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65  pe>=12 ){.    re
11fd0 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70  turn (serial_typ
11fe0 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65  e-12)/2;.  }else
11ff0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
12000 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20  st u8 aSize[] = 
12010 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c  { 0, 1, 2, 3, 4,
12020 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20   6, 8, 8, 0, 0, 
12030 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75  0, 0 };.    retu
12040 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f  rn aSize[serial_
12050 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  type];.  }.}../*
12060 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e  .** If we are on
12070 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65   an architecture
12080 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69   with mixed-endi
12090 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20  an floating .** 
120a0 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37  points (ex: ARM7
120b0 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20  ) then swap the 
120c0 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69  lower 4 bytes wi
120d0 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72  th the .** upper
120e0 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72   4 bytes.  Retur
120f0 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  n the result..**
12100 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63  .** For most arc
12110 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73  hitectures, this
12120 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
12130 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20  ** (later):  It 
12140 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d  is reported to m
12150 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64  e that the mixed
12160 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a  -endian problem.
12170 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e  ** on ARM7 is an
12180 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c   issue with GCC,
12190 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52   not with the AR
121a0 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65  M7 chip.  It see
121b0 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79  ms.** that early
121c0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
121d0 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20   stored the two 
121e0 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69  words of a 64-bi
121f0 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68  t.** float in th
12200 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20  e wrong order.  
12210 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68  And that error h
12220 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74  as been propagat
12230 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65  ed.** ever since
12240 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20  .  The blame is 
12250 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
12260 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68  with GCC, though
12270 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68  ..** GCC might h
12280 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67  ave just copying
12290 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f   the problem fro
122a0 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c  m a prior compil
122b0 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f  er..** I am also
122c0 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72   told that newer
122d0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
122e0 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64   that follow a d
122f0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20  ifferent.** ABI 
12300 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  get the byte ord
12310 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  er right..**.** 
12320 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67  Developers using
12330 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52   SQLite on an AR
12340 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c  M7 should compil
12350 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a  e and run their.
12360 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75  ** application u
12370 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45  sing -DSQLITE_DE
12380 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f  BUG=1 at least o
12390 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47  nce.  With DEBUG
123a0 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d  .** enabled, som
123b0 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20  e asserts below 
123c0 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74  will ensure that
123d0 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
123e0 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70  of.** floating p
123f0 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63  oint values is c
12400 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32  orrect..**.** (2
12410 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e  007-08-30)  Fran
12420 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73  k van Vugt has s
12430 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62  tudied this prob
12440 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61  lem closely.** a
12450 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20  nd has send his 
12460 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20  findings to the 
12470 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72  SQLite developer
12480 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69  s.  Frank.** wri
12490 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69  tes that some Li
124a0 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65  nux kernels offe
124b0 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  r floating point
124c0 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75   hardware.** emu
124d0 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73  lation that uses
124e0 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e   only 32-bit man
124f0 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f  tissas instead o
12500 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d  f a full .** 48-
12510 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64  bits as required
12520 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61   by the IEEE sta
12530 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73  ndard.  (This is
12540 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46   the.** CONFIG_F
12550 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f  PE_FASTFPE optio
12560 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73  n.)  On such sys
12570 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70  tems, floating p
12580 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61  oint.** byte swa
12590 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65  pping becomes ve
125a0 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20  ry complicated. 
125b0 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   To avoid proble
125c0 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73  ms,.** the neces
125d0 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69  sary byte swappi
125e0 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75  ng is carried ou
125f0 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74  t using a 64-bit
12600 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68   integer.** rath
12610 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74  er than a 64-bit
12620 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61   float.  Frank a
12630 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74  ssures us that t
12640 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20  he code here.** 
12650 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20  works for him.  
12660 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65  We, the develope
12670 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20  rs, have no way 
12680 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  to independently
12690 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c  .** verify this,
126a0 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73   but Frank seems
126b0 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65   to know what he
126c0 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75   is talking abou
126d0 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74  t.** so we trust
126e0 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20   him..*/.#ifdef 
126f0 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
12700 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a  IAN_64BIT_FLOAT.
12710 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74  static u64 float
12720 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20  Swap(u64 in){.  
12730 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20  union {.    u64 
12740 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b  r;.    u32 i[2];
12750 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b  .  } u;.  u32 t;
12760 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20  ..  u.r = in;.  
12770 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e  t = u.i[0];.  u.
12780 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20  i[0] = u.i[1];. 
12790 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72   u.i[1] = t;.  r
127a0 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64  eturn u.r;.}.# d
127b0 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
127c0 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58  ndianFloat(X)  X
127d0 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a   = floatSwap(X).
127e0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
127f0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
12800 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  oat(X).#endif../
12810 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
12820 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62  erialized data b
12830 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75  lob for the valu
12840 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
12850 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49   into .** buf. I
12860 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
12870 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
12880 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69   allocated suffi
12890 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20  cient space..** 
128a0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
128b0 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
128c0 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69  en..**.** nBuf i
128d0 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  s the amount of 
128e0 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75  space left in bu
128f0 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20  f[].  nBuf must 
12900 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72  always be.** lar
12910 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ge enough to hol
12920 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65  d the entire fie
12930 6c 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  ld.  Except, if 
12940 74 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20  the field is.** 
12950 61 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65  a blob with a ze
12960 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20  ro-filled tail, 
12970 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74  then buf[] might
12980 20 62 65 20 6a 75 73 74 20 74 68 65 20 72 69 67   be just the rig
12990 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f  ht.** size to ho
129a0 6c 64 20 65 76 65 72 79 74 68 69 6e 67 20 65 78  ld everything ex
129b0 63 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72  cept for the zer
129c0 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20  o-filled tail.  
129d0 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f  If buf[].** is o
129e0 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74  nly big enough t
129f0 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a  o hold the non-z
12a00 65 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e  ero prefix, then
12a10 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74   only write that
12a20 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20  .** prefix into 
12a30 62 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62  buf[].  But if b
12a40 75 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e  uf[] is large en
12a50 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74  ough to hold bot
12a60 68 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20  h the.** prefix 
12a70 61 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68 65  and the tail the
12a80 6e 20 77 72 69 74 65 20 74 68 65 20 70 72 65 66  n write the pref
12a90 69 78 20 61 6e 64 20 73 65 74 20 74 68 65 20 74  ix and set the t
12aa0 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65  ail to all.** ze
12ab0 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ros..**.** Retur
12ac0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
12ad0 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77  bytes actually w
12ae0 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b  ritten into buf[
12af0 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  ].  The number.*
12b00 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  * of bytes in th
12b10 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
12b20 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69  il is included i
12b30 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
12b40 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68  ue only.** if th
12b50 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a  ose bytes were z
12b60 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a  eroed in buf[]..
12b70 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56  */ .u32 sqlite3V
12b80 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20  dbeSerialPut(u8 
12b90 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20  *buf, int nBuf, 
12ba0 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
12bb0 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75  ile_format){.  u
12bc0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d  32 serial_type =
12bd0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
12be0 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c  alType(pMem, fil
12bf0 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 75 33 32  e_format);.  u32
12c00 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65   len;..  /* Inte
12c10 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a  ger and Real */.
12c20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
12c30 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=7 && serial_t
12c40 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34  ype>0 ){.    u64
12c50 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20   v;.    u32 i;. 
12c60 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
12c70 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61  pe==7 ){.      a
12c80 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29  ssert( sizeof(v)
12c90 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72  ==sizeof(pMem->r
12ca0 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
12cb0 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20  y(&v, &pMem->r, 
12cc0 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20  sizeof(v));.    
12cd0 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
12ce0 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d  nFloat(v);.    }
12cf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20  else{.      v = 
12d00 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  pMem->u.i;.    }
12d10 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73  .    len = i = s
12d20 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
12d30 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
12d40 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ype);.    assert
12d50 28 20 6c 65 6e 3c 3d 28 75 33 32 29 6e 42 75 66  ( len<=(u32)nBuf
12d60 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69   );.    while( i
12d70 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b  -- ){.      buf[
12d80 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46  i] = (u8)(v&0xFF
12d90 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38  );.      v >>= 8
12da0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
12db0 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
12dc0 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  * String or blob
12dd0 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
12de0 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
12df0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
12e00 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73   + ((pMem->flags
12e10 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65   & MEM_Zero)?pMe
12e20 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20  m->u.nZero:0).  
12e30 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69             == (i
12e40 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt)sqlite3VdbeSe
12e50 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
12e60 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20  al_type) );.    
12e70 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c  assert( pMem->n<
12e80 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e  =nBuf );.    len
12e90 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20   = pMem->n;.    
12ea0 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d  memcpy(buf, pMem
12eb0 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69  ->z, len);.    i
12ec0 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
12ed0 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
12ee0 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e     len += pMem->
12ef0 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 61  u.nZero;.      a
12f00 73 73 65 72 74 28 20 6e 42 75 66 3e 3d 30 20 29  ssert( nBuf>=0 )
12f10 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e 20  ;.      if( len 
12f20 3e 20 28 75 33 32 29 6e 42 75 66 20 29 7b 0a 20  > (u32)nBuf ){. 
12f30 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 28 75 33         len = (u3
12f40 32 29 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a  2)nBuf;.      }.
12f50 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75        memset(&bu
12f60 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c  f[pMem->n], 0, l
12f70 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20  en-pMem->n);.   
12f80 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65   }.    return le
12f90 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c  n;.  }..  /* NUL
12fa0 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30  L or constants 0
12fb0 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72   or 1 */.  retur
12fc0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n 0;.}../*.** De
12fd0 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
12fe0 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
12ff0 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
13000 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
13010 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
13020 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
13030 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
13040 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
13050 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 75 33 32 20  s read..*/ .u32 
13060 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
13070 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
13080 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
13090 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
130a0 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
130b0 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
130c0 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
130d0 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
130e0 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
130f0 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
13100 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
13110 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
13120 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
13130 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
13140 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
13150 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
13160 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65  se 10:   /* Rese
13170 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
13180 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
13190 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  11:   /* Reserve
131a0 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
131b0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20   */.    case 0: 
131c0 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20  {  /* NULL */.  
131d0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
131e0 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
131f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13200 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20     case 1: { /* 
13210 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  1-byte signed in
13220 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
13230 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e  Mem->u.i = (sign
13240 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a  ed char)buf[0];.
13250 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
13260 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
13270 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
13280 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
13290 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
132a0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
132b0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
132c0 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
132d0 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
132e0 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  1];.      pMem->
132f0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
13300 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
13310 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13320 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73  3: { /* 3-byte s
13330 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
13340 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
13350 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
13360 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c  r)buf[0])<<16) |
13370 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62   (buf[1]<<8) | b
13380 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[2];.      pMe
13390 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
133a0 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
133b0 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   3;.    }.    ca
133c0 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
133d0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
133e0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
133f0 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32  u.i = (buf[0]<<2
13400 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36  4) | (buf[1]<<16
13410 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20  ) | (buf[2]<<8) 
13420 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20  | buf[3];.      
13430 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
13440 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
13450 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 4;.    }.   
13460 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d   case 5: { /* 6-
13470 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
13480 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34  ger */.      u64
13490 20 78 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63   x = (((signed c
134a0 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20  har)buf[0])<<8) 
134b0 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20  | buf[1];.      
134c0 75 33 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c  u32 y = (buf[2]<
134d0 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c  <24) | (buf[3]<<
134e0 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38  16) | (buf[4]<<8
134f0 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20  ) | buf[5];.    
13500 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
13510 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  y;.      pMem->u
13520 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
13530 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
13540 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
13550 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20     return 6;.   
13560 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20   }.    case 6:  
13570 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
13580 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
13590 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45   case 7: { /* IE
135a0 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  EE floating poin
135b0 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78  t */.      u64 x
135c0 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23  ;.      u32 y;.#
135d0 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
135e0 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UG) && !defined(
135f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
13600 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
13610 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
13620 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c   integers and fl
13630 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
13640 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ues use the same
13650 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f  .      ** byte o
13660 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20  rder.  Or, that 
13670 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  if SQLITE_MIXED_
13680 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
13690 41 54 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  AT is.      ** d
136a0 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62  efined that 64-b
136b0 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  it floating poin
136c0 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20  t values really 
136d0 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20  are mixed.      
136e0 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20  ** endian..     
136f0 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
13700 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20   const u64 t1 = 
13710 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30  ((u64)0x3ff00000
13720 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61  )<<32;.      sta
13730 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65  tic const double
13740 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20   r1 = 1.0;.     
13750 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20   u64 t2 = t1;.  
13760 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
13770 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20  ianFloat(t2);.  
13780 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
13790 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74  of(r1)==sizeof(t
137a0 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31  2) && memcmp(&r1
137b0 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31  , &t2, sizeof(r1
137c0 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ))==0 );.#endif.
137d0 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75 66 5b  .      x = (buf[
137e0 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31  0]<<24) | (buf[1
137f0 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d  ]<<16) | (buf[2]
13800 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20  <<8) | buf[3];. 
13810 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34 5d       y = (buf[4]
13820 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c  <<24) | (buf[5]<
13830 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c  <16) | (buf[6]<<
13840 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20  8) | buf[7];.   
13850 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
13860 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   y;.      if( se
13870 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a  rial_type==6 ){.
13880 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e          pMem->u.
13890 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
138a0 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
138b0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
138c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
138d0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
138e0 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f  f(x)==8 && sizeo
138f0 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b  f(pMem->r)==8 );
13900 0a 20 20 20 20 20 20 20 20 73 77 61 70 4d 69 78  .        swapMix
13910 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29  edEndianFloat(x)
13920 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
13930 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73  (&pMem->r, &x, s
13940 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20  izeof(x));.     
13950 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
13960 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d   sqlite3IsNaN(pM
13970 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c  em->r) ? MEM_Nul
13980 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20  l : MEM_Real;.  
13990 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
139a0 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 8;.    }.    
139b0 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e  case 8:    /* In
139c0 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63  teger 0 */.    c
139d0 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74  ase 9: {  /* Int
139e0 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20  eger 1 */.      
139f0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69  pMem->u.i = seri
13a00 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20  al_type-8;.     
13a10 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
13a20 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
13a30 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
13a40 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
13a50 20 20 20 75 33 32 20 6c 65 6e 20 3d 20 28 73 65     u32 len = (se
13a60 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
13a70 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
13a80 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20   (char *)buf;.  
13a90 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65      pMem->n = le
13aa0 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78  n;.      pMem->x
13ab0 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  Del = 0;.      i
13ac0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30  f( serial_type&0
13ad0 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  x01 ){.        p
13ae0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
13af0 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d  _Str | MEM_Ephem
13b00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13b10 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
13b20 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20  gs = MEM_Blob | 
13b30 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20  MEM_Ephem;.     
13b40 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
13b50 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  len;.    }.  }. 
13b60 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
13b70 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
13b80 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e  Key-byte encodin
13b90 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e  g of a record in
13ba0 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73 65 20 74   pKey[], parse t
13bb0 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e 74  he.** record int
13bc0 6f 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  o a UnpackedReco
13bd0 72 64 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  rd structure.  R
13be0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
13bf0 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74 72 75 63  to.** that struc
13c00 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ture..**.** The 
13c10 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
13c20 20 6d 69 67 68 74 20 70 72 6f 76 69 64 65 20 73   might provide s
13c30 7a 53 70 61 63 65 20 62 79 74 65 73 20 6f 66 20  zSpace bytes of 
13c40 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20  memory.** space 
13c50 61 74 20 70 53 70 61 63 65 2e 20 20 54 68 69 73  at pSpace.  This
13c60 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 75 73   space can be us
13c70 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ed to hold the r
13c80 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44 62 65 50  eturned.** VDbeP
13c90 61 72 73 65 64 52 65 63 6f 72 64 20 73 74 72 75  arsedRecord stru
13ca0 63 74 75 72 65 20 69 66 20 69 74 20 69 73 20 6c  cture if it is l
13cb0 61 72 67 65 20 65 6e 6f 75 67 68 2e 20 20 49 66  arge enough.  If
13cc0 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 62 69   it is.** not bi
13cd0 67 20 65 6e 6f 75 67 68 2c 20 73 70 61 63 65 20  g enough, space 
13ce0 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
13cf0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
13d00 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  )..**.** The ret
13d10 75 72 6e 65 64 20 73 74 72 75 63 74 75 72 65 20  urned structure 
13d20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
13d30 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 2a 2a   by a call to.**
13d40 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
13d50 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  teUnpackedRecord
13d60 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63 6b 65 64  ()..*/ .Unpacked
13d70 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56  Record *sqlite3V
13d80 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
13d90 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
13da0 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66  Info,     /* Inf
13db0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
13dc0 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74  he record format
13dd0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20   */.  int nKey, 
13de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13df0 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61  Size of the bina
13e00 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ry record */.  c
13e10 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
13e20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e        /* The bin
13e30 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
13e40 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20  char *pSpace,   
13e50 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67         /* Unalig
13e60 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c 61  ned space availa
13e70 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ble to hold the 
13e80 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
13e90 73 7a 53 70 61 63 65 20 20 20 20 20 20 20 20 20  szSpace         
13ea0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53     /* Size of pS
13eb0 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20  pace[] in bytes 
13ec0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  */.){.  const un
13ed0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
13ee0 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  y = (const unsig
13ef0 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b  ned char *)pKey;
13f00 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
13f10 64 20 2a 70 3b 20 20 2f 2a 20 54 68 65 20 75 6e  d *p;  /* The un
13f20 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 68  packed record th
13f30 61 74 20 77 65 20 77 69 6c 6c 20 72 65 74 75 72  at we will retur
13f40 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  n */.  int nByte
13f50 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65  ;          /* Me
13f60 6d 6f 72 79 20 73 70 61 63 65 20 6e 65 65 64 65  mory space neede
13f70 64 20 74 6f 20 68 6f 6c 64 20 70 2c 20 69 6e 20  d to hold p, in 
13f80 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 64  bytes */.  int d
13f90 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75  ;.  u32 idx;.  u
13fa0 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  16 u;           
13fb0 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
13fc0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
13fd0 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65   u32 szHdr;.  Me
13fe0 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e 74 20 6e  m *pMem;.  int n
13ff0 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Off;           /
14000 2a 20 49 6e 63 72 65 61 73 65 20 70 53 70 61 63  * Increase pSpac
14010 65 20 62 79 20 74 68 69 73 20 6d 75 63 68 20 74  e by this much t
14020 6f 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 20 69  o 8-byte align i
14030 74 20 2a 2f 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  t */.  .  /*.  *
14040 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69  * We want to shi
14050 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70  ft the pointer p
14060 53 70 61 63 65 20 75 70 20 73 75 63 68 20 74 68  Space up such th
14070 61 74 20 69 74 20 69 73 20 38 2d 62 79 74 65 20  at it is 8-byte 
14080 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68  aligned..  ** Th
14090 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63  us, we need to c
140a0 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65  alculate a value
140b0 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20  , nOff, between 
140c0 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66  0 and 7, to shif
140d0 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20  t .  ** it by.  
140e0 49 66 20 70 53 70 61 63 65 20 69 73 20 61 6c 72  If pSpace is alr
140f0 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67  eady 8-byte alig
14100 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64  ned, nOff should
14110 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20   be zero..  */. 
14120 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51   nOff = (8 - (SQ
14130 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
14140 70 53 70 61 63 65 29 20 26 20 37 29 29 20 26 20  pSpace) & 7)) & 
14150 37 3b 0a 20 20 70 53 70 61 63 65 20 2b 3d 20 6e  7;.  pSpace += n
14160 4f 66 66 3b 0a 20 20 73 7a 53 70 61 63 65 20 2d  Off;.  szSpace -
14170 3d 20 6e 4f 66 66 3b 0a 20 20 6e 42 79 74 65 20  = nOff;.  nByte 
14180 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
14190 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
141a0 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28   + sizeof(Mem)*(
141b0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
141c0 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  +1);.  if( nByte
141d0 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20 20 20 20  >szSpace ){.    
141e0 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
141f0 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d  locRaw(pKeyInfo-
14200 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  >db, nByte);.   
14210 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
14220 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e 66 6c 61  rn 0;.    p->fla
14230 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e 45  gs = UNPACKED_NE
14240 45 44 5f 46 52 45 45 20 7c 20 55 4e 50 41 43 4b  ED_FREE | UNPACK
14250 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 3b  ED_NEED_DESTROY;
14260 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
14270 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
14280 64 2a 29 70 53 70 61 63 65 3b 0a 20 20 20 20 70  d*)pSpace;.    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 44 45 53 54 52 4f 59 3b  ED_NEED_DESTROY;
142b0 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65 79 49 6e  .  }.  p->pKeyIn
142c0 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
142d0 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65   p->nField = pKe
142e0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
142f0 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 70  1;.  p->aMem = p
14300 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63  Mem = (Mem*)&((c
14310 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73  har*)p)[ROUND8(s
14320 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
14330 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72  cord))];.  asser
14340 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
14350 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b  IGNMENT(pMem) );
14360 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69  .  idx = getVari
14370 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72  nt32(aKey, szHdr
14380 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a  );.  d = szHdr;.
14390 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65    u = 0;.  while
143a0 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 75  ( idx<szHdr && u
143b0 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 3c  <p->nField && d<
143c0 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32  =nKey ){.    u32
143d0 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
143e0 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
143f0 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d  int32(&aKey[idx]
14400 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
14410 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
14420 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
14430 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b     pMem->db = pK
14440 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
14450 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  pMem->flags = 0;
14460 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c  .    pMem->zMall
14470 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d  oc = 0;.    d +=
14480 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
14490 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20  alGet(&aKey[d], 
144a0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65  serial_type, pMe
144b0 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  m);.    pMem++;.
144c0 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61      u++;.  }.  a
144d0 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e  ssert( u<=pKeyIn
144e0 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29  fo->nField + 1 )
144f0 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
14500 75 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  u;.  return (voi
14510 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  d*)p;.}../*.** T
14520 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 73 74  his routine dest
14530 72 6f 79 73 20 61 20 55 6e 70 61 63 6b 65 64 52  roys a UnpackedR
14540 65 63 6f 72 64 20 6f 62 6a 65 63 74 2e 0a 2a 2f  ecord object..*/
14550 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
14560 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
14570 65 63 6f 72 64 28 55 6e 70 61 63 6b 65 64 52 65  ecord(UnpackedRe
14580 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 6e 74 20  cord *p){.  int 
14590 69 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a  i;.  Mem *pMem;.
145a0 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
145b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
145c0 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
145d0 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 20 29 3b  _NEED_DESTROY );
145e0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d  .  for(i=0, pMem
145f0 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e  =p->aMem; i<p->n
14600 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d  Field; i++, pMem
14610 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ++){.    /* The 
14620 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20  unpacked record 
14630 69 73 20 61 6c 77 61 79 73 20 63 6f 6e 73 74 72  is always constr
14640 75 63 74 65 64 20 62 79 20 74 68 65 0a 20 20 20  ucted by the.   
14650 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 55   ** sqlite3VdbeU
14660 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75  npackRecord() fu
14670 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2c 20 77 68  nction above, wh
14680 69 63 68 20 6d 61 6b 65 73 20 61 6c 6c 0a 20 20  ich makes all.  
14690 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e 64    ** strings and
146a0 20 62 6c 6f 62 73 20 73 74 61 74 69 63 2e 20 20   blobs static.  
146b0 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  And none of the 
146c0 65 6c 65 6d 65 6e 74 73 20 61 72 65 0a 20 20 20  elements are.   
146d0 20 2a 2a 20 65 76 65 72 20 74 72 61 6e 73 66 6f   ** ever transfo
146e0 72 6d 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69  rmed, so there i
146f0 73 20 6e 65 76 65 72 20 61 6e 79 74 68 69 6e 67  s never anything
14700 20 74 6f 20 64 65 6c 65 74 65 2e 0a 20 20 20 20   to delete..    
14710 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  */.    if( NEVER
14720 28 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29 20  (pMem->zMalloc) 
14730 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ) sqlite3VdbeMem
14740 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20  Release(pMem);. 
14750 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67   }.  if( p->flag
14760 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  s & UNPACKED_NEE
14770 44 5f 46 52 45 45 20 29 7b 0a 20 20 20 20 73 71  D_FREE ){.    sq
14780 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 70  lite3DbFree(p->p
14790 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 29 3b  KeyInfo->db, p);
147a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
147b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
147c0 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62  ares the two tab
147d0 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78  le rows or index
147e0 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63   records.** spec
147f0 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c  ified by {nKey1,
14800 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65   pKey1} and pPKe
14810 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  y2.  It returns 
14820 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  a negative, zero
14830 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
14840 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20  integer if key1 
14850 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
14860 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72  ual to or .** gr
14870 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e  eater than key2.
14880 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b    The {nKey1, pK
14890 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65  ey1} key must be
148a0 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74   a blob.** creat
148b0 65 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65  ed by th OP_Make
148c0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
148d0 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20   the VDBE.  The 
148e0 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75  pPKey2.** key mu
148f0 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b  st be a parsed k
14900 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69  ey such as obtai
14910 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
14920 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f  te3VdbeParseReco
14930 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61  rd..**.** Key1 a
14940 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68  nd Key2 do not h
14950 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ave to contain t
14960 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
14970 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65  f fields..** The
14980 20 6b 65 79 20 77 69 74 68 20 66 65 77 65 72 20   key with fewer 
14990 66 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c  fields is usuall
149a0 79 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20  y compares less 
149b0 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e  than the .** lon
149c0 67 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65  ger key.  Howeve
149d0 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45  r if the UNPACKE
149e0 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20  D_INCRKEY flags 
149f0 69 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65 74  in pPKey2 is set
14a00 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d  .** and the comm
14a10 6f 6e 20 70 72 65 66 69 78 65 73 20 61 72 65 20  on prefixes are 
14a20 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31  equal, then key1
14a30 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65   is less than ke
14a40 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65  y2..** Or if the
14a50 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f   UNPACKED_MATCH_
14a60 50 52 45 46 49 58 20 66 6c 61 67 20 69 73 20 73  PREFIX flag is s
14a70 65 74 20 61 6e 64 20 74 68 65 20 70 72 65 66 69  et and the prefi
14a80 78 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c  xes are.** equal
14a90 2c 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20  , then the keys 
14aa0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
14ab0 6f 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a  o be equal and.*
14ac0 2a 20 74 68 65 20 70 61 72 74 73 20 62 65 79 6f  * the parts beyo
14ad0 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72  nd the common pr
14ae0 65 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64  efix are ignored
14af0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 55  ..**.** If the U
14b00 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52  NPACKED_IGNORE_R
14b10 4f 57 49 44 20 66 6c 61 67 20 69 73 20 73 65 74  OWID flag is set
14b20 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20  , then the last 
14b30 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 68  byte of.** the h
14b40 65 61 64 65 72 20 6f 66 20 70 4b 65 79 31 20 69  eader of pKey1 i
14b50 73 20 69 67 6e 6f 72 65 64 2e 20 20 49 74 20 69  s ignored.  It i
14b60 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 70  s assumed that p
14b70 4b 65 79 31 20 69 73 0a 2a 2a 20 61 6e 20 69 6e  Key1 is.** an in
14b80 64 65 78 20 6b 65 79 2c 20 61 6e 64 20 74 68 75  dex key, and thu
14b90 73 20 65 6e 64 73 20 77 69 74 68 20 61 20 72 6f  s ends with a ro
14ba0 77 69 64 20 76 61 6c 75 65 2e 20 20 54 68 65 20  wid value.  The 
14bb0 6c 61 73 74 20 62 79 74 65 0a 2a 2a 20 6f 66 20  last byte.** of 
14bc0 74 68 65 20 68 65 61 64 65 72 20 77 69 6c 6c 20  the header will 
14bd0 74 68 65 72 65 66 6f 72 65 20 62 65 20 74 68 65  therefore be the
14be0 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   serial type of 
14bf0 74 68 65 20 72 6f 77 69 64 3a 0a 2a 2a 20 6f 6e  the rowid:.** on
14c00 65 20 6f 66 20 31 2c 20 32 2c 20 33 2c 20 34 2c  e of 1, 2, 3, 4,
14c10 20 35 2c 20 36 2c 20 38 2c 20 6f 72 20 39 20 2d   5, 6, 8, or 9 -
14c20 20 74 68 65 20 69 6e 74 65 67 65 72 20 73 65 72   the integer ser
14c30 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2a 20 54 68  ial types..** Th
14c40 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66  e serial type of
14c50 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
14c60 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
14c70 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a  a single byte..*
14c80 2a 20 42 79 20 69 67 6e 6f 72 69 6e 67 20 74 68  * By ignoring th
14c90 69 73 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20  is last byte of 
14ca0 74 68 65 20 68 65 61 64 65 72 2c 20 77 65 20 66  the header, we f
14cb0 6f 72 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69  orce the compari
14cc0 73 6f 6e 0a 2a 2a 20 74 6f 20 69 67 6e 6f 72 65  son.** to ignore
14cd0 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
14ce0 65 20 65 6e 64 20 6f 66 20 6b 65 79 31 2e 0a 2a  e end of key1..*
14cf0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
14d00 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a  eRecordCompare(.
14d10 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
14d20 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
14d30 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
14d40 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
14d50 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
14d60 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
14d70 7b 0a 20 20 69 6e 74 20 64 31 3b 20 20 20 20 20  {.  int d1;     
14d80 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
14d90 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
14da0 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
14db0 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  t */.  u32 idx1;
14dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
14dd0 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
14de0 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65  of next header e
14df0 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
14e00 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f  szHdr1;        /
14e10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
14e20 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  s in header */. 
14e30 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
14e40 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20  t nField;.  int 
14e50 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  rc = 0;.  const 
14e60 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
14e70 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
14e80 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
14e90 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ey1;.  KeyInfo *
14ea0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20  pKeyInfo;.  Mem 
14eb0 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66  mem1;..  pKeyInf
14ec0 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  o = pPKey2->pKey
14ed0 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63  Info;.  mem1.enc
14ee0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
14ef0 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b  ;.  mem1.db = pK
14f00 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 6d 65  eyInfo->db;.  me
14f10 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  m1.flags = 0;.  
14f20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f  mem1.u.i = 0;  /
14f30 2a 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65  * not needed, he
14f40 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f  re to silence co
14f50 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a  mpiler warning *
14f60 2f 0a 20 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63  /.  mem1.zMalloc
14f70 20 3d 20 30 3b 0a 20 20 0a 20 20 69 64 78 31 20   = 0;.  .  idx1 
14f80 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
14f90 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20  ey1, szHdr1);.  
14fa0 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 69  d1 = szHdr1;.  i
14fb0 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73  f( pPKey2->flags
14fc0 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f   & UNPACKED_IGNO
14fd0 52 45 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  RE_ROWID ){.    
14fe0 73 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d 0a 20 20  szHdr1--;.  }.  
14ff0 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
15000 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69  o->nField;.  whi
15010 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  le( idx1<szHdr1 
15020 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
15030 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73  eld ){.    u32 s
15040 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20  erial_type1;..  
15050 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
15060 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
15070 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
15080 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
15090 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56      idx1 += getV
150a0 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69  arint32( aKey1+i
150b0 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx1, serial_type
150c0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64 31 3e  1 );.    if( d1>
150d0 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74 65  =nKey1 && sqlite
150e0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
150f0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29  en(serial_type1)
15100 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  >0 ) break;..   
15110 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
15120 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d  values to be com
15130 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  pared..    */.  
15140 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
15150 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
15160 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
15170 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a  type1, &mem1);..
15180 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
15190 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a  mparison.    */.
151a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
151b0 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31  MemCompare(&mem1
151c0 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  , &pPKey2->aMem[
151d0 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i],.            
151e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
151f0 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e  <nField ? pKeyIn
15200 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30  fo->aColl[i] : 0
15210 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
15220 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
15230 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a  .    }.    i++;.
15240 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d    }..  /* No mem
15250 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ory allocation i
15260 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d  s ever used on m
15270 65 6d 31 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  em1. */.  if( NE
15280 56 45 52 28 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63  VER(mem1.zMalloc
15290 29 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ) ) sqlite3VdbeM
152a0 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
152b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50  ;..  /* If the P
152c0 52 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61  REFIX_SEARCH fla
152d0 67 20 69 73 20 73 65 74 20 61 6e 64 20 61 6c 6c  g is set and all
152e0 20 66 69 65 6c 64 73 20 65 78 63 65 70 74 20 74   fields except t
152f0 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 72 6f  he final.  ** ro
15300 77 69 64 20 66 69 65 6c 64 20 77 65 72 65 20 65  wid field were e
15310 71 75 61 6c 2c 20 74 68 65 6e 20 63 6c 65 61 72  qual, then clear
15320 20 74 68 65 20 50 52 45 46 49 58 5f 53 45 41 52   the PREFIX_SEAR
15330 43 48 20 66 6c 61 67 20 61 6e 64 20 73 65 74 20  CH flag and set 
15340 0a 20 20 2a 2a 20 70 50 4b 65 79 32 2d 3e 72 6f  .  ** pPKey2->ro
15350 77 69 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  wid to the value
15360 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 66 69   of the rowid fi
15370 65 6c 64 20 69 6e 20 28 70 4b 65 79 31 2c 20 6e  eld in (pKey1, n
15380 4b 65 79 31 29 2e 0a 20 20 2a 2a 20 54 68 69 73  Key1)..  ** This
15390 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
153a0 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f 70 63 6f  OP_IsUnique opco
153b0 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  de..  */.  if( (
153c0 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20  pPKey2->flags & 
153d0 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f  UNPACKED_PREFIX_
153e0 53 45 41 52 43 48 29 20 26 26 20 69 3d 3d 28 70  SEARCH) && i==(p
153f0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 2d 31 29  PKey2->nField-1)
15400 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15410 69 64 78 31 3d 3d 73 7a 48 64 72 31 20 26 26 20  idx1==szHdr1 && 
15420 72 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  rc );.    assert
15430 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d  ( mem1.flags & M
15440 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 70 50  EM_Int );.    pP
15450 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  Key2->flags &= ~
15460 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f  UNPACKED_PREFIX_
15470 53 45 41 52 43 48 3b 0a 20 20 20 20 70 50 4b 65  SEARCH;.    pPKe
15480 79 32 2d 3e 72 6f 77 69 64 20 3d 20 6d 65 6d 31  y2->rowid = mem1
15490 2e 75 2e 69 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  .u.i;.  }..  if(
154a0 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a   rc==0 ){.    /*
154b0 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
154c0 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
154d0 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
154e0 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 20  f fields and.   
154f0 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c   ** all the fiel
15500 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f  ds up to that po
15510 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20  int were equal. 
15520 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  If the UNPACKED_
15530 49 4e 43 52 4b 45 59 0a 20 20 20 20 2a 2a 20 66  INCRKEY.    ** f
15540 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
15550 20 62 72 65 61 6b 20 74 68 65 20 74 69 65 20 62   break the tie b
15560 79 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32 20  y treating key2 
15570 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 20 20 2a  as larger..    *
15580 2a 20 49 66 20 74 68 65 20 55 50 41 43 4b 45 44  * If the UPACKED
15590 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20 66 6c  _PREFIX_MATCH fl
155a0 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
155b0 6b 65 79 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e  keys with common
155c0 20 70 72 65 66 69 78 65 73 0a 20 20 20 20 2a 2a   prefixes.    **
155d0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
155e0 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 4f 74  to be equal.  Ot
155f0 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c 6f 6e  herwise, the lon
15600 67 65 72 20 6b 65 79 20 69 73 20 74 68 65 20 0a  ger key is the .
15610 20 20 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20      ** larger.  
15620 41 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74  As it happens, t
15630 68 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61  he pPKey2 will a
15640 6c 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e  lways be the lon
15650 67 65 72 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  ger.    ** if th
15660 65 72 65 20 69 73 20 61 20 64 69 66 66 65 72 65  ere is a differe
15670 6e 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nce..    */.    
15680 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67  if( pPKey2->flag
15690 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43  s & UNPACKED_INC
156a0 52 4b 45 59 20 29 7b 0a 20 20 20 20 20 20 72 63  RKEY ){.      rc
156b0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
156c0 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
156d0 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs & UNPACKED_PR
156e0 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20  EFIX_MATCH ){.  
156f0 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d      /* Leave rc=
15700 3d 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20  =0 */.    }else 
15710 69 66 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  if( idx1<szHdr1 
15720 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  ){.      rc = 1;
15730 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
15740 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
15750 72 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b 65  rtOrder && i<pKe
15760 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a 20 20  yInfo->nField.  
15770 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
15780 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
15790 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 72  rder[i] ){.    r
157a0 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20  c = -rc;.  }..  
157b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a  return rc;.}. ..
157c0 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74  /*.** pCur point
157d0 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e  s at an index en
157e0 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e  try created usin
157f0 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  g the OP_MakeRec
15800 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52  ord opcode..** R
15810 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74  ead the rowid (t
15820 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e  he last field in
15830 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64   the record) and
15840 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f   store it in *ro
15850 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53  wid..** Return S
15860 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
15870 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72  ything works, or
15880 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f   an error code o
15890 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
158a0 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f  pCur might be po
158b0 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f  inting to text o
158c0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63  btained from a c
158d0 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
158e0 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20  file..** So the 
158f0 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62  content cannot b
15900 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61  e trusted.  Do a
15910 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b  ppropriate check
15920 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  s on the content
15930 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15940 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c  VdbeIdxRowid(sql
15950 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73  ite3 *db, BtCurs
15960 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72  or *pCur, i64 *r
15970 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65  owid){.  i64 nCe
15980 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  llKey = 0;.  int
15990 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72   rc;.  u32 szHdr
159a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ;        /* Size
159b0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a   of the header *
159c0 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69  /.  u32 typeRowi
159d0 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20  d;    /* Serial 
159e0 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69  type of the rowi
159f0 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f  d */.  u32 lenRo
15a00 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65  wid;     /* Size
15a10 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
15a20 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20  .  Mem m, v;..  
15a30 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
15a40 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  (db);..  /* Get 
15a50 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
15a60 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e  index entry.  On
15a70 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69  ly indices entri
15a80 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20  es of less.  ** 
15a90 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75  than 2GiB are su
15aa0 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67  pport - anything
15ab0 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64   large must be d
15ac0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
15ad0 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72  on..  ** Any cor
15ae0 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
15af0 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74  ted in sqlite3Bt
15b00 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
15b10 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20  ), though, so.  
15b20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e  ** this code can
15b30 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74   safely assume t
15b40 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20  hat nCellKey is 
15b50 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20  32-bits  .  */. 
15b60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15b70 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
15b80 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  id(pCur) );.  rc
15b90 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
15ba0 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
15bb0 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ellKey);.  asser
15bc0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
15bd0 20 29 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20   );     /* pCur 
15be0 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20  is always valid 
15bf0 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f  so KeySize canno
15c00 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65  t fail */.  asse
15c10 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20  rt( (nCellKey & 
15c20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d  SQLITE_MAX_U32)=
15c30 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29  =(u64)nCellKey )
15c40 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20  ;..  /* Read in 
15c50 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e  the complete con
15c60 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65  tent of the inde
15c70 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 65 6d  x entry */.  mem
15c80 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f  set(&m, 0, sizeo
15c90 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  f(m));.  rc = sq
15ca0 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
15cb0 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
15cc0 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c  int)nCellKey, 1,
15cd0 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
15ce0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
15cf0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69  .  }..  /* The i
15d00 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20  ndex entry must 
15d10 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61  begin with a hea
15d20 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76  der size */.  (v
15d30 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
15d40 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29  (u8*)m.z, szHdr)
15d50 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a  ;.  testcase( sz
15d60 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  Hdr==3 );.  test
15d70 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e  case( szHdr==m.n
15d80 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
15d90 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69  ly(szHdr<3 || (i
15da0 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b  nt)szHdr>m.n) ){
15db0 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
15dc0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
15dd0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61    }..  /* The la
15de0 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  st field of the 
15df0 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20  index should be 
15e00 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65  an integer - the
15e10 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72   ROWID..  ** Ver
15e20 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73  ify that the las
15e30 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69  t entry really i
15e40 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f  s an integer. */
15e50 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69  .  (void)getVari
15e60 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73  nt32((u8*)&m.z[s
15e70 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77  zHdr-1], typeRow
15e80 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  id);.  testcase(
15e90 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b   typeRowid==1 );
15ea0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
15eb0 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74  eRowid==2 );.  t
15ec0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
15ed0 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63  id==3 );.  testc
15ee0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
15ef0 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  4 );.  testcase(
15f00 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b   typeRowid==5 );
15f10 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
15f20 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74  eRowid==6 );.  t
15f30 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
15f40 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63  id==8 );.  testc
15f50 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
15f60 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  9 );.  if( unlik
15f70 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20  ely(typeRowid<1 
15f80 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c  || typeRowid>9 |
15f90 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20  | typeRowid==7) 
15fa0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
15fb0 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
15fc0 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64  ;.  }.  lenRowid
15fd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
15fe0 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65  rialTypeLen(type
15ff0 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
16000 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a  se( (u32)m.n==sz
16010 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a  Hdr+lenRowid );.
16020 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28    if( unlikely((
16030 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65  u32)m.n<szHdr+le
16040 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67  nRowid) ){.    g
16050 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
16060 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
16070 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e   /* Fetch the in
16080 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e  teger off the en
16090 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72  d of the index r
160a0 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
160b0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
160c0 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65  (u8*)&m.z[m.n-le
160d0 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77  nRowid], typeRow
160e0 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69  id, &v);.  *rowi
160f0 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c  d = v.u.i;.  sql
16100 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
16110 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
16120 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
16130 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64  * Jump here if d
16140 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
16150 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61  on is detected a
16160 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a  fter m has been.
16170 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20    ** allocated. 
16180 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65   Free the m obje
16190 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ct and return SQ
161a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f  LITE_CORRUPT. */
161b0 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75  .idx_rowid_corru
161c0 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73  ption:.  testcas
161d0 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20  e( m.zMalloc!=0 
161e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
161f0 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
16200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16210 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a  CORRUPT_BKPT;.}.
16220 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
16230 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e  he key of the in
16240 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63  dex entry that c
16250 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e  ursor pC is poin
16260 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a  ting to against.
16270 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e  ** the key strin
16280 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20  g in pUnpacked. 
16290 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65   Write into *pRe
162a0 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68  s a number.** th
162b0 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  at is negative, 
162c0 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
162d0 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20  e if pC is less 
162e0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a  than, equal to,.
162f0 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  ** or greater th
16300 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52  an pUnpacked.  R
16310 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
16320 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a  on success..**.*
16330 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65  * pUnpacked is e
16340 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69  ither created wi
16350 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72  thout a rowid or
16360 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f   is truncated so
16370 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74   that it.** omit
16380 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  s the rowid at t
16390 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77  he end.  The row
163a0 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
163b0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
163c0 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61  .** is ignored a
163d0 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20  s well.  Hence, 
163e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  this routine onl
163f0 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70  y compares the p
16400 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74  refixes .** of t
16410 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f  he keys prior to
16420 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
16430 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65  , not the entire
16440 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   key..*/.int sql
16450 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f  ite3VdbeIdxKeyCo
16460 6d 70 61 72 65 28 0a 20 20 56 64 62 65 43 75 72  mpare(.  VdbeCur
16470 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20  sor *pC,        
16480 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
16490 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67  or to compare ag
164a0 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63  ainst */.  Unpac
164b0 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61  kedRecord *pUnpa
164c0 63 6b 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b  cked,  /* Unpack
164d0 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65  ed version of ke
164e0 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  y to compare aga
164f0 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 72  inst */.  int *r
16500 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
16510 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
16520 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65  he comparison re
16530 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  sult here */.){.
16540 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
16550 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
16560 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  BtCursor *pCur =
16570 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20   pC->pCursor;.  
16580 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74  Mem m;..  assert
16590 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
165a0 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
165b0 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
165c0 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
165d0 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
165e0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
165f0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
16600 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79  /* pCur is alway
16610 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69  s valid so KeySi
16620 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  ze cannot fail *
16630 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20  /.  /* nCellKey 
16640 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62  will always be b
16650 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66  etween 0 and 0xf
16660 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20  fffffff because 
16670 6f 66 20 74 68 65 20 73 61 79 0a 20 20 2a 2a 20  of the say.  ** 
16680 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43  that btreeParseC
16690 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c  ellPtr() and sql
166a0 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
166b0 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
166c0 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c  d */.  if( nCell
166d0 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b  Key<=0 || nCellK
166e0 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b  ey>0x7fffffff ){
166f0 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20  .    *res = 0;. 
16700 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16710 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20  _CORRUPT;.  }.  
16720 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69  memset(&m, 0, si
16730 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d  zeof(m));.  rc =
16740 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
16750 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75  romBtree(pC->pCu
16760 72 73 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43  rsor, 0, (int)nC
16770 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
16780 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
16790 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
167a0 20 61 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b   assert( pUnpack
167b0 65 64 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41  ed->flags & UNPA
167c0 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49  CKED_IGNORE_ROWI
167d0 44 20 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71  D );.  *res = sq
167e0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
167f0 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c  ompare(m.n, m.z,
16800 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73   pUnpacked);.  s
16810 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
16820 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
16830 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16840 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
16850 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c  ine sets the val
16860 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ue to be returne
16870 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  d by subsequent 
16880 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
16890 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e  te3_changes() on
168a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
168b0 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76  ndle 'db'. .*/.v
168c0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
168d0 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  etChanges(sqlite
168e0 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e  3 *db, int nChan
168f0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ge){.  assert( s
16900 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16910 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
16920 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20    db->nChange = 
16930 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e  nChange;.  db->n
16940 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e  TotalChange += n
16950 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
16960 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74   Set a flag in t
16970 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74  he vdbe to updat
16980 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
16990 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20  nter when it is 
169a0 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20  finalised.** or 
169b0 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reset..*/.void s
169c0 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43  qlite3VdbeCountC
169d0 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b  hanges(Vdbe *v){
169e0 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  .  v->changeCntO
169f0 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 1;.}../*.** 
16a00 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61  Mark every prepa
16a10 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73  red statement as
16a20 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
16a30 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
16a40 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65  ion.** as expire
16a50 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69  d..**.** An expi
16a60 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65  red statement me
16a70 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69  ans that recompi
16a80 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  lation of the st
16a90 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65  atement is.** re
16aa0 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d  commend.  Statem
16ab0 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e  ents expire when
16ac0 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74   things happen t
16ad0 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a  hat make their.*
16ae0 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c  * programs obsol
16af0 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75  ete.  Removing u
16b00 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
16b10 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69  tions or collati
16b20 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c  ng.** sequences,
16b30 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20   or changing an 
16b40 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75  authorization fu
16b50 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74  nction are the t
16b60 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67  ypes of.** thing
16b70 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70  s that make prep
16b80 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
16b90 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69  obsolete..*/.voi
16ba0 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50  d sqlite3ExpireP
16bb0 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
16bc0 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
16bd0 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72    Vdbe *p;.  for
16be0 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20  (p = db->pVdbe; 
16bf0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
16c00 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d      p->expired =
16c10 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
16c20 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
16c30 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  base associated 
16c40 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a  with the Vdbe..*
16c50 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74  /.sqlite3 *sqlit
16c60 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76  e3VdbeDb(Vdbe *v
16c70 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64  ){.  return v->d
16c80 62 3b 0a 7d 0a                                   b;.}.