/ Hex Artifact Content
Login

Artifact 4dc5258ac337fd6600d1efb144b34316d2bbe05a:


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 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
02e0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74   new virtual dat
02f0: 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f  abase engine..*/
0300: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64  .Vdbe *sqlite3Vd
0310: 62 65 43 72 65 61 74 65 28 50 61 72 73 65 20 2a  beCreate(Parse *
0320: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
0330: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
0340: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  >db;.  Vdbe *p;.
0350: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
0360: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
0370: 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20 20  zeof(Vdbe) );.  
0380: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
0390: 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  n 0;.  p->db = d
03a0: 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64  b;.  if( db->pVd
03b0: 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56  be ){.    db->pV
03c0: 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  dbe->pPrev = p;.
03d0: 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d    }.  p->pNext =
03e0: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70 2d   db->pVdbe;.  p-
03f0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64 62  >pPrev = 0;.  db
0400: 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 70  ->pVdbe = p;.  p
0410: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
0420: 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e  AGIC_INIT;.  p->
0430: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
0440: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0450: 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->aLabel==0 );.
0460: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
0470: 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a 20  ->nLabel==0 );. 
0480: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
0490: 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  >nOpAlloc==0 );.
04a0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
04b0: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
04c0: 65 20 53 51 4c 20 73 74 72 69 6e 67 20 66 6f 72  e SQL string for
04d0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
04e0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
04f0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c  qlite3VdbeSetSql
0500: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
0510: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
0520: 69 6e 74 20 69 73 50 72 65 70 61 72 65 56 32 29  int isPrepareV2)
0530: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 50 72  {.  assert( isPr
0540: 65 70 61 72 65 56 32 3d 3d 31 20 7c 7c 20 69 73  epareV2==1 || is
0550: 50 72 65 70 61 72 65 56 32 3d 3d 30 20 29 3b 0a  PrepareV2==0 );.
0560: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
0570: 75 72 6e 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  urn;.#if defined
0580: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
0590: 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
05a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
05b0: 4c 4c 4f 47 29 0a 20 20 69 66 28 20 21 69 73 50  LLOG).  if( !isP
05c0: 72 65 70 61 72 65 56 32 20 29 20 72 65 74 75 72  repareV2 ) retur
05d0: 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  n;.#endif.  asse
05e0: 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29  rt( p->zSql==0 )
05f0: 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71  ;.  p->zSql = sq
0600: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
0610: 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 70  ->db, z, n);.  p
0620: 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d 20  ->isPrepareV2 = 
0630: 28 75 38 29 69 73 50 72 65 70 61 72 65 56 32 3b  (u8)isPrepareV2;
0640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0650: 20 74 68 65 20 53 51 4c 20 61 73 73 6f 63 69 61   the SQL associa
0660: 74 65 64 20 77 69 74 68 20 61 20 70 72 65 70 61  ted with a prepa
0670: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f  red statement.*/
0680: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
0690: 69 74 65 33 5f 73 71 6c 28 73 71 6c 69 74 65 33  ite3_sql(sqlite3
06a0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  _stmt *pStmt){. 
06b0: 20 56 64 62 65 20 2a 70 20 3d 20 28 56 64 62 65   Vdbe *p = (Vdbe
06c0: 20 2a 29 70 53 74 6d 74 3b 0a 20 20 72 65 74 75   *)pStmt;.  retu
06d0: 72 6e 20 28 70 20 26 26 20 70 2d 3e 69 73 50 72  rn (p && p->isPr
06e0: 65 70 61 72 65 56 32 29 20 3f 20 70 2d 3e 7a 53  epareV2) ? p->zS
06f0: 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ql : 0;.}../*.**
0700: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0710: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
0720: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
0730: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0740: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
0750: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
0760: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
0770: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 61   char *zTmp;.  a
0780: 73 73 65 72 74 28 20 70 41 2d 3e 64 62 3d 3d 70  ssert( pA->db==p
0790: 42 2d 3e 64 62 20 29 3b 0a 20 20 74 6d 70 20 3d  B->db );.  tmp =
07a0: 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70   *pA;.  *pA = *p
07b0: 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a  B;.  *pB = tmp;.
07c0: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65    pTmp = pA->pNe
07d0: 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20  xt;.  pA->pNext 
07e0: 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pB->pNext;.  p
07f0: 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b  B->pNext = pTmp;
0800: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50  .  pTmp = pA->pP
0810: 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76  rev;.  pA->pPrev
0820: 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20   = pB->pPrev;.  
0830: 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70  pB->pPrev = pTmp
0840: 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a  ;.  zTmp = pA->z
0850: 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20  Sql;.  pA->zSql 
0860: 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42  = pB->zSql;.  pB
0870: 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20  ->zSql = zTmp;. 
0880: 20 70 42 2d 3e 69 73 50 72 65 70 61 72 65 56 32   pB->isPrepareV2
0890: 20 3d 20 70 41 2d 3e 69 73 50 72 65 70 61 72 65   = pA->isPrepare
08a0: 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  V2;.}../*.** Res
08b0: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 4f 70  ize the Vdbe.aOp
08c0: 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 69   array so that i
08d0: 74 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  t is at least on
08e0: 65 20 6f 70 20 6c 61 72 67 65 72 20 74 68 61 6e  e op larger than
08f0: 20 0a 2a 2a 20 69 74 20 77 61 73 2e 0a 2a 2a 0a   .** it was..**.
0900: 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d  ** If an out-of-
0910: 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63 63  memory error occ
0920: 75 72 73 20 77 68 69 6c 65 20 72 65 73 69 7a 69  urs while resizi
0930: 6e 67 20 74 68 65 20 61 72 72 61 79 2c 20 72 65  ng the array, re
0940: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  turn.** SQLITE_N
0950: 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73 20 63 61  OMEM. In this ca
0960: 73 65 20 56 64 62 65 2e 61 4f 70 20 61 6e 64 20  se Vdbe.aOp and 
0970: 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65  Vdbe.nOpAlloc re
0980: 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  main .** unchang
0990: 65 64 20 28 74 68 69 73 20 69 73 20 73 6f 20 74  ed (this is so t
09a0: 68 61 74 20 61 6e 79 20 6f 70 63 6f 64 65 73 20  hat any opcodes 
09b0: 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65  already allocate
09c0: 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20 63 6f 72  d can be .** cor
09d0: 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f 63 61 74  rectly deallocat
09e0: 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
09f0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 56 64  e rest of the Vd
0a00: 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  be)..*/.static i
0a10: 6e 74 20 67 72 6f 77 4f 70 41 72 72 61 79 28 56  nt growOpArray(V
0a20: 64 62 65 20 2a 76 29 7b 0a 20 20 56 64 62 65 4f  dbe *v){.  VdbeO
0a30: 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65  p *pNew;.  Parse
0a40: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
0a50: 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70  .  int nNew = (p
0a60: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e  ->nOpAlloc ? p->
0a70: 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e  nOpAlloc*2 : (in
0a80: 74 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f  t)(1024/sizeof(O
0a90: 70 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  p)));.  pNew = s
0aa0: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
0ab0: 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e  p->db, v->aOp, n
0ac0: 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b  New*sizeof(Op));
0ad0: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
0ae0: 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d     p->nOpAlloc =
0af0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
0b00: 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77  Size(p->db, pNew
0b10: 29 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20  )/sizeof(Op);.  
0b20: 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b    v->aOp = pNew;
0b30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70  .  }.  return (p
0b40: 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  New ? SQLITE_OK 
0b50: 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  : SQLITE_NOMEM);
0b60: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
0b70: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
0b80: 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20  routine is just 
0b90: 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
0ba0: 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ce to set a brea
0bb0: 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c  kpoint that will
0bc0: 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65  .** fire after e
0bd0: 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e  ach opcode is in
0be0: 73 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c  serted and displ
0bf0: 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50  ayed using.** "P
0c00: 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70  RAGMA vdbe_addop
0c10: 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74  trace=on"..*/.st
0c20: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61  atic void test_a
0c30: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
0c40: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
0c50: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b  int n = 0;.  n++
0c60: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
0c70: 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74  * Add a new inst
0c80: 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  ruction to the l
0c90: 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ist of instructi
0ca0: 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74  ons current in t
0cb0: 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74  he.** VDBE.  Ret
0cc0: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
0cd0: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
0ce0: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61  uction..**.** Pa
0cf0: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
0d00: 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20     p            
0d10: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
0d20: 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20  e VDBE.**.**    
0d30: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
0d40: 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74  The opcode for t
0d50: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
0d60: 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c  **.**    p1, p2,
0d70: 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64   p3      Operand
0d80: 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  s.**.** Use the 
0d90: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
0da0: 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69  veLabel() functi
0db0: 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64  on to fix an add
0dc0: 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20  ress and.** the 
0dd0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
0de0: 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  eP4() function t
0df0: 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  o change the val
0e00: 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20  ue of the P4.** 
0e10: 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  operand..*/.int 
0e20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0e30: 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  3(Vdbe *p, int o
0e40: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  p, int p1, int p
0e50: 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e  2, int p3){.  in
0e60: 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  t i;.  VdbeOp *p
0e70: 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f  Op;..  i = p->nO
0e80: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  p;.  assert( p->
0e90: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
0ea0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
0eb0: 72 74 28 20 6f 70 3e 30 20 26 26 20 6f 70 3c 30  rt( op>0 && op<0
0ec0: 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  xff );.  if( p->
0ed0: 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63  pParse->nOpAlloc
0ee0: 3c 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67  <=i ){.    if( g
0ef0: 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b  rowOpArray(p) ){
0f00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
0f10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
0f20: 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26  nOp++;.  pOp = &
0f30: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70  p->aOp[i];.  pOp
0f40: 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f  ->opcode = (u8)o
0f50: 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30  p;.  pOp->p5 = 0
0f60: 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31  ;.  pOp->p1 = p1
0f70: 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32  ;.  pOp->p2 = p2
0f80: 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33  ;.  pOp->p3 = p3
0f90: 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20  ;.  pOp->p4.p = 
0fa0: 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  0;.  pOp->p4type
0fb0: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23   = P4_NOTUSED;.#
0fc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
0fd0: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
0fe0: 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d  ENTS.  pOp->zCom
0ff0: 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ment = 0;.#endif
1000: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1010: 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e 64 62  EBUG.  if( p->db
1020: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1030: 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
1040: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 2c 20 6b  ){.    int jj, k
1050: 6b 3b 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50  k;.    Parse *pP
1060: 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
1070: 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 6b 6b 3d  ;.    for(jj=kk=
1080: 30 3b 20 6a 6a 3c 53 51 4c 49 54 45 5f 4e 5f 43  0; jj<SQLITE_N_C
1090: 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b 2b 29 7b 0a  OLCACHE; jj++){.
10a0: 20 20 20 20 20 20 73 74 72 75 63 74 20 79 43 6f        struct yCo
10b0: 6c 43 61 63 68 65 20 2a 78 20 3d 20 70 50 61 72  lCache *x = pPar
10c0: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 20 2b 20  se->aColCache + 
10d0: 6a 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 78 2d  jj;.      if( x-
10e0: 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e  >iLevel>pParse->
10f0: 69 43 61 63 68 65 4c 65 76 65 6c 20 7c 7c 20 78  iCacheLevel || x
1100: 2d 3e 69 52 65 67 3d 3d 30 20 29 20 63 6f 6e 74  ->iReg==0 ) cont
1110: 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 72 69 6e  inue;.      prin
1120: 74 66 28 22 20 72 5b 25 64 5d 3d 7b 25 64 3a 25  tf(" r[%d]={%d:%
1130: 64 7d 22 2c 20 78 2d 3e 69 52 65 67 2c 20 78 2d  d}", x->iReg, x-
1140: 3e 69 54 61 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c  >iTable, x->iCol
1150: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b  umn);.      kk++
1160: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1170: 6b 6b 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 22  kk ) printf("\n"
1180: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1190: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
11a0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
11b0: 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65 61   test_addop_brea
11c0: 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a 23 65  kpoint();.  }.#e
11d0: 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45  ndif.#ifdef VDBE
11e0: 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e  _PROFILE.  pOp->
11f0: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f  cycles = 0;.  pO
1200: 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  p->cnt = 0;.#end
1210: 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  if.  return i;.}
1220: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1230: 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20  AddOp0(Vdbe *p, 
1240: 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72  int op){.  retur
1250: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
1260: 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c  Op3(p, op, 0, 0,
1270: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
1280: 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64 62  e3VdbeAddOp1(Vdb
1290: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
12a0: 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20  t p1){.  return 
12b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12c0: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20  3(p, op, p1, 0, 
12d0: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
12e0: 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 65  3VdbeAddOp2(Vdbe
12f0: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1300: 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20   p1, int p2){.  
1310: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1320: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1330: 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a  p1, p2, 0);.}...
1340: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63  /*.** Add an opc
1350: 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65  ode that include
1360: 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61  s the p4 value a
1370: 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  s a pointer..*/.
1380: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1390: 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70  ddOp4(.  Vdbe *p
13a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13b0: 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74  Add the opcode t
13c0: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
13d0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
13e0: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70     /* The new op
13f0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31  code */.  int p1
1400: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1410: 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20   The P1 operand 
1420: 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20  */.  int p2,    
1430: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1440: 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P2 operand */.  
1450: 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20  int p3,         
1460: 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70      /* The P3 op
1470: 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  erand */.  const
1480: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f   char *zP4,    /
1490: 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64  * The P4 operand
14a0: 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65   */.  int p4type
14b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20            /* P4 
14c0: 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a  operand type */.
14d0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  ){.  int addr = 
14e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14f0: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
1500: 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   p3);.  sqlite3V
1510: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
1520: 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65  ddr, zP4, p4type
1530: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
1540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1550: 6e 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61  n OP_ParseSchema
1560: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
1570: 6f 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e  outine is broken
1580: 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c   out from.** sql
1590: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 29  ite3VdbeAddOp4()
15a0: 20 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73 20   since it needs 
15b0: 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f  to also needs to
15c0: 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65 73   mark all btrees
15d0: 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62 65  .** as having be
15e0: 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  en used..**.** T
15f0: 68 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67  he zWhere string
1600: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
1610: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
1620: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
1630: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1640: 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73  will take owners
1650: 68 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  hip of the alloc
1660: 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  ated memory..*/.
1670: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1680: 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
1690: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44  (Vdbe *p, int iD
16a0: 62 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29  b, char *zWhere)
16b0: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74  {.  int j;.  int
16c0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
16d0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f  dbeAddOp3(p, OP_
16e0: 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62  ParseSchema, iDb
16f0: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
1700: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70  e3VdbeChangeP4(p
1710: 2c 20 61 64 64 72 2c 20 7a 57 68 65 72 65 2c 20  , addr, zWhere, 
1720: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66  P4_DYNAMIC);.  f
1730: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d  or(j=0; j<p->db-
1740: 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74  >nDb; j++) sqlit
1750: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
1760: 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, j);.}../*.** 
1770: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1780: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
1790: 70 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69  p4 value as an i
17a0: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  nteger..*/.int s
17b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
17c0: 49 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  Int(.  Vdbe *p, 
17d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
17e0: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
17f0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
1800: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
1810: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
1820: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1840: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
1850: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
1860: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
1870: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1880: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
1890: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
18a0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20  and */.  int p4 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18c0: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61  The P4 operand a
18d0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a  s an integer */.
18e0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  ){.  int addr = 
18f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1900: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
1910: 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   p3);.  sqlite3V
1920: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
1930: 64 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f  ddr, SQLITE_INT_
1940: 54 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49  TO_PTR(p4), P4_I
1950: 4e 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  NT32);.  return 
1960: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
1970: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
1980: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
1990: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
19a0: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
19b0: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
19c0: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
19d0: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
19e0: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
19f0: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
1a00: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
1a10: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
1a20: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
1a30: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
1a40: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
1a50: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
1a60: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
1a70: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
1a80: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
1a90: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
1aa0: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
1ab0: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
1ac0: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
1ad0: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
1ae0: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
1af0: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
1b00: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
1b10: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
1b20: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
1b30: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
1b40: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
1b50: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
1b60: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
1b70: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
1b80: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
1b90: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
1ba0: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
1bb0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ed..**.** Zero i
1bc0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
1bd0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
1be0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1bf0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65  beMakeLabel(Vdbe
1c00: 20 2a 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *v){.  Parse *p
1c10: 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = v->pParse;.  
1c20: 69 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65  int i = p->nLabe
1c30: 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76  l++;.  assert( v
1c40: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
1c50: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
1c60: 28 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30  ( (i & (i-1))==0
1c70: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
1c80: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  l = sqlite3DbRea
1c90: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62  llocOrFree(p->db
1ca0: 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20  , p->aLabel, .  
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a       (i*2+1)*siz
1ce0: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
1cf0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ));.  }.  if( p-
1d00: 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70  >aLabel ){.    p
1d10: 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31  ->aLabel[i] = -1
1d20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
1d30: 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  1-i;.}../*.** Re
1d40: 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20  solve label "x" 
1d50: 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73  to be the addres
1d60: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
1d70: 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20  struction to.** 
1d80: 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68  be inserted.  Th
1d90: 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20  e parameter "x" 
1da0: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
1db0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
1dc0: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
1dd0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1de0: 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  abel()..*/.void 
1df0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1e00: 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c  veLabel(Vdbe *v,
1e10: 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65   int x){.  Parse
1e20: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
1e30: 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b  .  int j = -1-x;
1e40: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
1e50: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1e60: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
1e70: 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  ( j<p->nLabel );
1e80: 0a 20 20 69 66 28 20 6a 3e 3d 30 20 26 26 20 70  .  if( j>=0 && p
1e90: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
1ea0: 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76  p->aLabel[j] = v
1eb0: 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ->nOp;.  }.}../*
1ec0: 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42  .** Mark the VDB
1ed0: 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61  E as one that ca
1ee0: 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e  n only be run on
1ef0: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e time..*/.void 
1f00: 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e  sqlite3VdbeRunOn
1f10: 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b  lyOnce(Vdbe *p){
1f20: 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  .  p->runOnlyOnc
1f30: 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66  e = 1;.}..#ifdef
1f40: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a   SQLITE_DEBUG /*
1f50: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
1f60: 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a  yAbort() logic *
1f70: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
1f80: 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20  lowing type and 
1f90: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65  function are use
1fa0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
1fb0: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
1fc0: 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61  .** in a Vdbe ma
1fd0: 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65  in program and e
1fe0: 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70  ach of the sub-p
1ff0: 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72  rograms (trigger
2000: 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e  s) it may .** in
2010: 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72  voke directly or
2020: 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20   indirectly. It 
2030: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61  should be used a
2040: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2050: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20     Op *pOp;.**  
2060: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
2070: 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65  r;.**.**   memse
2080: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
2090: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20  eof(sIter));.** 
20a0: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20    sIter.v = v;  
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69            // v i
20d0: 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20  s of type Vdbe* 
20e0: 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f  .**   while( (pO
20f0: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
2100: 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20  sIter)) ){.**   
2110: 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e    // Do somethin
2120: 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20  g with pOp.**   
2130: 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62  }.**   sqlite3Db
2140: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65  Free(v->db, sIte
2150: 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f  r.apSub);.** .*/
2160: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2170: 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f  VdbeOpIter VdbeO
2180: 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64  pIter;.struct Vd
2190: 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62  beOpIter {.  Vdb
21a0: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
21b0: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
21c0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
21d0: 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f  gh the opcodes o
21e0: 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  f */.  SubProgra
21f0: 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20  m **apSub;      
2200: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
2210: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
2220: 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20  nt nSub;        
2230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2240: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
2250: 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74  n apSub */.  int
2260: 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20   iAddr;         
2270: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
2280: 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72  ss of next instr
2290: 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e  uction to return
22a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20   */.  int iSub; 
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c0: 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f   /* 0 = main pro
22d0: 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20  gram, 1 = first 
22e0: 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e  sub-program etc.
22f0: 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70   */.};.static Op
2300: 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62   *opIterNext(Vdb
2310: 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56  eOpIter *p){.  V
2320: 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20  dbe *v = p->v;. 
2330: 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20   Op *pRet = 0;. 
2340: 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20   Op *aOp;.  int 
2350: 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  nOp;..  if( p->i
2360: 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a  Sub<=p->nSub ){.
2370: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62  .    if( p->iSub
2380: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70  ==0 ){.      aOp
2390: 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20   = v->aOp;.     
23a0: 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20   nOp = v->nOp;. 
23b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23c0: 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  aOp = p->apSub[p
23d0: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a  ->iSub-1]->aOp;.
23e0: 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61        nOp = p->a
23f0: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d  pSub[p->iSub-1]-
2400: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >nOp;.    }.    
2410: 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72  assert( p->iAddr
2420: 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65  <nOp );..    pRe
2430: 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64  t = &aOp[p->iAdd
2440: 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72  r];.    p->iAddr
2450: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ++;.    if( p->i
2460: 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20  Addr==nOp ){.   
2470: 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20     p->iSub++;.  
2480: 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30      p->iAddr = 0
2490: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  ;.    }.  .    i
24a0: 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d  f( pRet->p4type=
24b0: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
24c0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
24d0: 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a  e = (p->nSub+1)*
24e0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
24f0: 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  m*);.      int j
2500: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
2510: 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29   j<p->nSub; j++)
2520: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
2530: 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d  >apSub[j]==pRet-
2540: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
2550: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2560: 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53      if( j==p->nS
2570: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ub ){.        p-
2580: 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33  >apSub = sqlite3
2590: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
25a0: 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c  v->db, p->apSub,
25b0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
25c0: 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29   if( !p->apSub )
25d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74  {.          pRet
25e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
25f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
2600: 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b  ->apSub[p->nSub+
2610: 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50  +] = pRet->p4.pP
2620: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
2630: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2640: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
2650: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  et;.}../*.** Che
2660: 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ck if the progra
2670: 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  m stored in the 
2680: 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  VM associated wi
2690: 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a  th pParse may.**
26a0: 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20   throw an ABORT 
26b0: 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69  exception (causi
26c0: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
26d0: 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65  , but not entire
26e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
26f0: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
2700: 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69  k). This conditi
2710: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
2720: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f  e main program o
2730: 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f  r any.** sub-pro
2740: 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61  grams contains a
2750: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
2760: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ing:.**.**   *  
2770: 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d  OP_Halt with P1=
2780: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
2790: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
27a0: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  t..**   *  OP_Ha
27b0: 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31  ltIfNull with P1
27c0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
27d0: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f  NT and P2=OE_Abo
27e0: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44  rt..**   *  OP_D
27f0: 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f  estroy.**   *  O
2800: 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a  P_VUpdate.**   *
2810: 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20    OP_VRename.** 
2820: 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65    *  OP_FkCounte
2830: 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d  r with P2==0 (im
2840: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
2850: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a  key constraint).
2860: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b  **.** Then check
2870: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
2880: 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72  of Parse.mayAbor
2890: 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a  t is true if an.
28a0: 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20  ** ABORT may be 
28b0: 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65  thrown, or false
28c0: 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75   otherwise. Retu
28d0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  rn true if it do
28e0: 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20  es.** match, or 
28f0: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
2900: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2910: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
2920: 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74   used as.** part
2930: 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74   of an assert st
2940: 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63  atement in the c
2950: 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72  ompiler. Similar
2960: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73   to:.**.**   ass
2970: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
2980: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70  AssertMayAbort(p
2990: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
29a0: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20  arse->mayAbort) 
29b0: 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  );.*/.int sqlite
29c0: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
29d0: 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ort(Vdbe *v, int
29e0: 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e   mayAbort){.  in
29f0: 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a  t hasAbort = 0;.
2a00: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62    Op *pOp;.  Vdb
2a10: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20  eOpIter sIter;. 
2a20: 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20   memset(&sIter, 
2a30: 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29  0, sizeof(sIter)
2a40: 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76  );.  sIter.v = v
2a50: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70  ;..  while( (pOp
2a60: 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73   = opIterNext(&s
2a70: 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20  Iter))!=0 ){.   
2a80: 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f   int opcode = pO
2a90: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69  p->opcode;.    i
2aa0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65  f( opcode==OP_De
2ab0: 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d  stroy || opcode=
2ac0: 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f  =OP_VUpdate || o
2ad0: 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d  pcode==OP_VRenam
2ae0: 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e .#ifndef SQLIT
2af0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
2b00: 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f  EY.     || (opco
2b10: 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  de==OP_FkCounter
2b20: 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26   && pOp->p1==0 &
2b30: 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23  & pOp->p2==1) .#
2b40: 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28  endif.     || ((
2b50: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20  opcode==OP_Halt 
2b60: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61  || opcode==OP_Ha
2b70: 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20  ltIfNull) .     
2b80: 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30 78   && ((pOp->p1&0x
2b90: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
2ba0: 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70  TRAINT && pOp->p
2bb0: 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20  2==OE_Abort)).  
2bc0: 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62    ){.      hasAb
2bd0: 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  ort = 1;.      b
2be0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2bf0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2c00: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
2c10: 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  ub);..  /* Retur
2c20: 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 62 6f  n true if hasAbo
2c30: 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72  rt==mayAbort. Or
2c40: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
2c50: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
2c60: 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61   ** If malloc fa
2c70: 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77  iled, then the w
2c80: 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76  hile() loop abov
2c90: 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69  e may not have i
2ca0: 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72  terated.  ** thr
2cb0: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
2cc0: 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61   and hasAbort ma
2cd0: 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65  y be set incorre
2ce0: 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a  ctly. Return.  *
2cf0: 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 20  * true for this 
2d00: 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20  case to prevent 
2d10: 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e 20  the assert() in 
2d20: 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d  the callers fram
2d30: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c  e.  ** from fail
2d40: 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  ing.  */.  retur
2d50: 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  n ( v->db->mallo
2d60: 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62  cFailed || hasAb
2d70: 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 29 3b  ort==mayAbort );
2d80: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2d90: 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20  ITE_DEBUG - the 
2da0: 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
2db0: 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e  Abort() function
2dc0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20   */../*.** Loop 
2dd0: 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67  through the prog
2de0: 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ram looking for 
2df0: 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61  P2 values that a
2e00: 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6f  re negative.** o
2e10: 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  n jump instructi
2e20: 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68 20  ons.  Each such 
2e30: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
2e40: 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a 2a  .  Resolve the.*
2e50: 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69  * label by setti
2e60: 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  ng the P2 value 
2e70: 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 6e  to its correct n
2e80: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a  on-zero value..*
2e90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2ea0: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
2eb0: 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64   after all opcod
2ec0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73  es have been ins
2ed0: 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72  erted..**.** Var
2ee0: 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41  iable *pMaxFuncA
2ef0: 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  rgs is set to th
2f00: 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20  e maximum value 
2f10: 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d 65  of any P2 argume
2f20: 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f  nt .** to an OP_
2f30: 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67 67  Function, OP_Agg
2f40: 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c 74  Step or OP_VFilt
2f50: 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73 20  er opcode. This 
2f60: 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 73  is used by .** s
2f70: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
2f80: 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74 68  ady() to size th
2f90: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
2fa0: 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rray..**.** The 
2fb0: 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c 64  Op.opflags field
2fc0: 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20 6f   is set on all o
2fd0: 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  pcodes..*/.stati
2fe0: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32  c void resolveP2
2ff0: 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20  Values(Vdbe *p, 
3000: 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  int *pMaxFuncArg
3010: 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  s){.  int i;.  i
3020: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70  nt nMaxArgs = *p
3030: 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f  MaxFuncArgs;.  O
3040: 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20  p *pOp;.  Parse 
3050: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
3060: 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  rse;.  int *aLab
3070: 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61  el = pParse->aLa
3080: 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e  bel;.  p->readOn
3090: 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73  ly = 1;.  p->bIs
30a0: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66 6f  Reader = 0;.  fo
30b0: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
30c0: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
30d0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
30e0: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
30f0: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 2f  ->opcode;..    /
3100: 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20  * NOTE: Be sure 
3110: 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f  to update mkopco
3120: 64 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64 64  deh.awk when add
3130: 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a  ing or removing.
3140: 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f      ** cases fro
3150: 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a  m this switch! *
3160: 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  /.    switch( op
3170: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61  code ){.      ca
3180: 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 3a 0a  se OP_Function:.
3190: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 67        case OP_Ag
31a0: 67 53 74 65 70 3a 20 7b 0a 20 20 20 20 20 20 20  gStep: {.       
31b0: 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61   if( pOp->p5>nMa
31c0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
31d0: 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 20   = pOp->p5;.    
31e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
31f0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50   }.      case OP
3200: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a  _Transaction: {.
3210: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
3220: 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64  >p2!=0 ) p->read
3230: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  Only = 0;.      
3240: 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a    /* fall thru *
3250: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
3260: 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  case OP_AutoComm
3270: 69 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  it:.      case O
3280: 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20  P_Savepoint: {. 
3290: 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61         p->bIsRea
32a0: 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  der = 1;.       
32b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
32c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
32d0: 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 63 61  MIT_WAL.      ca
32e0: 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74  se OP_Checkpoint
32f0: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  :.#endif.      c
3300: 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a 20  ase OP_Vacuum:. 
3310: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75       case OP_Jou
3320: 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20  rnalMode: {.    
3330: 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20      p->readOnly 
3340: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
3350: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20  bIsReader = 1;. 
3360: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3370: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
3380: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
3390: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 63 61 73  LTABLE.      cas
33a0: 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a  e OP_VUpdate: {.
33b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
33c0: 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p2>nMaxArgs ) n
33d0: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
33e0: 32 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  2;.        break
33f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3400: 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a  case OP_VFilter:
3410: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e   {.        int n
3420: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
3430: 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20  ( p->nOp - i >= 
3440: 33 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  3 );.        ass
3450: 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
3460: 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20  ode==OP_Integer 
3470: 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 70  );.        n = p
3480: 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20  Op[-1].p1;.     
3490: 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67     if( n>nMaxArg
34a0: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e  s ) nMaxArgs = n
34b0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
34c0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
34d0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65        case OP_Ne
34e0: 78 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  xt:.      case O
34f0: 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 0a 20 20  P_NextIfOpen:.  
3500: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74      case OP_Sort
3510: 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20  erNext: {.      
3520: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e    pOp->p4.xAdvan
3530: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ce = sqlite3Btre
3540: 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70  eNext;.        p
3550: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3560: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
3570: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3580: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72        case OP_Pr
3590: 65 76 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ev:.      case O
35a0: 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 7b 0a  P_PrevIfOpen: {.
35b0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
35c0: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
35d0: 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b  e3BtreePrevious;
35e0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  .        pOp->p4
35f0: 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43  type = P4_ADVANC
3600: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
3610: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3620: 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67  .    pOp->opflag
3630: 73 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  s = sqlite3Opcod
3640: 65 50 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65  eProperty[opcode
3650: 5d 3b 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d  ];.    if( (pOp-
3660: 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47  >opflags & OPFLG
3670: 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f 70  _JUMP)!=0 && pOp
3680: 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20  ->p2<0 ){.      
3690: 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e  assert( -1-pOp->
36a0: 70 32 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65  p2<pParse->nLabe
36b0: 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  l );.      pOp->
36c0: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70  p2 = aLabel[-1-p
36d0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20  Op->p2];.    }. 
36e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
36f0: 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65  ee(p->db, pParse
3700: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61  ->aLabel);.  pPa
3710: 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b  rse->aLabel = 0;
3720: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65  .  pParse->nLabe
3730: 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75  l = 0;.  *pMaxFu
3740: 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67  ncArgs = nMaxArg
3750: 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  s;.  assert( p->
3760: 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20  bIsReader!=0 || 
3770: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20  p->btreeMask==0 
3780: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
3790: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
37a0: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
37b0: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73  uction to be ins
37c0: 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erted..*/.int sq
37d0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
37e0: 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  Addr(Vdbe *p){. 
37f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
3800: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
3810: 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  IT );.  return p
3820: 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ->nOp;.}../*.** 
3830: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
3840: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
3850: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
3860: 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74  opcodes associat
3870: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56  ed with.** the V
3880: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
3890: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
38a0: 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  . It is the call
38b0: 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
38c0: 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65  ty.** to arrange
38d0: 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65   for the returne
38e0: 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76  d array to be ev
38f0: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75  entually freed u
3900: 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62  sing the .** vdb
3910: 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66  eFreeOpArray() f
3920: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42  unction..**.** B
3930: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
3940: 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f   *pnOp is set to
3950: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
3960: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65  ntries in the re
3970: 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e  turned.** array.
3980: 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67   Also, *pnMaxArg
3990: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c   is set to the l
39a0: 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72  arger of its cur
39b0: 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a  rent value and .
39c0: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
39d0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
39e0: 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72  Vdbe.apArg[] arr
39f0: 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  ay required to e
3a00: 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72  xecute the .** r
3a10: 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e  eturned program.
3a20: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
3a30: 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72  te3VdbeTakeOpArr
3a40: 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ay(Vdbe *p, int 
3a50: 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61  *pnOp, int *pnMa
3a60: 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20  xArg){.  VdbeOp 
3a70: 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20  *aOp = p->aOp;. 
3a80: 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20   assert( aOp && 
3a90: 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  !p->db->mallocFa
3aa0: 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  iled );..  /* Ch
3ab0: 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33  eck that sqlite3
3ac0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20  VdbeUsesBtree() 
3ad0: 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f  was not called o
3ae0: 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61  n this VM */.  a
3af0: 73 73 65 72 74 28 20 70 2d 3e 62 74 72 65 65 4d  ssert( p->btreeM
3b00: 61 73 6b 3d 3d 30 20 29 3b 0a 0a 20 20 72 65 73  ask==0 );..  res
3b10: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
3b20: 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e  pnMaxArg);.  *pn
3b30: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70  Op = p->nOp;.  p
3b40: 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74  ->aOp = 0;.  ret
3b50: 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aOp;.}../*.*
3b60: 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69  * Add a whole li
3b70: 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  st of operations
3b80: 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
3b90: 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e  n stack.  Return
3ba0: 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20   the.** address 
3bb0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  of the first ope
3bc0: 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f  ration added..*/
3bd0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
3be0: 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a  AddOpList(Vdbe *
3bf0: 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65  p, int nOp, Vdbe
3c00: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f  OpList const *aO
3c10: 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p){.  int addr;.
3c20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
3c30: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3c40: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  NIT );.  if( p->
3c50: 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70  nOp + nOp > p->p
3c60: 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  Parse->nOpAlloc 
3c70: 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  && growOpArray(p
3c80: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
3c90: 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20  0;.  }.  addr = 
3ca0: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c  p->nOp;.  if( AL
3cb0: 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20  WAYS(nOp>0) ){. 
3cc0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64     int i;.    Vd
3cd0: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a  beOpList const *
3ce0: 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66  pIn = aOp;.    f
3cf0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69  or(i=0; i<nOp; i
3d00: 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20  ++, pIn++){.    
3d10: 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e    int p2 = pIn->
3d20: 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  p2;.      VdbeOp
3d30: 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70   *pOut = &p->aOp
3d40: 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20  [i+addr];.      
3d50: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70  pOut->opcode = p
3d60: 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  In->opcode;.    
3d70: 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e    pOut->p1 = pIn
3d80: 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ->p1;.      if( 
3d90: 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p2<0 ){.        
3da0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f  assert( sqlite3O
3db0: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f  pcodeProperty[pO
3dc0: 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50  ut->opcode] & OP
3dd0: 46 4c 47 5f 4a 55 4d 50 20 29 3b 0a 20 20 20 20  FLG_JUMP );.    
3de0: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61      pOut->p2 = a
3df0: 64 64 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a  ddr + ADDR(p2);.
3e00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3e10: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
3e20: 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p2;.      }.    
3e30: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e    pOut->p3 = pIn
3e40: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74  ->p3;.      pOut
3e50: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
3e60: 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75  TUSED;.      pOu
3e70: 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  t->p4.p = 0;.   
3e80: 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b     pOut->p5 = 0;
3e90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
3ea0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
3eb0: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 70 4f 75  MMENTS.      pOu
3ec0: 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  t->zComment = 0;
3ed0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
3ee0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
3ef0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
3f00: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
3f10: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
3f20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3f30: 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64  ePrintOp(0, i+ad
3f40: 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64  dr, &p->aOp[i+ad
3f50: 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  dr]);.      }.#e
3f60: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
3f70: 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20  ->nOp += nOp;.  
3f80: 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  }.  return addr;
3f90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
3fa0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
3fb0: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P1 operand for
3fc0: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
3fd0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
3fe0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
3ff0: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
4000: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
4010: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
4020: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
4030: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
4040: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
4050: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
4060: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
4070: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
4080: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4090: 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20  beChangeP1(Vdbe 
40a0: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e  *p, u32 addr, in
40b0: 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  t val){.  assert
40c0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( p!=0 );.  if( 
40d0: 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64  ((u32)p->nOp)>ad
40e0: 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  dr ){.    p->aOp
40f0: 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b  [addr].p1 = val;
4100: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
4110: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
4120: 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  f the P2 operand
4130: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
4140: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
4150: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4160: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69  useful for setti
4170: 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e  ng a jump destin
4180: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
4190: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
41a0: 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P2(Vdbe *p, u32 
41b0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
41c0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
41d0: 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d  ;.  if( ((u32)p-
41e0: 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20  >nOp)>addr ){.  
41f0: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
4200: 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  2 = val;.  }.}..
4210: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
4220: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33   value of the P3
4230: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
4240: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
4250: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4260: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
4270: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
4280: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
4290: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
42a0: 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e    if( ((u32)p->n
42b0: 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  Op)>addr ){.    
42c0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20  p->aOp[addr].p3 
42d0: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
42e0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
42f0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35 20 6f  alue of the P5 o
4300: 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65 20 6d  perand for the m
4310: 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  ost recently.** 
4320: 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e  added operation.
4330: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4340: 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62  VdbeChangeP5(Vdb
4350: 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20  e *p, u8 val){. 
4360: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
4370: 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b  .  if( p->aOp ){
4380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
4390: 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e  nOp>0 );.    p->
43a0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35  aOp[p->nOp-1].p5
43b0: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
43c0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
43d0: 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  P2 operand of in
43e0: 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73  struction addr s
43f0: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
4400: 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65   to.** the addre
4410: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
4420: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
4430: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20   coded..*/.void 
4440: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
4450: 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ere(Vdbe *p, int
4460: 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20 41 4c   addr){.  if( AL
4470: 57 41 59 53 28 61 64 64 72 3e 3d 30 29 20 29 20  WAYS(addr>=0) ) 
4480: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
4490: 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e  eP2(p, addr, p->
44a0: 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nOp);.}.../*.** 
44b0: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e  If the input Fun
44c0: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69  cDef structure i
44d0: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65  s ephemeral, the
44e0: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a  n free it.  If.*
44f0: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73  * the FuncDef is
4500: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74   not ephermal, t
4510: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
4520: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
4530: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
4540: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
4550: 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29  , FuncDef *pDef)
4560: 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
4570: 44 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66  Def) && (pDef->f
4580: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
4590: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
45a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
45b0: 62 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b  bFree(db, pDef);
45c0: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
45d0: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
45e0: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f  ray(sqlite3 *, O
45f0: 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  p *, int);../*.*
4600: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61  * Delete a P4 va
4610: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
4620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4630: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
4640: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
4650: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66   void *p4){.  if
4660: 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65  ( p4 ){.    asse
4670: 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77  rt( db );.    sw
4680: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a  itch( p4type ){.
4690: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52 45        case P4_RE
46a0: 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  AL:.      case P
46b0: 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63  4_INT64:.      c
46c0: 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a  ase P4_DYNAMIC:.
46d0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e        case P4_IN
46e0: 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20  TARRAY: {.      
46f0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4700: 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 20  db, p4);.       
4710: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4720: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45        case P4_KE
4730: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 20  YINFO: {.       
4740: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4750: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
4760: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 28  e3KeyInfoUnref((
4770: 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20  KeyInfo*)p4);.  
4780: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4790: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
47a0: 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20  P4_MPRINTF: {.  
47b0: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
47c0: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
47d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29  sqlite3_free(p4)
47e0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
47f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
4800: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
4810: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70  {.        freeEp
4820: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
4830: 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34  db, (FuncDef*)p4
4840: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
4850: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4860: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
4870: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
4880: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
4890: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
48a0: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71  te3ValueFree((sq
48b0: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29  lite3_value*)p4)
48c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
48d0: 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20 2a  .          Mem *
48e0: 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20 20  p = (Mem*)p4;.  
48f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
4900: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
4910: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20  lloc);.         
4920: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4930: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, p);.        }
4940: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4950: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4960: 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20  se P4_VTAB : {. 
4970: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
4980: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
4990: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
49a0: 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29  ck((VTable *)p4)
49b0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
49c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
49d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
49e0: 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
49f0: 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64  ated for aOp and
4a00: 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61   any p4 values a
4a10: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
4a20: 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74  .** opcodes cont
4a30: 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66  ained within. If
4a40: 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c   aOp is not NULL
4a50: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
4a60: 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f  o contain .** nO
4a70: 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73  p entries. .*/.s
4a80: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
4a90: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
4aa0: 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c  e3 *db, Op *aOp,
4ab0: 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28   int nOp){.  if(
4ac0: 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a   aOp ){.    Op *
4ad0: 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70  pOp;.    for(pOp
4ae0: 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e  =aOp; pOp<&aOp[n
4af0: 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  Op]; pOp++){.   
4b00: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f     freeP4(db, pO
4b10: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
4b20: 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51  p4.p);.#ifdef SQ
4b30: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
4b40: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
4b50: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4b60: 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  (db, pOp->zComme
4b70: 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20  nt);.#endif     
4b80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
4b90: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
4ba0: 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69  Op);.}../*.** Li
4bb0: 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67 72 61  nk the SubProgra
4bc0: 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  m object passed 
4bd0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
4be0: 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20  gument into the 
4bf0: 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61  linked.** list a
4c00: 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72  t Vdbe.pSubProgr
4c10: 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73  am. This list is
4c20: 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20   used to delete 
4c30: 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a  all sub-program.
4c40: 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20  ** objects when 
4c50: 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e  the VM is no lon
4c60: 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f  ger required..*/
4c70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
4c80: 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28  eLinkSubProgram(
4c90: 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62  Vdbe *pVdbe, Sub
4ca0: 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70  Program *p){.  p
4cb0: 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d  ->pNext = pVdbe-
4cc0: 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64  >pProgram;.  pVd
4cd0: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70  be->pProgram = p
4ce0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
4cf0: 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61 74 20  e the opcode at 
4d00: 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f  addr into OP_Noo
4d10: 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  p.*/.void sqlite
4d20: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
4d30: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
4d40: 64 64 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61  ddr){.  if( p->a
4d50: 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70  Op ){.    VdbeOp
4d60: 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b   *pOp = &p->aOp[
4d70: 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69 74  addr];.    sqlit
4d80: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
4d90: 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70      freeP4(db, p
4da0: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
4db0: 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d 65 6d 73  >p4.p);.    mems
4dc0: 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f  et(pOp, 0, sizeo
4dd0: 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20  f(pOp[0]));.    
4de0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
4df0: 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 61  _Noop;.    if( a
4e00: 64 64 72 3d 3d 70 2d 3e 6e 4f 70 2d 31 20 29 20  ddr==p->nOp-1 ) 
4e10: 70 2d 3e 6e 4f 70 2d 2d 3b 0a 20 20 7d 0a 7d 0a  p->nOp--;.  }.}.
4e20: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
4e30: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
4e40: 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  4 operand for a 
4e50: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
4e60: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
4e70: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
4e80: 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f  when a large pro
4e90: 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66  gram is loaded f
4ea0: 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20  rom a.** static 
4eb0: 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69  array using sqli
4ec0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
4ed0: 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   but we want to 
4ee0: 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69  make a.** few mi
4ef0: 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74  nor changes to t
4f00: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a  he program..**.*
4f10: 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74  * If n>=0 then t
4f20: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73  he P4 operand is
4f30: 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e   dynamic, meanin
4f40: 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66  g that a copy of
4f50: 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69  .** the string i
4f60: 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f  s made into memo
4f70: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
4f80: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
4f90: 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66  )..** A value of
4fa0: 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79   n==0 means copy
4fb0: 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70   bytes of zP4 up
4fc0: 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e   to and includin
4fd0: 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e  g the.** first n
4fe0: 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e  ull byte.  If n>
4ff0: 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20  0 then copy n+1 
5000: 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a  bytes of zP4..**
5010: 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65   .** Other value
5020: 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49  s of n (P4_STATI
5030: 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74  C, P4_COLLSEQ et
5040: 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61  c.) indicate tha
5050: 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20  t zP4 points.** 
5060: 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73  to a string or s
5070: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
5080: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
5090: 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66  xist for the lif
50a0: 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20  etime of.** the 
50b0: 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63  Vdbe. In these c
50c0: 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74  ases we can just
50d0: 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65   copy the pointe
50e0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72  r..**.** If addr
50f0: 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50  <0 then change P
5100: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  4 on the most re
5110: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
5120: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
5130: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5140: 43 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70  ChangeP4(Vdbe *p
5150: 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73  , int addr, cons
5160: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74  t char *zP4, int
5170: 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a   n){.  Op *pOp;.
5180: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
5190: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
51a0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
51b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
51c0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
51d0: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  IT );.  if( p->a
51e0: 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  Op==0 || db->mal
51f0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
5200: 20 69 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20   if( n!=P4_VTAB 
5210: 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28  ){.      freeP4(
5220: 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28  db, n, (void*)*(
5230: 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20  char**)&zP4);.  
5240: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a    }.    return;.
5250: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
5260: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65  >nOp>0 );.  asse
5270: 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20  rt( addr<p->nOp 
5280: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
5290: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
52a0: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  >nOp - 1;.  }.  
52b0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
52c0: 64 72 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dr];.  assert( p
52d0: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e  Op->p4type==P4_N
52e0: 4f 54 55 53 45 44 20 7c 7c 20 70 4f 70 2d 3e 70  OTUSED || pOp->p
52f0: 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20  4type==P4_INT32 
5300: 29 3b 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20  );.  freeP4(db, 
5310: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
5320: 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e  ->p4.p);.  pOp->
5330: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20  p4.p = 0;.  if( 
5340: 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20  n==P4_INT32 ){. 
5350: 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73     /* Note: this
5360: 20 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62   cast is safe, b
5370: 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69  ecause the origi
5380: 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73  n data point was
5390: 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74   an int.    ** t
53a0: 68 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20  hat was cast to 
53b0: 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  a (const char *)
53c0: 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34  . */.    pOp->p4
53d0: 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  .i = SQLITE_PTR_
53e0: 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20  TO_INT(zP4);.   
53f0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5400: 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65  4_INT32;.  }else
5410: 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20   if( zP4==0 ){. 
5420: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30     pOp->p4.p = 0
5430: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5440: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
5450: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50    }else if( n==P
5460: 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20  4_KEYINFO ){.   
5470: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f   pOp->p4.p = (vo
5480: 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70  id*)zP4;.    pOp
5490: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45  ->p4type = P4_KE
54a0: 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69  YINFO;.  }else i
54b0: 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b  f( n==P4_VTAB ){
54c0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
54d0: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
54e0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
54f0: 34 5f 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69  4_VTAB;.    sqli
5500: 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61  te3VtabLock((VTa
5510: 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20  ble *)zP4);.    
5520: 61 73 73 65 72 74 28 20 28 28 56 54 61 62 6c 65  assert( ((VTable
5530: 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e   *)zP4)->db==p->
5540: 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  db );.  }else if
5550: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70  ( n<0 ){.    pOp
5560: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
5570: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
5580: 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63  type = (signed c
5590: 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  har)n;.  }else{.
55a0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
55b0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
55c0: 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  30(zP4);.    pOp
55d0: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33  ->p4.z = sqlite3
55e0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
55f0: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f   zP4, n);.    pO
5600: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
5610: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f  YNAMIC;.  }.}../
5620: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 34 20  *.** Set the P4 
5630: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
5640: 6e 74 6c 79 20 61 64 64 65 64 20 6f 70 63 6f 64  ntly added opcod
5650: 65 20 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f  e to the KeyInfo
5660: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65   for the.** inde
5670: 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64  x given..*/.void
5680: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
5690: 34 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a  4KeyInfo(Parse *
56a0: 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
56b0: 49 64 78 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Idx){.  Vdbe *v 
56c0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
56d0: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
56e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
56f0: 78 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  x!=0 );.  sqlite
5700: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
5710: 20 2d 31 2c 20 28 63 68 61 72 2a 29 73 71 6c 69   -1, (char*)sqli
5720: 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
5730: 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 2c  x(pParse, pIdx),
5740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5750: 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
5760: 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  O);.}..#ifdef SQ
5770: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
5780: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a  AIN_COMMENTS./*.
5790: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f  ** Change the co
57a0: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73  mment on the mos
57b0: 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64  t recently coded
57c0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f   instruction.  O
57d0: 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f  r.** insert a No
57e0: 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20  -op and add the 
57f0: 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20  comment to that 
5800: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  new instruction.
5810: 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20    This.** makes 
5820: 74 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20  the code easier 
5830: 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64  to read during d
5840: 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20  ebugging.  None 
5850: 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  of this happens.
5860: 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69  ** in a producti
5870: 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61  on build..*/.sta
5880: 74 69 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f  tic void vdbeVCo
5890: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
58a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
58b0: 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b  at, va_list ap){
58c0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
58d0: 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  p>0 || p->aOp==0
58e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
58f0: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
5900: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
5910: 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ment==0 || p->db
5920: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5930: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29  ;.  if( p->nOp )
5940: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
5950: 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69  >aOp );.    sqli
5960: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
5970: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5980: 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ].zComment);.   
5990: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
59a0: 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c  ].zComment = sql
59b0: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e  ite3VMPrintf(p->
59c0: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
59d0: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
59e0: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
59f0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
5a00: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
5a10: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
5a20: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
5a30: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
5a40: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65  ormat);.    vdbe
5a50: 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72  VComment(p, zFor
5a60: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
5a70: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
5a80: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5a90: 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65  NoopComment(Vdbe
5aa0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
5ab0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
5ac0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
5ad0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
5ae0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70  ite3VdbeAddOp0(p
5af0: 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20  , OP_Noop);.    
5b00: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
5b10: 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56  rmat);.    vdbeV
5b20: 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d  Comment(p, zForm
5b30: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
5b40: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23  end(ap);.  }.}.#
5b50: 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47  endif  /* NDEBUG
5b60: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
5b70: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
5b80: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
5b90: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
5ba0: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
5bb0: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
5bc0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
5bd0: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
5be0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
5bf0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
5c00: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
5c10: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
5c20: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
5c30: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
5c40: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
5c50: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
5c60: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
5c70: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
5c80: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
5c90: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
5ca0: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
5cb0: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
5cc0: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
5cd0: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
5ce0: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
5cf0: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
5d00: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f  ing.** after a O
5d10: 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74  OM fault without
5d20: 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b   having to check
5d30: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
5d40: 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74  eturn from .** t
5d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
5d60: 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20   valid pointer. 
5d70: 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
5d80: 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73   dummy.opcode is
5d90: 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c   0,.** dummy wil
5da0: 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74  l never be writt
5db0: 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20  en to.  This is 
5dc0: 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65  verified by code
5dd0: 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a   inspection and.
5de0: 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69  ** by running wi
5df0: 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2a 0a  th Valgrind..**.
5e00: 2a 2a 20 41 62 6f 75 74 20 74 68 65 20 23 69 66  ** About the #if
5e10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5e20: 54 52 41 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79  TRACE:  Normally
5e30: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
5e40: 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a  s never called.*
5e50: 2a 20 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e  * unless p->nOp>
5e60: 30 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61  0.  This is beca
5e70: 75 73 65 20 69 6e 20 74 68 65 20 61 62 73 65 6e  use in the absen
5e80: 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49  se of SQLITE_OMI
5e90: 54 5f 54 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f  T_TRACE,.** an O
5ea0: 50 5f 54 72 61 63 65 20 69 6e 73 74 72 75 63 74  P_Trace instruct
5eb0: 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69 6e  ion is always in
5ec0: 73 65 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  serted by sqlite
5ed0: 33 56 64 62 65 47 65 74 28 29 20 61 73 20 73 6f  3VdbeGet() as so
5ee0: 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56  on as.** a new V
5ef0: 44 42 45 20 69 73 20 63 72 65 61 74 65 64 2e 20  DBE is created. 
5f00: 20 53 6f 20 77 65 20 61 72 65 20 66 72 65 65 20   So we are free 
5f10: 74 6f 20 73 65 74 20 61 64 64 72 20 74 6f 20 70  to set addr to p
5f20: 2d 3e 6e 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a  ->nOp-1 without.
5f30: 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 75  ** having to dou
5f40: 62 6c 65 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ble-check to mak
5f50: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
5f60: 72 65 73 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65  result is non-ne
5f70: 67 61 74 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69  gative. But.** i
5f80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
5f90: 41 43 45 20 69 73 20 64 65 66 69 6e 65 64 2c 20  ACE is defined, 
5fa0: 74 68 65 20 4f 50 5f 54 72 61 63 65 20 69 73 20  the OP_Trace is 
5fb0: 6f 6d 69 74 74 65 64 20 61 6e 64 20 77 65 20 64  omitted and we d
5fc0: 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65  o need to.** che
5fd0: 63 6b 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ck the value of 
5fe0: 70 2d 3e 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20  p->nOp-1 before 
5ff0: 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56  continuing..*/.V
6000: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
6010: 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c  beGetOp(Vdbe *p,
6020: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a   int addr){.  /*
6030: 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74   C89 specifies t
6040: 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  hat the constant
6050: 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65   "dummy" will be
6060: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
6070: 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20  all.  ** zeros, 
6080: 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74  which is correct
6090: 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65  .  MSVC generate
60a0: 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76  s a warning, nev
60b0: 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20  ertheless. */.  
60c0: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75  static VdbeOp du
60d0: 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  mmy;  /* Ignore 
60e0: 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67  the MSVC warning
60f0: 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61   about no initia
6100: 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  lizer */.  asser
6110: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
6120: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
6130: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
6140: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
6150: 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28  IT_TRACE.    if(
6160: 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65 74   p->nOp==0 ) ret
6170: 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75  urn (VdbeOp*)&du
6180: 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  mmy;.#endif.    
6190: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
61a0: 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
61b0: 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64   (addr>=0 && add
61c0: 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e  r<p->nOp) || p->
61d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
61e0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
61f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
6200: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62  .    return (Vdb
6210: 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d  eOp*)&dummy;.  }
6220: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6230: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
6240: 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e    }.}..#if defin
6250: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
6260: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
6270: 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  S)./*.** Return 
6280: 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
6290: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
62a0: 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68  parameters to th
62b0: 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20  e opcode pOp.** 
62c0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68  determined by ch
62d0: 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74  aracter c..*/.st
62e0: 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61  atic int transla
62f0: 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73  teP(char c, cons
6300: 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66  t Op *pOp){.  if
6310: 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72  ( c=='1' ) retur
6320: 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28  n pOp->p1;.  if(
6330: 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e   c=='2' ) return
6340: 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20   pOp->p2;.  if( 
6350: 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20  c=='3' ) return 
6360: 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63  pOp->p3;.  if( c
6370: 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e 20 70  =='4' ) return p
6380: 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75  Op->p4.i;.  retu
6390: 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f  rn pOp->p5;.}../
63a0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
63b0: 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63  tring for the "c
63c0: 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66  omment" field of
63d0: 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c   a VDBE opcode l
63e0: 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  isting..**.** Th
63f0: 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c  e Synopsis: fiel
6400: 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  d in comments in
6410: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
6420: 63 65 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e  ce file gets con
6430: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20  verted.** to an 
6440: 65 78 74 72 61 20 73 74 72 69 6e 67 20 74 68 61  extra string tha
6450: 74 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  t is appended to
6460: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f   the sqlite3Opco
6470: 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68  deName().  In th
6480: 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20  e.** absence of 
6490: 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20  other comments, 
64a0: 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65  this synopsis be
64b0: 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e  comes the commen
64c0: 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e  t on the opcode.
64d0: 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61  .** Some transla
64e0: 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a  tion occurs:.**.
64f0: 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20 20 20  **       "PX"   
6500: 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a     ->  "r[X]".**
6510: 20 20 20 20 20 20 20 22 50 58 40 50 59 22 20 20         "PX@PY"  
6520: 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31   ->  "r[X..X+Y-1
6530: 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66  ]"  or "r[x]" if
6540: 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20   y is 0 or 1.** 
6550: 20 20 20 20 20 20 22 50 58 40 50 59 2b 31 22 20        "PX@PY+1" 
6560: 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20  ->  "r[X..X+Y]" 
6570: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
6580: 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20  y is 0.**       
6590: 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72  "PY..PY"  ->  "r
65a0: 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20  [X..Y]"      or 
65b0: 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a  "r[x]" if y<=x.*
65c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73  /.static int dis
65d0: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63  playComment(.  c
65e0: 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20  onst Op *pOp,   
65f0: 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
6600: 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20  to be commented 
6610: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6620: 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69  *zP4,   /* Previ
6630: 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76  ously obtained v
6640: 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20  alue for P4 */. 
6650: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20   char *zTemp,   
6660: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
6670: 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ult here */.  in
6680: 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20  t nTemp         
6690: 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61   /* Space availa
66a0: 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a  ble in zTemp[] *
66b0: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
66c0: 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f  r *zOpName;.  co
66d0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70  nst char *zSynop
66e0: 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61  sis;.  int nOpNa
66f0: 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a  me;.  int ii, jj
6700: 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71  ;.  zOpName = sq
6710: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
6720: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20  pOp->opcode);.  
6730: 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  nOpName = sqlite
6740: 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d  3Strlen30(zOpNam
6750: 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d  e);.  if( zOpNam
6760: 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a  e[nOpName+1] ){.
6770: 20 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20      int seenCom 
6780: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b  = 0;.    char c;
6790: 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d  .    zSynopsis =
67a0: 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e   zOpName += nOpN
67b0: 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f 72  ame + 1;.    for
67c0: 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65  (ii=jj=0; jj<nTe
67d0: 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79  mp-1 && (c = zSy
67e0: 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20  nopsis[ii])!=0; 
67f0: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
6800: 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20   c=='P' ){.     
6810: 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73     c = zSynopsis
6820: 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  [++ii];.        
6830: 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20  if( c=='4' ){.  
6840: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
6850: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
6860: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73  j, zTemp+jj, "%s
6870: 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20  ", zP4);.       
6880: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58   }else if( c=='X
6890: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
68a0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
68b0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
68c0: 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  jj, "%s", pOp->z
68d0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
68e0: 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b      seenCom = 1;
68f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
6900: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31            int v1
6910: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c   = translateP(c,
6920: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
6930: 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20   int v2;.       
6940: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6950: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
6960: 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31  emp+jj, "%d", v1
6970: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
6980: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
6990: 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32  is+ii+1, "@P", 2
69a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
69b0: 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20      ii += 3;.   
69c0: 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73           jj += s
69d0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
69e0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
69f0: 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73        v2 = trans
6a00: 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b  lateP(zSynopsis[
6a10: 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  ii], pOp);.     
6a20: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
6a30: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
6a40: 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a  1,"+1",2)==0 ){.
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69                ii
6a60: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
6a70: 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20       v2++;.     
6a80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6a90: 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b       if( v2>1 ){
6aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
6ab0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6ac0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
6ad0: 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76  jj, "..%d", v1+v
6ae0: 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  2-1);.          
6af0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
6b00: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
6b10: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
6b20: 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26  "..P3", 4)==0 &&
6b30: 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20   pOp->p3==0 ){. 
6b40: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
6b50: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
6b60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6b70: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
6b80: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
6b90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6ba0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a          zTemp[jj
6bb0: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
6bc0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
6bd0: 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54  seenCom && jj<nT
6be0: 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43  emp-5 && pOp->zC
6bf0: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
6c00: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6c10: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
6c20: 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70  +jj, "; %s", pOp
6c30: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
6c40: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
6c50: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
6c60: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  j);.    }.    if
6c70: 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65  ( jj<nTemp ) zTe
6c80: 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65  mp[jj] = 0;.  }e
6c90: 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f  lse if( pOp->zCo
6ca0: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  mment ){.    sql
6cb0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6cc0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22  emp, zTemp, "%s"
6cd0: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
6ce0: 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74  ;.    jj = sqlit
6cf0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
6d00: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6d10: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
6d20: 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    jj = 0;.  }.  
6d30: 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e  return jj;.}.#en
6d40: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
6d50: 42 55 47 20 2a 2f 0a 0a 0a 23 69 66 20 21 64 65  BUG */...#if !de
6d60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6d70: 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64  T_EXPLAIN) || !d
6d80: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c  efined(NDEBUG) \
6d90: 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64  .     || defined
6da0: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
6db0: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
6dc0: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f  _DEBUG)./*.** Co
6dd0: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74  mpute a string t
6de0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
6df0: 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66  e P4 parameter f
6e00: 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  or an opcode..**
6e10: 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61   Use zTemp for a
6e20: 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70  ny required temp
6e30: 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61  orary buffer spa
6e40: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ce..*/.static ch
6e50: 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70  ar *displayP4(Op
6e60: 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65   *pOp, char *zTe
6e70: 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a  mp, int nTemp){.
6e80: 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54    char *zP4 = zT
6e90: 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  emp;.  assert( n
6ea0: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77  Temp>=20 );.  sw
6eb0: 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70  itch( pOp->p4typ
6ec0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34  e ){.    case P4
6ed0: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
6ee0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
6ef0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
6f00: 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
6f10: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73  eyInfo;.      as
6f20: 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
6f30: 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
6f40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6f50: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
6f60: 54 65 6d 70 2c 20 22 6b 28 25 64 22 2c 20 70 4b  Temp, "k(%d", pK
6f70: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b  eyInfo->nField);
6f80: 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74  .      i = sqlit
6f90: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
6fa0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
6fb0: 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  ; j<pKeyInfo->nF
6fc0: 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ield; j++){.    
6fd0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
6fe0: 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ll = pKeyInfo->a
6ff0: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
7000: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
7010: 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f  ll = pColl ? pCo
7020: 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c  ll->zName : "nil
7030: 22 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ";.        int n
7040: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
7050: 33 30 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  30(zColl);.     
7060: 20 20 20 69 66 28 20 6e 3d 3d 36 20 26 26 20 6d     if( n==6 && m
7070: 65 6d 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e  emcmp(zColl,"BIN
7080: 41 52 59 22 2c 36 29 3d 3d 30 20 29 7b 0a 20 20  ARY",6)==0 ){.  
7090: 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20          zColl = 
70a0: 22 42 22 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  "B";.          n
70b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
70c0: 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e          if( i+n>
70d0: 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20  nTemp-6 ){.     
70e0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65       memcpy(&zTe
70f0: 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b  mp[i],",...",4);
7100: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
7110: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7120: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
7130: 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66   ',';.        if
7140: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
7150: 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20  tOrder[j] ){.   
7160: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b         zTemp[i++
7170: 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20  ] = '-';.       
7180: 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70   }.        memcp
7190: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f  y(&zTemp[i], zCo
71a0: 6c 6c 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20  ll, n+1);.      
71b0: 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20    i += n;.      
71c0: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b  }.      zTemp[i+
71d0: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20  +] = ')';.      
71e0: 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20  zTemp[i] = 0;.  
71f0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54      assert( i<nT
7200: 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65  emp );.      bre
7210: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7220: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P4_COLLSEQ: {
7230: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
7240: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e  pColl = pOp->p4.
7250: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c  pColl;.      sql
7260: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7270: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e  emp, zTemp, "(%.
7280: 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  20s)", pColl->zN
7290: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
72a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
72b0: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P4_FUNCDEF: {.
72c0: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
72d0: 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46  Def = pOp->p4.pF
72e0: 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
72f0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7300: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64  p, zTemp, "%s(%d
7310: 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c  )", pDef->zName,
7320: 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20   pDef->nArg);.  
7330: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7340: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
7350: 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  64: {.      sqli
7360: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7370: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64  mp, zTemp, "%lld
7380: 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34  ", *pOp->p4.pI64
7390: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
73a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
73b0: 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20  4_INT32: {.     
73c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
73d0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
73e0: 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29  "%d", pOp->p4.i)
73f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7400: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
7410: 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _REAL: {.      s
7420: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7430: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
7440: 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  .16g", *pOp->p4.
7450: 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72  pReal);.      br
7460: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7470: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
7480: 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
7490: 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20  pOp->p4.pMem;.  
74a0: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
74b0: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ags & MEM_Str ){
74c0: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70  .        zP4 = p
74d0: 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65  Mem->z;.      }e
74e0: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
74f0: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
7500: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7510: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
7520: 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20   zTemp, "%lld", 
7530: 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20  pMem->u.i);.    
7540: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
7550: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
7560: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
7570: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7580: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
7590: 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a  16g", pMem->r);.
75a0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
75b0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
75c0: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  M_Null ){.      
75d0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
75e0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
75f0: 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20   "NULL");.      
7600: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
7610: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61  ssert( pMem->fla
7620: 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
7630: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22  .        zP4 = "
7640: 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d  (blob)";.      }
7650: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7660: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
7670: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7680: 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34  ABLE.    case P4
7690: 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
76a0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
76b0: 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74  ab = pOp->p4.pVt
76c0: 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20  ab->pVtab;.     
76d0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
76e0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
76f0: 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56  "vtab:%p:%p", pV
7700: 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64  tab, pVtab->pMod
7710: 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ule);.      brea
7720: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
7730: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
7740: 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71  RRAY: {.      sq
7750: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7760: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e  Temp, zTemp, "in
7770: 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20  tarray");.      
7780: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7790: 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47   case P4_SUBPROG
77a0: 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RAM: {.      sql
77b0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
77c0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f  emp, zTemp, "pro
77d0: 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72  gram");.      br
77e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
77f0: 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20  ase P4_ADVANCE: 
7800: 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  {.      zTemp[0]
7810: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
7820: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
7830: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50  ault: {.      zP
7840: 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  4 = pOp->p4.z;. 
7850: 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20       if( zP4==0 
7860: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
7870: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   zTemp;.        
7880: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
7890: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
78a0: 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30    assert( zP4!=0
78b0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34   );.  return zP4
78c0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
78d0: 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65  * Declare to the
78e0: 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42   Vdbe that the B
78f0: 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64  Tree object at d
7900: 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65  b->aDb[i] is use
7910: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65  d..**.** The pre
7920: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
7930: 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e   need to know in
7940: 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d   advance the com
7950: 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20  plete set of.** 
7960: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
7970: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  es that will be 
7980: 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20  use.  A mask of 
7990: 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a  these databases.
79a0: 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64  ** is maintained
79b0: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
79c0: 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61  .  The p->lockMa
79d0: 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  sk value is the 
79e0: 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e  subset of.** p->
79f0: 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74  btreeMask of dat
7a00: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
7a10: 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e   require a lock.
7a20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7a30: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64  VdbeUsesBtree(Vd
7a40: 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20  be *p, int i){. 
7a50: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
7a60: 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26   i<p->db->nDb &&
7a70: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79   i<(int)sizeof(y
7a80: 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61  DbMask)*8 );.  a
7a90: 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69  ssert( i<(int)si
7aa0: 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73  zeof(p->btreeMas
7ab0: 6b 29 2a 38 20 29 3b 0a 20 20 70 2d 3e 62 74 72  k)*8 );.  p->btr
7ac0: 65 65 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d  eeMask |= ((yDbM
7ad0: 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 69 66 28  ask)1)<<i;.  if(
7ae0: 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33   i!=1 && sqlite3
7af0: 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d  BtreeSharable(p-
7b00: 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  >db->aDb[i].pBt)
7b10: 20 29 7b 0a 20 20 20 20 70 2d 3e 6c 6f 63 6b 4d   ){.    p->lockM
7b20: 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b  ask |= ((yDbMask
7b30: 29 31 29 3c 3c 69 3b 0a 20 20 7d 0a 7d 0a 0a 23  )1)<<i;.  }.}..#
7b40: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
7b50: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
7b60: 41 43 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f  ACHE) && SQLITE_
7b70: 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a  THREADSAFE>0./*.
7b80: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
7b90: 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70  compiled to supp
7ba0: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
7bb0: 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20   mode and to be 
7bc0: 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74  threadsafe,.** t
7bd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61  his routine obta
7be0: 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73  ins the mutex as
7bf0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
7c00: 63 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75  ch BtShared stru
7c10: 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61  cture.** that ma
7c20: 79 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79  y be accessed by
7c30: 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
7c40: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
7c50: 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c  n doing so it al
7c60: 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42  so.** sets the B
7c70: 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65  tShared.db membe
7c80: 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65  r of each of the
7c90: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
7ca0: 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a  ures, ensuring.*
7cb0: 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65  * that the corre
7cc0: 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ct busy-handler 
7cd0: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
7ce0: 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e  ked if required.
7cf0: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  .**.** If SQLite
7d00: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61   is not threadsa
7d10: 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70  fe but does supp
7d20: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
7d30: 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73   mode, then.** s
7d40: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
7d50: 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  () is invoked to
7d60: 20 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65   set the BtShare
7d70: 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a  d.db variables.*
7d80: 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68  * of all of BtSh
7d90: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20  ared structures 
7da0: 61 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74  accessible via t
7db0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
7dc0: 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  le .** associate
7dd0: 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a  d with the VM..*
7de0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
7df0: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
7e00: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75   and does not su
7e10: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
7e20: 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a  he mode, this.**
7e30: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
7e40: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
7e50: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65  p->btreeMask fie
7e60: 6c 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  ld is a bitmask 
7e70: 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68  of all btrees th
7e80: 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20  at the prepared 
7e90: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20  .** statement p 
7ea0: 77 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20  will ever use.  
7eb0: 4c 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d  Let N be the num
7ec0: 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70  ber of bits in p
7ed0: 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63  ->btreeMask.** c
7ee0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
7ef0: 62 74 72 65 65 73 20 74 68 61 74 20 75 73 65 20  btrees that use 
7f00: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
7f10: 68 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20  hen the runtime 
7f20: 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  of.** this routi
7f30: 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20  ne is N*N.  But 
7f40: 61 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d  as N is rarely m
7f50: 6f 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73  ore than 1, this
7f60: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62   should not.** b
7f70: 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  e a problem..*/.
7f80: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
7f90: 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a  Enter(Vdbe *p){.
7fa0: 20 20 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61    int i;.  yDbMa
7fb0: 73 6b 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74  sk mask;.  sqlit
7fc0: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
7fd0: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
7fe0: 69 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d  if( p->lockMask=
7ff0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
8000: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
8010: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   */.  db = p->db
8020: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  aDb = db->aD
8030: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e  b;.  nDb = db->n
8040: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d  Db;.  for(i=0, m
8050: 61 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b  ask=1; i<nDb; i+
8060: 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29  +, mask += mask)
8070: 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26  {.    if( i!=1 &
8080: 26 20 28 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63  & (mask & p->loc
8090: 6b 4d 61 73 6b 29 21 3d 30 20 26 26 20 41 4c 57  kMask)!=0 && ALW
80a0: 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d  AYS(aDb[i].pBt!=
80b0: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
80c0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 61 44  te3BtreeEnter(aD
80d0: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d  b[i].pBt);.    }
80e0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
80f0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8100: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
8110: 41 43 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f  ACHE) && SQLITE_
8120: 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a  THREADSAFE>0./*.
8130: 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66  ** Unlock all of
8140: 20 74 68 65 20 62 74 72 65 65 73 20 70 72 65 76   the btrees prev
8150: 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79  iously locked by
8160: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
8170: 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a  e3VdbeEnter()..*
8180: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
8190: 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29  beLeave(Vdbe *p)
81a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 79 44 62  {.  int i;.  yDb
81b0: 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 73 71 6c  Mask mask;.  sql
81c0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a  ite3 *db;.  Db *
81d0: 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a  aDb;.  int nDb;.
81e0: 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73    if( p->lockMas
81f0: 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20  k==0 ) return;  
8200: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
8210: 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e  se */.  db = p->
8220: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
8230: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
8240: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  >nDb;.  for(i=0,
8250: 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20   mask=1; i<nDb; 
8260: 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73  i++, mask += mas
8270: 6b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31  k){.    if( i!=1
8280: 20 26 26 20 28 6d 61 73 6b 20 26 20 70 2d 3e 6c   && (mask & p->l
8290: 6f 63 6b 4d 61 73 6b 29 21 3d 30 20 26 26 20 41  ockMask)!=0 && A
82a0: 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74  LWAYS(aDb[i].pBt
82b0: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  !=0) ){.      sq
82c0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
82d0: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
82e0: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
82f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42  .#if defined(VDB
8300: 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65  E_PROFILE) || de
8310: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
8320: 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  UG)./*.** Print 
8330: 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e  a single opcode.
8340: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
8350: 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67  s used for debug
8360: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f  ging only..*/.vo
8370: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
8380: 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74  intOp(FILE *pOut
8390: 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f  , int pc, Op *pO
83a0: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b  p){.  char *zP4;
83b0: 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d  .  char zPtr[50]
83c0: 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30  ;.  char zCom[10
83d0: 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  0];.  static con
83e0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
83f0: 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25  1 = "%4d %-13s %
8400: 34 64 20 25 34 64 20 25 34 64 20 25 2d 31 33 73  4d %4d %4d %-13s
8410: 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69   %.2X %s\n";.  i
8420: 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75  f( pOut==0 ) pOu
8430: 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50  t = stdout;.  zP
8440: 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f  4 = displayP4(pO
8450: 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28  p, zPtr, sizeof(
8460: 7a 50 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53  zPtr));.#ifdef S
8470: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
8480: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
8490: 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70  displayComment(p
84a0: 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73  Op, zP4, zCom, s
84b0: 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65  izeof(zCom));.#e
84c0: 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20  lse.  zCom[0] = 
84d0: 30 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42  0.#endif.  /* NB
84e0: 3a 20 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70  :  The sqlite3Op
84f0: 63 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74  codeName() funct
8500: 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
8510: 65 64 20 62 79 20 63 6f 64 65 20 63 72 65 61 74  ed by code creat
8520: 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d  ed.  ** by the m
8530: 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64  kopcodeh.awk and
8540: 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73   mkopcodec.awk s
8550: 63 72 69 70 74 73 20 77 68 69 63 68 20 65 78 74  cripts which ext
8560: 72 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e  ract the.  ** in
8570: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
8580: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
8590: 20 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e   text */.  fprin
85a0: 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74  tf(pOut, zFormat
85b0: 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71  1, pc, .      sq
85c0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
85d0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f  pOp->opcode), pO
85e0: 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  p->p1, pOp->p2, 
85f0: 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f  pOp->p3, zP4, pO
8600: 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f  p->p5,.      zCo
8610: 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28  m.  );.  fflush(
8620: 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pOut);.}.#endif.
8630: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
8640: 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d  n array of N Mem
8650: 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61   elements.*/.sta
8660: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
8670: 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c  MemArray(Mem *p,
8680: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70   int N){.  if( p
8690: 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d   && N ){.    Mem
86a0: 20 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69   *pEnd;.    sqli
86b0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
86c0: 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66  .    u8 malloc_f
86d0: 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c  ailed = db->mall
86e0: 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66  ocFailed;.    if
86f0: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
8700: 65 64 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ed ){.      for(
8710: 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45  pEnd=&p[N]; p<pE
8720: 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  nd; p++){.      
8730: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8740: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
8750: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
8760: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
8770: 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b   for(pEnd=&p[N];
8780: 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20   p<pEnd; p++){. 
8790: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70       assert( (&p
87a0: 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b  [1])==pEnd || p[
87b0: 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29  0].db==p[1].db )
87c0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ;..      /* This
87d0: 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79   block is really
87e0: 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73   an inlined vers
87f0: 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
8800: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20  beMemRelease(). 
8810: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b       ** that tak
8820: 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  es advantage of 
8830: 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
8840: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61  e memory cell va
8850: 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  lue is .      **
8860: 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55   being set to NU
8870: 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73 69  LL after releasi
8880: 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72  ng any dynamic r
8890: 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20  esources..      
88a0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
88b0: 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f  justification fo
88c0: 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f  r duplicating co
88d0: 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f 72  de is that accor
88e0: 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a  ding to .      *
88f0: 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69  * callgrind, thi
8900: 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74 61  s causes a certa
8910: 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f 20  in test case to 
8920: 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37 20  hit the CPU 4.7 
8930: 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e  .      ** percen
8940: 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75  t less (x86 linu
8950: 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34  x, gcc version 4
8960: 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20  .1.2, -O6) than 
8970: 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  if .      ** sql
8980: 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29  ite3MemRelease()
8990: 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f   were called fro
89a0: 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32  m here. With -O2
89b0: 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20  , this jumps.   
89c0: 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72     ** to 6.6 per
89d0: 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63  cent. The test c
89e0: 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67  ase is inserting
89f0: 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20   1000 rows into 
8a00: 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a  a table .      *
8a10: 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65  * with no indexe
8a20: 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  s using a single
8a30: 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52 54   prepared INSERT
8a40: 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64   statement, bind
8a50: 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  () .      ** and
8a60: 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74   reset(). Insert
8a70: 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e  s are grouped in
8a80: 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  to a transaction
8a90: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
8aa0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d   if( p->flags&(M
8ab0: 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d  EM_Agg|MEM_Dyn|M
8ac0: 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77  EM_Frame|MEM_Row
8ad0: 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Set) ){.        
8ae0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
8af0: 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20  lease(p);.      
8b00: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61  }else if( p->zMa
8b10: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
8b20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8b30: 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  , p->zMalloc);. 
8b40: 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f         p->zMallo
8b50: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  c = 0;.      }..
8b60: 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d        p->flags =
8b70: 20 4d 45 4d 5f 49 6e 76 61 6c 69 64 3b 0a 20 20   MEM_Invalid;.  
8b80: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c    }.    db->mall
8b90: 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f  ocFailed = mallo
8ba0: 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a  c_failed;.  }.}.
8bb0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
8bc0: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
8bd0: 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74   and its content
8be0: 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a  s. VdbeFrame obj
8bf0: 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ects are.** allo
8c00: 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  cated by the OP_
8c10: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
8c20: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  n sqlite3VdbeExe
8c30: 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c()..*/.void sql
8c40: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
8c50: 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ete(VdbeFrame *p
8c60: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65  ){.  int i;.  Me
8c70: 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72  m *aMem = VdbeFr
8c80: 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62  ameMem(p);.  Vdb
8c90: 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20  eCursor **apCsr 
8ca0: 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  = (VdbeCursor **
8cb0: 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64  )&aMem[p->nChild
8cc0: 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Mem];.  for(i=0;
8cd0: 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b   i<p->nChildCsr;
8ce0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
8cf0: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
8d00: 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29  (p->v, apCsr[i])
8d10: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
8d20: 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d  emArray(aMem, p-
8d30: 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73  >nChildMem);.  s
8d40: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
8d50: 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69  v->db, p);.}..#i
8d60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8d70: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
8d80: 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f  Give a listing o
8d90: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e  f the program in
8da0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
8db0: 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hine..**.** The 
8dc0: 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65  interface is the
8dd0: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
8de0: 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74  VdbeExec().  But
8df0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72   instead of.** r
8e00: 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c  unning the code,
8e10: 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20   it invokes the 
8e20: 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f  callback once fo
8e30: 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  r each instructi
8e40: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74  on..** This feat
8e50: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ure is used to i
8e60: 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49  mplement "EXPLAI
8e70: 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  N"..**.** When p
8e80: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61  ->explain==1, ea
8e90: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ch instruction i
8ea0: 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a  s listed.  When.
8eb0: 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  ** p->explain==2
8ec0: 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69  , only OP_Explai
8ed0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61  n instructions a
8ee0: 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68  re listed and th
8ef0: 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e  ese.** are shown
8f00: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
8f10: 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c  format.  p->expl
8f20: 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74  ain==2 is used t
8f30: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45  o implement.** E
8f40: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
8f50: 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d  N..**.** When p-
8f60: 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72  >explain==1, fir
8f70: 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  st the main prog
8f80: 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74  ram is listed, t
8f90: 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74  hen each of.** t
8fa0: 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70 72  he trigger subpr
8fb0: 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65  ograms are liste
8fc0: 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f  d one by one..*/
8fd0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
8fe0: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
9010: 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20  .){.  int nRow; 
9020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
9040: 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e  op when row coun
9050: 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20 2a  t reaches this *
9060: 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30  /.  int nSub = 0
9070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9080: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9090: 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  er of sub-vdbes 
90a0: 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
90b0: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70   SubProgram **ap
90c0: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
90d0: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
90e0: 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20  f sub-vdbes */. 
90f0: 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20   Mem *pSub = 0; 
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9110: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
9120: 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20  cell hold array 
9130: 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20  of subprogs */. 
9140: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9150: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
9160: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
9170: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
9180: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
91b0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
91c0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
91d0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
91e0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
91f0: 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ode */.  Mem *pM
9200: 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  em = &p->aMem[1]
9210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
9220: 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65   First Mem of re
9230: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61  sult set */..  a
9240: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
9250: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
9260: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
9270: 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73  GIC_RUN );.  ass
9280: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
9290: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
92a0: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70  SQLITE_BUSY || p
92b0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
92c0: 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  EM );..  /* Even
92d0: 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63   though this opc
92e0: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ode does not use
92f0: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73   dynamic strings
9300: 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65   for.  ** the re
9310: 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c  sult, result col
9320: 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20  umns may become 
9330: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
9340: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
9350: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
9360: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
9370: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
9380: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
9390: 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
93a0: 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38  MemArray(pMem, 8
93b0: 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  );.  p->pResultS
93c0: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  et = 0;..  if( p
93d0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
93e0: 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  EM ){.    /* Thi
93f0: 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d  s happens if a m
9400: 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61  alloc() inside a
9410: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
9420: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f  _column_text() o
9430: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
9440: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
9450: 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20   failed.  */.   
9460: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9470: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
9480: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
9490: 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74    }..  /* When t
94a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
94b0: 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73  put rows reaches
94c0: 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e   nRow, that mean
94d0: 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69  s the.  ** listi
94e0: 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ng has finished 
94f0: 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70  and sqlite3_step
9500: 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  () should return
9510: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
9520: 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73  ** nRow is the s
9530: 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  um of the number
9540: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
9550: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c  main program, pl
9560: 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20  us.  ** the sum 
9570: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
9580: 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69   rows in all tri
9590: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
95a0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
95b0: 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e  * so far.  The n
95c0: 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69  Row value will i
95d0: 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74  ncrease as new t
95e0: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
95f0: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f  ms are.  ** enco
9600: 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e  untered, but p->
9610: 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  pc will eventual
9620: 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e  ly catch up to n
9630: 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77  Row..  */.  nRow
9640: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28   = p->nOp;.  if(
9650: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
9660: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
9670: 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  st 8 memory cell
9680: 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74  s are used for t
9690: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
96a0: 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a  So we will.    *
96b0: 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65  * commandeer the
96c0: 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65   9th cell to use
96d0: 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20   as storage for 
96e0: 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
96f0: 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ters.    ** to t
9700: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
9710: 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73  ms.  The VDBE is
9720: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68   guaranteed to h
9730: 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20  ave at least 9. 
9740: 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f     ** cells.  */
9750: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9760: 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53  nMem>9 );.    pS
9770: 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d  ub = &p->aMem[9]
9780: 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  ;.    if( pSub->
9790: 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29  flags&MEM_Blob )
97a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68  {.      /* On th
97b0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
97c0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20  sqlite3_step(), 
97d0: 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61  pSub will hold a
97e0: 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20   NULL.  It is.  
97f0: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
9800: 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20  ed to a BLOB by 
9810: 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  the P4_SUBPROGRA
9820: 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  M processing log
9830: 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  ic below */.    
9840: 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e    nSub = pSub->n
9850: 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a  /sizeof(Vdbe*);.
9860: 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53        apSub = (S
9870: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75  ubProgram **)pSu
9880: 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b->z;.    }.    
9890: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b  for(i=0; i<nSub;
98a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f   i++){.      nRo
98b0: 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e  w += apSub[i]->n
98c0: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  Op;.    }.  }.. 
98d0: 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e   do{.    i = p->
98e0: 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  pc++;.  }while( 
98f0: 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70  i<nRow && p->exp
9900: 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f  lain==2 && p->aO
9910: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
9920: 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28  Explain );.  if(
9930: 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20   i>=nRow ){.    
9940: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
9950: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
9960: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
9970: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
9980: 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20  terrupted ){.   
9990: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
99a0: 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72  INTERRUPT;.    r
99b0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
99c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
99d0: 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
99e0: 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71  sg, db, "%s", sq
99f0: 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72  lite3ErrStr(p->r
9a00: 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  c));.  }else{.  
9a10: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20    char *zP4;.   
9a20: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66   Op *pOp;.    if
9a30: 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  ( i<p->nOp ){.  
9a40: 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
9a50: 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73  t line number is
9a60: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68   small enough th
9a70: 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  at we are still 
9a80: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
9a90: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f  main program. */
9aa0: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d  .      pOp = &p-
9ab0: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  >aOp[i];.    }el
9ac0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  se{.      /* We 
9ad0: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69  are currently li
9ae0: 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d  sting subprogram
9af0: 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77  s.  Figure out w
9b00: 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20  hich one and.   
9b10: 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68     ** pick up th
9b20: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70  e appropriate op
9b30: 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  code. */.      i
9b40: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d  nt j;.      i -=
9b50: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66   p->nOp;.      f
9b60: 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62  or(j=0; i>=apSub
9b70: 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a  [j]->nOp; j++){.
9b80: 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53          i -= apS
9b90: 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[j]->nOp;.    
9ba0: 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20    }.      pOp = 
9bb0: 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69  &apSub[j]->aOp[i
9bc0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ];.    }.    if(
9bd0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
9be0: 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  {.      pMem->fl
9bf0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
9c00: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
9c10: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
9c20: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
9c30: 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20  i = i;          
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c50: 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d        /* Program
9c60: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
9c70: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20    pMem++;.  .   
9c80: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
9c90: 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f   MEM_Static|MEM_
9ca0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
9cb0: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63      pMem->z = (c
9cc0: 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f  har*)sqlite3Opco
9cd0: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
9ce0: 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a  de); /* Opcode *
9cf0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
9d00: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
9d10: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
9d20: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
9d30: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
9d40: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
9d50: 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d  E_TEXT;.      pM
9d60: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
9d70: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65  _UTF8;.      pMe
9d80: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  m++;..      /* W
9d90: 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61  hen an OP_Progra
9da0: 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f  m opcode is enco
9db0: 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20  unter (the only 
9dc0: 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a  opcode that has.
9dd0: 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55        ** a P4_SU
9de0: 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e  BPROGRAM argumen
9df0: 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73  t), expand the s
9e00: 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
9e10: 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a   of subprograms.
9e20: 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e        ** kept in
9e30: 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f   p->aMem[9].z to
9e40: 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72   hold the new pr
9e50: 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67  ogram - assuming
9e60: 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d   this subprogram
9e70: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  .      ** has no
9e80: 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  t already been s
9e90: 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  een..      */.  
9ea0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74      if( pOp->p4t
9eb0: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
9ec0: 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  AM ){.        in
9ed0: 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b  t nByte = (nSub+
9ee0: 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  1)*sizeof(SubPro
9ef0: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
9f00: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
9f10: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20  or(j=0; j<nSub; 
9f20: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
9f30: 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f  if( apSub[j]==pO
9f40: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  p->p4.pProgram )
9f50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
9f60: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  }.        if( j=
9f70: 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f  =nSub && SQLITE_
9f80: 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d  OK==sqlite3VdbeM
9f90: 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79  emGrow(pSub, nBy
9fa0: 74 65 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a  te, nSub!=0) ){.
9fb0: 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62 20            apSub 
9fc0: 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  = (SubProgram **
9fd0: 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20  )pSub->z;.      
9fe0: 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b      apSub[nSub++
9ff0: 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  ] = pOp->p4.pPro
a000: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  gram;.          
a010: 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pSub->flags |= M
a020: 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20  EM_Blob;.       
a030: 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75     pSub->n = nSu
a040: 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  b*sizeof(SubProg
a050: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d  ram*);.        }
a060: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
a070: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
a080: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
a090: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
a0a0: 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a0c0: 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P1 */.    pMem->
a0d0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
a0e0: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
a0f0: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
a100: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
a110: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
a120: 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20  Op->p2;         
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a140: 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d   /* P2 */.    pM
a150: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
a160: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  E_INTEGER;.    p
a170: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
a180: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
a190: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
a1a0: 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20   = pOp->p3;     
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20       /* P3 */.  
a1d0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
a1e0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
a1f0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
a200: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
a210: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c  emGrow(pMem, 32,
a220: 20 30 29 20 29 7b 20 20 20 20 20 20 20 20 20 20   0) ){          
a230: 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20    /* P4 */.     
a240: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
a250: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
a260: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a270: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
a280: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
a290: 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53   = MEM_Dyn|MEM_S
a2a0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
a2b0: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
a2c0: 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33  (pOp, pMem->z, 3
a2d0: 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 34 21  2);.    if( zP4!
a2e0: 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20  =pMem->z ){.    
a2f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
a300: 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34  SetStr(pMem, zP4
a310: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
a320: 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  8, 0);.    }else
a330: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
a340: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
a350: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
a360: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
a370: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
a380: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
a390: 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20  _UTF8;.    }.   
a3a0: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
a3b0: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70  LITE_TEXT;.    p
a3c0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
a3d0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
a3e0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
a3f0: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d  e3VdbeMemGrow(pM
a400: 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20  em, 4, 0) ){.   
a410: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a420: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a430: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
a440: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
a450: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
a460: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
a470: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  _Dyn|MEM_Str|MEM
a480: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
a490: 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20  m->n = 2;.      
a4a0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
a4b0: 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e  (3, pMem->z, "%.
a4c0: 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20  2x", pOp->p5);  
a4d0: 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20   /* P5 */.      
a4e0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
a4f0: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  ITE_TEXT;.      
a500: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
a510: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
a520: 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66  Mem++;.  .#ifdef
a530: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
a540: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
a550: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
a560: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
a570: 6d 2c 20 35 30 30 2c 20 30 29 20 29 7b 0a 20 20  m, 500, 0) ){.  
a580: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a590: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
a5a0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
a5b0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
a5c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a5d0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
a5e0: 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45  M_Dyn|MEM_Str|ME
a5f0: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
a600: 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43  em->n = displayC
a610: 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c  omment(pOp, zP4,
a620: 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a   pMem->z, 500);.
a630: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
a640: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
a650: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
a660: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
a670: 65 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d  else.      pMem-
a680: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
a690: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a6a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d           /* Comm
a6b0: 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ent */.      pMe
a6c0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
a6d0: 5f 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20  _NULL;.#endif.  
a6e0: 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73    }..    p->nRes
a6f0: 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28  Column = 8 - 4*(
a700: 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20  p->explain-1);. 
a710: 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74     p->pResultSet
a720: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a   = &p->aMem[1];.
a730: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
a740: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
a750: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a  SQLITE_ROW;.  }.
a760: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
a770: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
a780: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
a790: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a7a0: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
a7b0: 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61   the SQL that wa
a7c0: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  s used to genera
a7d0: 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  te a VDBE progra
a7e0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
a7f0: 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56  e3VdbePrintSql(V
a800: 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74  dbe *p){.  const
a810: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
a820: 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20  if( p->zSql ){. 
a830: 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a     z = p->zSql;.
a840: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e    }else if( p->n
a850: 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e  Op>=1 ){.    con
a860: 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d  st VdbeOp *pOp =
a870: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20   &p->aOp[0];.   
a880: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
a890: 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f  ==OP_Trace && pO
a8a0: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
a8b0: 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e      z = pOp->p4.
a8c0: 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  z;.      while( 
a8d0: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a  sqlite3Isspace(*
a8e0: 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a  z) ) z++;.    }.
a8f0: 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72    }.  if( z ) pr
a900: 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c  intf("SQL: [%s]\
a910: 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66  n", z);.}.#endif
a920: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
a930: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
a940: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
a950: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
a960: 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  CE)./*.** Print 
a970: 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61  an IOTRACE messa
a980: 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63  ge showing SQL c
a990: 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ontent..*/.void 
a9a0: 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61  sqlite3VdbeIOTra
a9b0: 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ceSql(Vdbe *p){.
a9c0: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e    int nOp = p->n
a9d0: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  Op;.  VdbeOp *pO
a9e0: 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  p;.  if( sqlite3
a9f0: 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74  IoTrace==0 ) ret
aa00: 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31  urn;.  if( nOp<1
aa10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70   ) return;.  pOp
aa20: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
aa30: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
aa40: 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f  ==OP_Trace && pO
aa50: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
aa60: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
aa70: 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20  char z[1000];.  
aa80: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
aa90: 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
aaa0: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a   "%s", pOp->p4.z
aab0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
aac0: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
aad0: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
aae0: 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20   for(j=0; z[i]; 
aaf0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
ab00: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
ab10: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
ab20: 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20  if( z[i-1]!=' ' 
ab30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  ){.          z[j
ab40: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
ab50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
ab60: 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  {.        z[j++]
ab70: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d   = z[i];.      }
ab80: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20  .    }.    z[j] 
ab90: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
aba0: 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c  IoTrace("SQL %s\
abb0: 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65  n", z);.  }.}.#e
abc0: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
abd0: 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51  OMIT_TRACE && SQ
abe0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
abf0: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ACE */../*.** Al
ac00: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 72 6f  locate space fro
ac10: 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65 20 62  m a fixed size b
ac20: 75 66 66 65 72 20 61 6e 64 20 72 65 74 75 72 6e  uffer and return
ac30: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a   a pointer to.**
ac40: 20 74 68 61 74 20 73 70 61 63 65 2e 20 20 49 66   that space.  If
ac50: 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70   insufficient sp
ac60: 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
ac70: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
ac80: 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20 70 61  *.** The pBuf pa
ac90: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 69  rameter is the i
aca0: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
acb0: 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20  a pointer which 
acc0: 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20  will.** receive 
acd0: 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20  the new memory. 
ace0: 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c   pBuf is normall
acf0: 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75 66  y NULL.  If pBuf
ad00: 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c   is not.** NULL,
ad10: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6d   it means that m
ad20: 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61 73 20  emory space has 
ad30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
ad40: 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61 74 0a  ocated and that.
ad50: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
ad60: 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63  should not alloc
ad70: 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f  ate any new memo
ad80: 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66 20 69  ry.  When pBuf i
ad90: 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69  s not.** NULL si
ada0: 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42 75 66  mply return pBuf
adb0: 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65  .  Only allocate
adc0: 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70 61 63   new memory spac
add0: 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69  e when pBuf.** i
ade0: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42  s NULL..**.** nB
adf0: 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  yte is the numbe
ae00: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
ae10: 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a  ace needed..**.*
ae20: 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73  * *ppFrom points
ae30: 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73 70   to available sp
ae40: 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f 69  ace and pEnd poi
ae50: 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  nts to the end o
ae60: 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62  f the.** availab
ae70: 6c 65 20 73 70 61 63 65 2e 20 20 57 68 65 6e 20  le space.  When 
ae80: 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74  space is allocat
ae90: 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20 61  ed, *ppFrom is a
aea0: 64 76 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20  dvanced past.** 
aeb0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61  the end of the a
aec0: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 0a  llocated space..
aed0: 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73  **.** *pnByte is
aee0: 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68   a counter of th
aef0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
af00: 73 20 6f 66 20 73 70 61 63 65 20 74 68 61 74 20  s of space that 
af10: 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74  have failed.** t
af20: 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20  o allocate.  If 
af30: 74 68 65 72 65 20 69 73 20 69 6e 73 75 66 66 69  there is insuffi
af40: 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20 2a  cient space in *
af50: 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73 66  ppFrom to satisf
af60: 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74  y the.** request
af70: 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
af80: 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68 65 20   *pnByte by the 
af90: 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72 65  amount of the re
afa0: 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  quest..*/.static
afb0: 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63   void *allocSpac
afc0: 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  e(.  void *pBuf,
afd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
afe0: 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65  re return pointe
aff0: 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  r will be stored
b000: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
b010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b020: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
b030: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75   allocate */.  u
b040: 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20  8 **ppFrom,     
b050: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41      /* IN/OUT: A
b060: 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70 70  llocate from *pp
b070: 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45  From */.  u8 *pE
b080: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd,            /
b090: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62  * Pointer to 1 b
b0a0: 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  yte past the end
b0b0: 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66 66   of *ppFrom buff
b0c0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42  er */.  int *pnB
b0d0: 79 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20  yte          /* 
b0e0: 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61  If allocation ca
b0f0: 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69 6e  nnot be made, in
b100: 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20  crement *pnByte 
b110: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
b120: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
b130: 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b  MENT(*ppFrom) );
b140: 0a 20 20 69 66 28 20 70 42 75 66 20 29 20 72 65  .  if( pBuf ) re
b150: 74 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79  turn pBuf;.  nBy
b160: 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74  te = ROUND8(nByt
b170: 65 29 3b 0a 20 20 69 66 28 20 26 28 2a 70 70 46  e);.  if( &(*ppF
b180: 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70  rom)[nByte] <= p
b190: 45 6e 64 20 29 7b 0a 20 20 20 20 70 42 75 66 20  End ){.    pBuf 
b1a0: 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d  = (void*)*ppFrom
b1b0: 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d  ;.    *ppFrom +=
b1c0: 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b   nByte;.  }else{
b1d0: 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20  .    *pnByte += 
b1e0: 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nByte;.  }.  ret
b1f0: 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a  urn pBuf;.}../*.
b200: 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56 44  ** Rewind the VD
b210: 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62  BE back to the b
b220: 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70  eginning in prep
b230: 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72  aration for.** r
b240: 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f  unning it..*/.vo
b250: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
b260: 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23  wind(Vdbe *p){.#
b270: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
b280: 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
b290: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
b2a0: 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69  ).  int i;.#endi
b2b0: 66 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  f.  assert( p!=0
b2c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
b2d0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
b2e0: 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a  IC_INIT );..  /*
b2f0: 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   There should be
b300: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70   at least one op
b310: 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  code..  */.  ass
b320: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
b330: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d  ..  /* Set the m
b340: 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47  agic to VDBE_MAG
b350: 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61  IC_RUN sooner ra
b360: 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e  ther than later.
b370: 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   */.  p->magic =
b380: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
b390: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
b3a0: 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b  DEBUG.  for(i=1;
b3b0: 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29   i<p->nMem; i++)
b3c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
b3d0: 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e  >aMem[i].db==p->
b3e0: 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  db );.  }.#endif
b3f0: 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20  .  p->pc = -1;. 
b400: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
b410: 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63  OK;.  p->errorAc
b420: 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
b430: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
b440: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20  BE_MAGIC_RUN;.  
b450: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
b460: 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
b470: 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65  1;.  p->minWrite
b480: 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35  FileFormat = 255
b490: 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  ;.  p->iStatemen
b4a0: 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43  t = 0;.  p->nFkC
b4b0: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23  onstraint = 0;.#
b4c0: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
b4d0: 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  LE.  for(i=0; i<
b4e0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
b4f0: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20    p->aOp[i].cnt 
b500: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  = 0;.    p->aOp[
b510: 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20  i].cycles = 0;. 
b520: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
b530: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72  ** Prepare a vir
b540: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72  tual machine for
b550: 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74   execution for t
b560: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66  he first time af
b570: 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20  ter.** creating 
b580: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
b590: 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c  ine.  This invol
b5a0: 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a  ves things such.
b5b0: 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67  ** as allocating
b5c0: 20 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64   stack space and
b5d0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
b5e0: 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  e program counte
b5f0: 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  r..** After the 
b600: 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70  VDBE has be prep
b610: 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65  ped, it can be e
b620: 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f  xecuted by one o
b630: 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20  r more.** calls 
b640: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  to sqlite3VdbeEx
b650: 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ec().  .**.** Th
b660: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
b670: 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74 20  be called exact 
b680: 6f 6e 63 65 20 6f 6e 20 61 20 65 61 63 68 20 76  once on a each v
b690: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
b6a0: 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
b6b0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
b6c0: 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
b6d0: 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69  "packaged" and i
b6e0: 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75  s ready.** to ru
b6f0: 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72  n.  After this r
b700: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
b710: 2c 20 66 75 74 68 65 72 20 63 61 6c 6c 73 20 74  , futher calls t
b720: 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  o .** sqlite3Vdb
b730: 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f  eAddOp() functio
b740: 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65  ns are prohibite
b750: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
b760: 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20   disconnects.** 
b770: 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68  the Vdbe from th
b780: 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74  e Parse object t
b790: 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72  hat helped gener
b7a0: 61 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74  ate it so that t
b7b0: 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62  he.** the Vdbe b
b7c0: 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65  ecomes an indepe
b7d0: 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64  ndent entity and
b7e0: 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
b7f0: 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74  t can be.** dest
b800: 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  royed..**.** Use
b810: 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
b820: 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75  Rewind() procedu
b830: 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20  re to restore a 
b840: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
b850: 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69  back.** to its i
b860: 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74  nitial state aft
b870: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72  er it has been r
b880: 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  un..*/.void sqli
b890: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
b8a0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8c0: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
b8d0: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
b8e0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
b8f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
b900: 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ntext */.){.  sq
b910: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b930: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
b940: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
b950: 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20   nVar;          
b960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b970: 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74  umber of paramet
b980: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65  ers */.  int nMe
b990: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
b9a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b9b0: 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72  r of VM memory r
b9c0: 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e  egisters */.  in
b9d0: 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20  t nCursor;      
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b9f0: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
ba00: 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
ba10: 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20  int nArg;       
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
ba40: 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67  ments in subprog
ba50: 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  rams */.  int nO
ba60: 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  nce;            
ba70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ba80: 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e  er of OP_Once in
ba90: 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  structions */.  
baa0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bac0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
bad0: 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20 20 20  /.  u8 *zCsr;   
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baf0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
bb00: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  ilable for alloc
bb10: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a  ation */.  u8 *z
bb20: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
bb30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
bb40: 73 74 20 62 79 74 65 20 70 61 73 74 20 61 6c 6c  st byte past all
bb50: 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  ocated memory */
bb60: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78    /* How much ex
bb90: 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65  tra memory is ne
bba0: 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  eded */..  asser
bbb0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
bbc0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
bbd0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
bbe0: 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
bbf0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
bc00: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
bc10: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d   assert( pParse=
bc20: 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20  =p->pParse );.  
bc30: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
bc40: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
bc50: 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e  Failed==0 );.  n
bc60: 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56  Var = pParse->nV
bc70: 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61  ar;.  nMem = pPa
bc80: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75  rse->nMem;.  nCu
bc90: 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
bca0: 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50  Tab;.  nArg = pP
bcb0: 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20  arse->nMaxArg;. 
bcc0: 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73 65 2d   nOnce = pParse-
bcd0: 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f  >nOnce;.  if( nO
bce0: 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d  nce==0 ) nOnce =
bcf0: 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61 74   1; /* Ensure at
bd00: 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20   least one byte 
bd10: 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b  in p->aOnceFlag[
bd20: 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f 72  ] */.  .  /* For
bd30: 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71   each cursor req
bd40: 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f  uired, also allo
bd50: 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  cate a memory ce
bd60: 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20  ll. Memory.  ** 
bd70: 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43  cells (nMem+1-nC
bd80: 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e  ursor)..nMem, in
bd90: 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65  clusive, will ne
bda0: 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20  ver be used by. 
bdb0: 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f   ** the vdbe pro
bdc0: 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68  gram. Instead th
bdd0: 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  ey are used to a
bde0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
bdf0: 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f  r.  ** VdbeCurso
be00: 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63  r/BtCursor struc
be10: 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20  tures. The blob 
be20: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
be30: 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20  ated with .  ** 
be40: 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72  cursor 0 is stor
be50: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  ed in memory cel
be60: 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63  l nMem. Memory c
be70: 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a  ell (nMem-1).  *
be80: 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f  * stores the blo
be90: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
bea0: 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
beb0: 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a  or 1, etc..  **.
bec0: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61    ** See also: a
bed0: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e  llocateCursor().
bee0: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20  .  */.  nMem += 
bef0: 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41  nCursor;..  /* A
bf00: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
bf10: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
bf20: 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65  rs, SQL variable
bf30: 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20  s, VDBE cursors 
bf40: 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72  and .  ** an arr
bf50: 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51  ay to marshal SQ
bf60: 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  L function argum
bf70: 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ents in..  */.  
bf80: 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  zCsr = (u8*)&p->
bf90: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20  aOp[p->nOp];    
bfa0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
bfb0: 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20  y avaliable for 
bfc0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
bfd0: 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e  zEnd = (u8*)&p->
bfe0: 61 4f 70 5b 70 50 61 72 73 65 2d 3e 6e 4f 70 41  aOp[pParse->nOpA
bff0: 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74  lloc];  /* First
c000: 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f   byte past end o
c010: 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20 20 72  f zCsr[] */..  r
c020: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
c030: 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75  , &nArg);.  p->u
c040: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d  sesStmtJournal =
c050: 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73   (u8)(pParse->is
c060: 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70 50  MultiWrite && pP
c070: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b  arse->mayAbort);
c080: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
c090: 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31  xplain && nMem<1
c0a0: 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20  0 ){.    nMem = 
c0b0: 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  10;.  }.  memset
c0c0: 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a  (zCsr, 0, zEnd-z
c0d0: 43 73 72 29 3b 0a 20 20 7a 43 73 72 20 2b 3d 20  Csr);.  zCsr += 
c0e0: 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26  (zCsr - (u8*)0)&
c0f0: 37 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  7;.  assert( EIG
c100: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
c110: 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 70 2d 3e  T(zCsr) );.  p->
c120: 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20  expired = 0;..  
c130: 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65  /* Memory for re
c140: 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74  gisters, paramet
c150: 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63  ers, cursor, etc
c160: 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69  , is allocated i
c170: 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65  n two.  ** passe
c180: 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74  s.  On the first
c190: 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f   pass, we try to
c1a0: 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 73 70   reuse unused sp
c1b0: 61 63 65 20 61 74 20 74 68 65 20 0a 20 20 2a 2a  ace at the .  **
c1c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
c1d0: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
c1e0: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
c1f0: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
c200: 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65  y.  ** requireme
c210: 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74  nts by reusing t
c220: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
c230: 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73  tail, then the s
c240: 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20  econd.  ** pass 
c250: 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65  will fill in the
c260: 20 72 65 73 74 20 75 73 69 6e 67 20 61 20 66 72   rest using a fr
c270: 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  esh allocation. 
c280: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
c290: 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61   two-pass approa
c2a0: 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61  ch that reuses a
c2b0: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
c2c0: 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20   possible from. 
c2d0: 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72   ** the leftover
c2e0: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
c2f0: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
c300: 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66  array can signif
c310: 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64  icantly.  ** red
c320: 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  uce the amount o
c330: 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  f memory held by
c340: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
c350: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f  ement..  */.  do
c360: 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 30   {.    nByte = 0
c370: 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20  ;.    p->aMem = 
c380: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d  allocSpace(p->aM
c390: 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28  em, nMem*sizeof(
c3a0: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
c3b0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
c3c0: 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53  p->aVar = allocS
c3d0: 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56  pace(p->aVar, nV
c3e0: 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20  ar*sizeof(Mem), 
c3f0: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
c400: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41  yte);.    p->apA
c410: 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  rg = allocSpace(
c420: 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73  p->apArg, nArg*s
c430: 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43  izeof(Mem*), &zC
c440: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
c450: 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 20  );.    p->azVar 
c460: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
c470: 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  azVar, nVar*size
c480: 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72  of(char*), &zCsr
c490: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
c4a0: 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20  .    p->apCsr = 
c4b0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70  allocSpace(p->ap
c4c0: 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a  Csr, nCursor*siz
c4d0: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
c4e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 43 73              &zCs
c500: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
c510: 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c  ;.    p->aOnceFl
c520: 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ag = allocSpace(
c530: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f  p->aOnceFlag, nO
c540: 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  nce, &zCsr, zEnd
c550: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  , &nByte);.    i
c560: 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  f( nByte ){.    
c570: 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c    p->pFree = sql
c580: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
c590: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
c5a0: 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20 70 2d   }.    zCsr = p-
c5b0: 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64  >pFree;.    zEnd
c5c0: 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b   = &zCsr[nByte];
c5d0: 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65  .  }while( nByte
c5e0: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
c5f0: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e  ailed );..  p->n
c600: 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72  Cursor = nCursor
c610: 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67  ;.  p->nOnceFlag
c620: 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20   = nOnce;.  if( 
c630: 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70  p->aVar ){.    p
c640: 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29  ->nVar = (ynVar)
c650: 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d  nVar;.    for(n=
c660: 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b  0; n<nVar; n++){
c670: 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e  .      p->aVar[n
c680: 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ].flags = MEM_Nu
c690: 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61  ll;.      p->aVa
c6a0: 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  r[n].db = db;.  
c6b0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
c6c0: 3e 61 7a 56 61 72 20 29 7b 0a 20 20 20 20 70 2d  >azVar ){.    p-
c6d0: 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d  >nzVar = pParse-
c6e0: 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63  >nzVar;.    memc
c6f0: 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61  py(p->azVar, pPa
c700: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e  rse->azVar, p->n
c710: 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  zVar*sizeof(p->a
c720: 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d  zVar[0]));.    m
c730: 65 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a  emset(pParse->az
c740: 56 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  Var, 0, pParse->
c750: 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61  nzVar*sizeof(pPa
c760: 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b  rse->azVar[0]));
c770: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d  .  }.  if( p->aM
c780: 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65  em ){.    p->aMe
c790: 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20  m--;            
c7a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65            /* aMe
c7b0: 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e  m[] goes from 1.
c7c0: 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e  .nMem */.    p->
c7d0: 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20  nMem = nMem;    
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c7f0: 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30        not from 0
c800: 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20  ..nMem-1 */.    
c810: 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d  for(n=1; n<=nMem
c820: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; n++){.      p-
c830: 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aMem[n].flags =
c840: 20 4d 45 4d 5f 49 6e 76 61 6c 69 64 3b 0a 20 20   MEM_Invalid;.  
c850: 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64      p->aMem[n].d
c860: 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20  b = db;.    }.  
c870: 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d  }.  p->explain =
c880: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
c890: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
c8a0: 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  ewind(p);.}../*.
c8b0: 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20  ** Close a VDBE 
c8c0: 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61  cursor and relea
c8d0: 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75  se all the resou
c8e0: 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72  rces that cursor
c8f0: 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20   .** happens to 
c900: 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hold..*/.void sq
c910: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
c920: 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62  sor(Vdbe *p, Vdb
c930: 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20  eCursor *pCx){. 
c940: 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20   if( pCx==0 ){. 
c950: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
c960: 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
c970: 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70  erClose(p->db, p
c980: 43 78 29 3b 0a 20 20 69 66 28 20 70 43 78 2d 3e  Cx);.  if( pCx->
c990: 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
c9a0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
c9b0: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54  ->pBt);.    /* T
c9c0: 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20  he pCx->pCursor 
c9d0: 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75  will be close au
c9e0: 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20  tomatically, if 
c9f0: 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20  it exists, by.  
ca00: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62    ** the call ab
ca10: 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  ove. */.  }else 
ca20: 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  if( pCx->pCursor
ca30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
ca40: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
ca50: 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20  pCx->pCursor);. 
ca60: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
ca70: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
ca80: 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70  BLE.  if( pCx->p
ca90: 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20  VtabCursor ){.  
caa0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
cab0: 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
cac0: 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43  or = pCx->pVtabC
cad0: 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74  ursor;.    const
cae0: 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
caf0: 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62  *pModule = pVtab
cb00: 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 70  Cursor->pVtab->p
cb10: 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69  Module;.    p->i
cb20: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b  nVtabMethod = 1;
cb30: 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43  .    pModule->xC
cb40: 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72  lose(pVtabCursor
cb50: 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  );.    p->inVtab
cb60: 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a  Method = 0;.  }.
cb70: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
cb80: 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20  Copy the values 
cb90: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64  stored in the Vd
cba0: 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72  beFrame structur
cbb0: 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54  e to its Vdbe. T
cbc0: 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  his.** is used, 
cbd0: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
cbe0: 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d  n a trigger sub-
cbf0: 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65  program is halte
cc00: 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20  d to restore.** 
cc10: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d  control to the m
cc20: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ain program..*/.
cc30: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
cc40: 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65  rameRestore(Vdbe
cc50: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a  Frame *pFrame){.
cc60: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61    Vdbe *v = pFra
cc70: 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 6e 63  me->v;.  v->aOnc
cc80: 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e  eFlag = pFrame->
cc90: 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e  aOnceFlag;.  v->
cca0: 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61  nOnceFlag = pFra
ccb0: 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20  me->nOnceFlag;. 
ccc0: 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65   v->aOp = pFrame
ccd0: 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20  ->aOp;.  v->nOp 
cce0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20  = pFrame->nOp;. 
ccf0: 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d   v->aMem = pFram
cd00: 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d  e->aMem;.  v->nM
cd10: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65  em = pFrame->nMe
cd20: 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20  m;.  v->apCsr = 
cd30: 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20  pFrame->apCsr;. 
cd40: 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46   v->nCursor = pF
cd50: 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20  rame->nCursor;. 
cd60: 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69   v->db->lastRowi
cd70: 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  d = pFrame->last
cd80: 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61  Rowid;.  v->nCha
cd90: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  nge = pFrame->nC
cda0: 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  hange;.  return 
cdb0: 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f  pFrame->pc;.}../
cdc0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
cdd0: 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c  ursors..**.** Al
cde0: 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64  so release any d
cdf0: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65  ynamic memory he
ce00: 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20  ld by the VM in 
ce10: 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65  the Vdbe.aMem me
ce20: 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72  mory .** cell ar
ce30: 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63  ray. This is nec
ce40: 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65  essary as the me
ce50: 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20  mory cell array 
ce60: 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70  may contain.** p
ce70: 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46  ointers to VdbeF
ce80: 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68  rame objects, wh
ce90: 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20  ich may in turn 
cea0: 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
ceb0: 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73   to.** open curs
cec0: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
ced0: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  oid closeAllCurs
cee0: 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ors(Vdbe *p){.  
cef0: 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b  if( p->pFrame ){
cf00: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
cf10: 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28  pFrame;.    for(
cf20: 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
cf30: 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  ; pFrame->pParen
cf40: 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
cf50: 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
cf60: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
cf70: 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b  Restore(pFrame);
cf80: 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65  .  }.  p->pFrame
cf90: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d   = 0;.  p->nFram
cfa0: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d  e = 0;..  if( p-
cfb0: 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e  >apCsr ){.    in
cfc0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
cfd0: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
cfe0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65  i++){.      Vdbe
cff0: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
d000: 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20  apCsr[i];.      
d010: 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20  if( pC ){.      
d020: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
d030: 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a  eCursor(p, pC);.
d040: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72          p->apCsr
d050: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
d060: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
d070: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
d080: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
d090: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e  &p->aMem[1], p->
d0a0: 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69  nMem);.  }.  whi
d0b0: 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  le( p->pDelFrame
d0c0: 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d   ){.    VdbeFram
d0d0: 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65  e *pDel = p->pDe
d0e0: 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70  lFrame;.    p->p
d0f0: 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d  DelFrame = pDel-
d100: 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71  >pParent;.    sq
d110: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
d120: 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a  lete(pDel);.  }.
d130: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
d140: 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74   auxdata allocat
d150: 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65  ions made by the
d160: 20 56 4d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   VM */.  sqlite3
d170: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
d180: 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61  a(p, -1, 0);.  a
d190: 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61  ssert( p->pAuxDa
d1a0: 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ta==0 );.}../*.*
d1b0: 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56  * Clean up the V
d1c0: 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  M after executio
d1d0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
d1e0: 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d  utine will autom
d1f0: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61  atically close a
d200: 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74  ny cursors, list
d210: 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72  s, and/or.** sor
d220: 74 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c  ters that were l
d230: 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c  eft open.  It al
d240: 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76  so deletes the v
d250: 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69  alues of.** vari
d260: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61  ables in the aVa
d270: 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  r[] array..*/.st
d280: 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75  atic void Cleanu
d290: 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  p(Vdbe *p){.  sq
d2a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
d2b0: 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b;..#ifdef SQLIT
d2c0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65  E_DEBUG.  /* Exe
d2d0: 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74  cute assert() st
d2e0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
d2f0: 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65  re that the Vdbe
d300: 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20  .apCsr[] and .  
d310: 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61  ** Vdbe.aMem[] a
d320: 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61  rrays have alrea
d330: 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20  dy been cleaned 
d340: 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  up.  */.  int i;
d350: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20  .  if( p->apCsr 
d360: 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e  ) for(i=0; i<p->
d370: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73  nCursor; i++) as
d380: 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69  sert( p->apCsr[i
d390: 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  ]==0 );.  if( p-
d3a0: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72  >aMem ){.    for
d3b0: 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d  (i=1; i<=p->nMem
d3c0: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
d3d0: 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d  ->aMem[i].flags=
d3e0: 3d 4d 45 4d 5f 49 6e 76 61 6c 69 64 20 29 3b 0a  =MEM_Invalid );.
d3f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
d400: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
d410: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
d420: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
d430: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
d440: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
d450: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
d460: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
d470: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
d480: 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a  ned by this SQL.
d490: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ** statement. Th
d4a0: 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74  is is now set at
d4b0: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72   compile time, r
d4c0: 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e  ather than durin
d4d0: 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f  g.** execution o
d4e0: 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  f the vdbe progr
d4f0: 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74  am so that sqlit
d500: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
d510: 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c  ) can.** be call
d520: 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61  ed on an SQL sta
d530: 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71  tement before sq
d540: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f  lite3_step()..*/
d550: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
d560: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65  eSetNumCols(Vdbe
d570: 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c   *p, int nResCol
d580: 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f  umn){.  Mem *pCo
d590: 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  lName;.  int n;.
d5a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d5b0: 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73  p->db;..  releas
d5c0: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
d5d0: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
d5e0: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
d5f0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
d600: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
d610: 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c  );.  n = nResCol
d620: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20  umn*COLNAME_N;. 
d630: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
d640: 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e   (u16)nResColumn
d650: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20  ;.  p->aColName 
d660: 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  = pColName = (Me
d670: 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  m*)sqlite3DbMall
d680: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
d690: 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66  f(Mem)*n );.  if
d6a0: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30  ( p->aColName==0
d6b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69   ) return;.  whi
d6c0: 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20  le( n-- > 0 ){. 
d6d0: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61     pColName->fla
d6e0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
d6f0: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20     pColName->db 
d700: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f  = p->db;.    pCo
d710: 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a  lName++;.  }.}..
d720: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
d730: 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68  me of the idx'th
d740: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65   column to be re
d750: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51  turned by the SQ
d760: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
d770: 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20  zName must be a 
d780: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c  pointer to a nul
d790: 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69   terminated stri
d7a0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ng..**.** This c
d7b0: 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65  all must be made
d7c0: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
d7d0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
d7e0: 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20  umCols()..**.** 
d7f0: 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  The final parame
d800: 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20  ter, xDel, must 
d810: 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  be one of SQLITE
d820: 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45  _DYNAMIC, SQLITE
d830: 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51  _STATIC.** or SQ
d840: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20  LITE_TRANSIENT. 
d850: 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f  If it is SQLITE_
d860: 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68  DYNAMIC, then th
d870: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
d880: 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20  .** to by zName 
d890: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79  will be freed by
d8a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
d8b0: 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69   when the vdbe i
d8c0: 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a  s destroyed..*/.
d8d0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
d8e0: 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62  etColName(.  Vdb
d8f0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d910: 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66   Vdbe being conf
d920: 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  igured */.  int 
d930: 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d950: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
d960: 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f  zName applies to
d970: 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20   */.  int var,  
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d990: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
d9a0: 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63   the COLNAME_* c
d9b0: 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f  onstants */.  co
d9c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d9e0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
d9f0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
da00: 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ame */.  void (*
da10: 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20  xDel)(void*)    
da20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
da30: 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73  ory management s
da40: 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d  trategy for zNam
da50: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
da60: 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  ;.  Mem *pColNam
da70: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  e;.  assert( idx
da80: 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29  <p->nResColumn )
da90: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c  ;.  assert( var<
daa0: 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69  COLNAME_N );.  i
dab0: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
dac0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73  Failed ){.    as
dad0: 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20  sert( !zName || 
dae0: 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e  xDel!=SQLITE_DYN
daf0: 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75  AMIC );.    retu
db00: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
db10: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
db20: 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b  ->aColName!=0 );
db30: 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28  .  pColName = &(
db40: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b  p->aColName[idx+
db50: 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  var*p->nResColum
db60: 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n]);.  rc = sqli
db70: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
db80: 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
db90: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
dba0: 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65  8, xDel);.  asse
dbb0: 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e  rt( rc!=0 || !zN
dbc0: 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65  ame || (pColName
dbd0: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d  ->flags&MEM_Term
dbe0: 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )!=0 );.  return
dbf0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
dc00: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
dc10: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72  ansaction may or
dc20: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69   may not be acti
dc30: 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ve on database h
dc40: 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20  andle.** db. If 
dc50: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
dc60: 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20   active, commit 
dc70: 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  it. If there is 
dc80: 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73  a.** write-trans
dc90: 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20  action spanning 
dca0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
dcb0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
dcc0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b  s routine.** tak
dcd0: 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d  es care of the m
dce0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72  aster journal tr
dcf0: 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ickery..*/.stati
dd00: 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74  c int vdbeCommit
dd10: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
dd20: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
dd30: 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20  .  int nTrans = 
dd40: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
dd50: 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
dd60: 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d  an active write-
dd70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
dd80: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
dd90: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58  _OK;.  int needX
dda0: 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66  commit = 0;..#if
ddb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ddc0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
ddd0: 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69  * With this opti
dde0: 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53  on, sqlite3VtabS
ddf0: 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64  ync() is defined
de00: 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20   to be simply . 
de10: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f   ** SQLITE_OK so
de20: 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20   p is not used. 
de30: 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  .  */.  UNUSED_P
de40: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e  ARAMETER(p);.#en
de50: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65  dif..  /* Before
de60: 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
de70: 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78  else, call the x
de80: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
de90: 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72  for any.  ** vir
dea0: 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c  tual module tabl
deb0: 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  es written in th
dec0: 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
ded0: 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a  This has to.  **
dee0: 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
def0: 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74  determining whet
df00: 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  her a master jou
df10: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20  rnal file is .  
df20: 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20  ** required, as 
df30: 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  an xSync() callb
df40: 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61  ack may add an a
df50: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
df60: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61  .  ** to the tra
df70: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
df80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
df90: 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20  bSync(db, p);.. 
dfa0: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
dfb0: 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
dfc0: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
dfd0: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
dfe0: 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
dff0: 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
e000: 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
e010: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
e020: 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
e030: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
e040: 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
e050: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
e060: 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
e070: 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
e080: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
e090: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
e0a0: 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
e0b0: 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
e0c0: 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
e0d0: 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
e0e0: 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
e0f0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
e100: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
e110: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
e120: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
e130: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
e140: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
e150: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
e160: 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
e170: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  it = 1;.      if
e180: 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b  ( i!=1 ) nTrans+
e190: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
e1a0: 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b  BtreeEnter(pBt);
e1b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e1c0: 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76  te3PagerExclusiv
e1d0: 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72  eLock(sqlite3Btr
e1e0: 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20  eePager(pBt));. 
e1f0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e200: 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20  eLeave(pBt);.   
e210: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21   }.  }.  if( rc!
e220: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e230: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
e240: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
e250: 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72  are any write-tr
e260: 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c  ansactions at al
e270: 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  l, invoke the co
e280: 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69  mmit hook */.  i
e290: 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26  f( needXcommit &
e2a0: 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  & db->xCommitCal
e2b0: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20  lback ){.    rc 
e2c0: 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  = db->xCommitCal
e2d0: 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69  lback(db->pCommi
e2e0: 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72  tArg);.    if( r
e2f0: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
e300: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
e310: 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a  INT_COMMITHOOK;.
e320: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e330: 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
e340: 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
e350: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
e360: 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
e370: 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
e380: 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
e390: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
e3a0: 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
e3b0: 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
e3c0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
e3d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
e3e0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
e3f0: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
e400: 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
e410: 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
e420: 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
e430: 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
e440: 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
e450: 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e   or a temp file.
e460: 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20    In .  ** that 
e470: 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73  case we do not s
e480: 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
e490: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
e4a0: 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20  , so use the .  
e4b0: 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74  ** simple case t
e4c0: 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  hen too..  */.  
e4d0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
e4e0: 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74  rlen30(sqlite3Bt
e4f0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
e500: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a  b->aDb[0].pBt)).
e510: 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a     || nTrans<=1.
e520: 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30    ){.    for(i=0
e530: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
e540: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
e550: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
e560: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
e570: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
e580: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
e590: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
e5a0: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
e5b0: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
e5c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
e5d0: 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c  o the commit onl
e5e0: 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73  y if all databas
e5f0: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  es successfully 
e600: 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31  complete phase 1
e610: 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65  . .    ** If one
e620: 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d   of the BtreeCom
e630: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
e640: 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20  lls fails, this 
e650: 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20  indicates an.   
e660: 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69   ** IO error whi
e670: 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  le deleting or t
e680: 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72  runcating a jour
e690: 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20  nal file. It is 
e6a0: 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a  unlikely,.    **
e6b0: 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65   but could happe
e6c0: 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  n. In this case 
e6d0: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
e6e0: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
e6f0: 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  e error..    */.
e700: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
e710: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
e720: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
e730: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
e740: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
e750: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
e760: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
e770: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
e780: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20  itPhaseTwo(pBt, 
e790: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
e7a0: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
e7b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e7c0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
e7d0: 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  it(db);.    }.  
e7e0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  }..  /* The comp
e7f0: 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65  lex case - There
e800: 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   is a multi-file
e810: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
e820: 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20  on active..  ** 
e830: 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20  This requires a 
e840: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e850: 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ile to ensure th
e860: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
e870: 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20  .  ** committed 
e880: 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23  atomicly..  */.#
e890: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e8a0: 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65  IT_DISKIO.  else
e8b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
e8c0: 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56  s *pVfs = db->pV
e8d0: 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64  fs;.    int need
e8e0: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68  Sync = 0;.    ch
e8f0: 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
e900: 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20     /* File-name 
e910: 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a  for the master j
e920: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68  ournal */.    ch
e930: 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46  ar const *zMainF
e940: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
e950: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
e960: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
e970: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
e980: 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  *pMaster = 0;.  
e990: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
e9a0: 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  ;.    int res;. 
e9b0: 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e     int retryCoun
e9c0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  t = 0;.    int n
e9d0: 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f  MainFile;..    /
e9e0: 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65  * Select a maste
e9f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
ea00: 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e  ame */.    nMain
ea10: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74  File = sqlite3St
ea20: 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65  rlen30(zMainFile
ea30: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
ea40: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
ea50: 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58  db, "%s-mjXXXXXX
ea60: 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65  9XXz", zMainFile
ea70: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74  );.    if( zMast
ea80: 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  er==0 ) return S
ea90: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
eaa0: 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20   do {.      u32 
eab0: 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69  iRandom;.      i
eac0: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b  f( retryCount ){
ead0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74  .        if( ret
eae0: 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20  ryCount>100 ){. 
eaf0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
eb00: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c  _log(SQLITE_FULL
eb10: 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73  , "MJ delete: %s
eb20: 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ", zMaster);.   
eb30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
eb40: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
eb50: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
eb60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
eb70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74     }else if( ret
eb80: 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20  ryCount==1 ){.  
eb90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
eba0: 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  log(SQLITE_FULL,
ebb0: 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73   "MJ collide: %s
ebc0: 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ", zMaster);.   
ebd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ebe0: 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b       retryCount+
ebf0: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
ec00: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
ec10: 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52  of(iRandom), &iR
ec20: 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71  andom);.      sq
ec30: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
ec40: 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69  3, &zMaster[nMai
ec50: 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58  nFile], "-mj%06X
ec60: 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20  9%02X",.        
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e         (iRandom>
ec90: 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20 69 52  >8)&0xffffff, iR
eca0: 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20  andom&0xff);.   
ecb0: 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65     /* The antipe
ecc0: 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63  nultimate charac
ecd0: 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65  ter of the maste
ece0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
ecf0: 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  ust.      ** be 
ed00: 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d  "9" to avoid nam
ed10: 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65  e collisions whe
ed20: 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65  n using 8+3 file
ed30: 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  names. */.      
ed40: 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b  assert( zMaster[
ed50: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
ed60: 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27  zMaster)-3]=='9'
ed70: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
ed80: 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61  3FileSuffix3(zMa
ed90: 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29  inFile, zMaster)
eda0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
edb0: 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
edc0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
edd0: 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
ede0: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68  , &res);.    }wh
edf0: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
ee00: 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20  OK && res );.   
ee10: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ee20: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  OK ){.      /* O
ee30: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
ee40: 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20  ournal. */.     
ee50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
ee60: 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20  penMalloc(pVfs, 
ee70: 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65  zMaster, &pMaste
ee80: 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51  r, .          SQ
ee90: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
eea0: 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
eeb0: 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20  CREATE|.        
eec0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
eed0: 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f  CLUSIVE|SQLITE_O
eee0: 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
eef0: 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  AL, 0.      );. 
ef00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
ef10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ef20: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
ef30: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
ef40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
ef50: 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
ef60: 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
ef70: 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  f each database 
ef80: 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e  file in the tran
ef90: 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  saction into the
efa0: 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74   new.    ** mast
efb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
efc0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
efd0: 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
efe0: 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61  t close.    ** a
eff0: 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  nd delete the ma
f000: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f010: 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76  e. All the indiv
f020: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
f030: 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c  les.    ** still
f040: 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20   have 'null' as 
f050: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f060: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74  al pointer, so t
f070: 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20  hey will roll.  
f080: 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65    ** back indepe
f090: 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69  ndently if a fai
f0a0: 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20  lure occurs..   
f0b0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
f0c0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
f0d0: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
f0e0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
f0f0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  pBt;.      if( s
f100: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
f110: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
f120: 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20       char const 
f130: 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *zFile = sqlite3
f140: 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
f150: 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ame(pBt);.      
f160: 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29    if( zFile==0 )
f170: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
f180: 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  inue;  /* Ignore
f190: 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72   TEMP and :memor
f1a0: 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  y: databases */.
f1b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f1c0: 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b    assert( zFile[
f1d0: 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  0]!=0 );.       
f1e0: 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26   if( !needSync &
f1f0: 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53  & !sqlite3BtreeS
f200: 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29  yncDisabled(pBt)
f210: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
f220: 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
f230: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
f240: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f250: 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65  e(pMaster, zFile
f260: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
f270: 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73  0(zFile)+1, offs
f280: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  et);.        off
f290: 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  set += sqlite3St
f2a0: 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b  rlen30(zFile)+1;
f2b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
f2c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f2d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
f2e0: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
f2f0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
f300: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
f310: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
f320: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
f330: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
f340: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
f350: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
f360: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f370: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
f380: 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  c the master jou
f390: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
f3a0: 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  e IOCAP_SEQUENTI
f3b0: 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a  AL device.    **
f3c0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69   flag is set thi
f3d0: 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
f3e0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
f3f0: 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20  ( needSync .    
f400: 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f   && 0==(sqlite3O
f410: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
f420: 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26  istics(pMaster)&
f430: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
f440: 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26  UENTIAL).     &&
f450: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
f460: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
f470: 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  pMaster, SQLITE_
f480: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20  SYNC_NORMAL)).  
f490: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
f4a0: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
f4b0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
f4c0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
f4d0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
f4e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
f4f0: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
f500: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f510: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
f520: 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64  * Sync all the d
f530: 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64  b files involved
f540: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
f550: 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61  ion. The same ca
f560: 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74  ll.    ** sets t
f570: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
f580: 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63  l pointer in eac
f590: 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  h individual jou
f5a0: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20  rnal. If.    ** 
f5b0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
f5c0: 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c  here, do not del
f5d0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
f5e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
f5f0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
f600: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  e error occurs d
f610: 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  uring the first 
f620: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
f630: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
f640: 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65  tPhaseOne(), the
f650: 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61  n there is a cha
f660: 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  nce that the.   
f670: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
f680: 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  al file will be 
f690: 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65  orphaned. But we
f6a0: 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69   cannot delete i
f6b0: 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73  t,.    ** in cas
f6c0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
f6d0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77  rnal file name w
f6e0: 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
f6f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
f700: 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
f710: 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  he failure occur
f720: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
f730: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
f740: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
f750: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
f760: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
f770: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
f780: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
f790: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
f7a0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
f7b0: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61  haseOne(pBt, zMa
f7c0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ster);.      }. 
f7d0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f7e0: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
f7f0: 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
f800: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
f810: 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Y );.    if( rc!
f820: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f830: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
f840: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
f850: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f860: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
f870: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
f880: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
f890: 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20  his commits the 
f8a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74  transaction. Aft
f8b0: 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  er.    ** doing 
f8c0: 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f  this the directo
f8d0: 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61  ry is synced aga
f8e0: 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e  in before any in
f8f0: 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20  dividual.    ** 
f900: 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65  transaction file
f910: 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20  s are deleted.. 
f920: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
f930: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
f940: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29  Vfs, zMaster, 1)
f950: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
f960: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
f970: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
f980: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  0;.    if( rc ){
f990: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f9a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
f9b0: 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69  All files and di
f9c0: 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61  rectories have a
f9d0: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
f9e0: 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  ed, so the follo
f9f0: 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  wing.    ** call
fa00: 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
fa10: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
fa20: 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69  ) are only closi
fa30: 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20  ng files and.   
fa40: 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20   ** deleting or 
fa50: 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e  truncating journ
fa60: 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e  als. If somethin
fa70: 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69  g goes wrong whi
fa80: 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
fa90: 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64  s happening we d
faa0: 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65  on't really care
fab0: 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20  . The integrity 
fac0: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  of the.    ** tr
fad0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
fae0: 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c  eady guaranteed,
faf0: 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20   but some stray 
fb00: 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a  'cold' journals.
fb10: 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79      ** may be ly
fb20: 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75  ing around. Retu
fb30: 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
fb40: 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d  ode won't help m
fb50: 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  atters..    */. 
fb60: 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
fb70: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
fb80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
fb90: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
fba0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
fbb0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
fbc0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
fbd0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
fbe0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
fbf0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
fc00: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
fc10: 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b  haseTwo(pBt, 1);
fc20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fc30: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
fc40: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
fc50: 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
fc60: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a  d_io_errors();..
fc70: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
fc80: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  ommit(db);.  }.#
fc90: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
fca0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  rc;.}../* .** Th
fcb0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
fcc0: 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  s that the sqlit
fcd0: 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63  e3.nVdbeActive c
fce0: 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a  ount variable.**
fcf0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d   matches the num
fd00: 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e  ber of vdbe's in
fd10: 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65   the list sqlite
fd20: 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65  3.pVdbe that are
fd30: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63  .** currently ac
fd40: 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69  tive. An asserti
fd50: 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20  on fails if the 
fd60: 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f  two counts do no
fd70: 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73  t match..** This
fd80: 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
fd90: 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20  self-check only 
fda0: 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65  - it is not an e
fdb0: 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73  ssential process
fdc0: 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a  ing.** step..**.
fdd0: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  ** This is a no-
fde0: 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  op if NDEBUG is 
fdf0: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  defined..*/.#ifn
fe00: 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
fe10: 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69  c void checkActi
fe20: 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65  veVdbeCnt(sqlite
fe30: 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
fe40: 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  p;.  int cnt = 0
fe50: 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d  ;.  int nWrite =
fe60: 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20   0;.  int nRead 
fe70: 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70  = 0;.  p = db->p
fe80: 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  Vdbe;.  while( p
fe90: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d   ){.    if( p->m
fea0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
feb0: 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30  _RUN && p->pc>=0
fec0: 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
fed0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65  .      if( p->re
fee0: 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69  adOnly==0 ) nWri
fef0: 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  te++;.      if( 
ff00: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e  p->bIsReader ) n
ff10: 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Read++;.    }.  
ff20: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
ff30: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e    }.  assert( cn
ff40: 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t==db->nVdbeActi
ff50: 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ve );.  assert( 
ff60: 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62  nWrite==db->nVdb
ff70: 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65  eWrite );.  asse
ff80: 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e  rt( nRead==db->n
ff90: 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65  VdbeRead );.}.#e
ffa0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63  lse.#define chec
ffb0: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78  kActiveVdbeCnt(x
ffc0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
ffd0: 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73  If the Vdbe pass
ffe0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
fff0: 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20  argument opened 
10000 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  a statement-tran
10010 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73  saction,.** clos
10020 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65  e it now. Argume
10030 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65  nt eOp must be e
10040 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f  ither SAVEPOINT_
10050 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53  ROLLBACK or.** S
10060 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
10070 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
10080 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
10090 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hen the statemen
100a0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
100b0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
100c0 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50   If eOp is SAVEP
100d0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68  OINT_RELEASE, th
100e0 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65  en the .** state
100f0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
10100 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
10110 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
10120 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
10130 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
10140 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
10150 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
10160 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
10170 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
10180 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
10190 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65  t(Vdbe *p, int e
101a0 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Op){.  sqlite3 *
101b0 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62  const db = p->db
101c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
101d0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
101e0 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69   p->iStatement i
101f0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
10200 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56  ero, then this V
10210 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20  dbe opened a .  
10220 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
10230 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68  nsaction that sh
10240 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68  ould be closed h
10250 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78  ere. The only ex
10260 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  ception.  ** is 
10270 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72  that an IO error
10280 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 72   may have occurr
10290 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65  ed, causing an e
102a0 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63  mergency rollbac
102b0 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  k..  ** In this 
102c0 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65  case (db->nState
102d0 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68  ment==0), and th
102e0 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
102f0 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o do..  */.  if(
10300 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
10310 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  && p->iStatement
10320 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
10330 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61     const int iSa
10340 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74  vepoint = p->iSt
10350 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20  atement-1;..    
10360 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56  assert( eOp==SAV
10370 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
10380 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  || eOp==SAVEPOIN
10390 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20  T_RELEASE);.    
103a0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
103b0 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20  tement>0 );.    
103c0 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74  assert( p->iStat
103d0 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61  ement==(db->nSta
103e0 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65  tement+db->nSave
103f0 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66  point) );..    f
10400 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
10410 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
10420 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
10430 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65  _OK;.      Btree
10440 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
10450 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
10460 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
10470 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
10480 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
10490 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
104a0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
104b0 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
104c0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
104d0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
104e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
104f0 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
10500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
10510 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
10520 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
10530 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
10540 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
10550 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10560 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10570 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
10580 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
10590 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
105a0 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65  }.    db->nState
105b0 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69  ment--;.    p->i
105c0 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a  Statement = 0;..
105d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
105e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
105f0 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
10600 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
10610 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10620 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
10630 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  db, SAVEPOINT_RO
10640 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
10650 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
10660 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10670 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10680 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
10690 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
106a0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
106b0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
106c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
106d0 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
106e0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
106f0 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
10700 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74   back, also rest
10710 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ore the .    ** 
10720 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
10730 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
10740 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20  aint counter to 
10750 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64  the value it had
10760 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   when .    ** th
10770 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
10780 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
10790 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
107a0 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
107b0 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
107c0 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
107d0 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66  ns = p->nStmtDef
107e0 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e  Cons;.      db->
107f0 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
10800 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d   = p->nStmtDefIm
10810 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  mCons;.    }.  }
10820 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10830 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
10840 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
10850 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
10860 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  n opened by the 
10870 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e  database .** han
10880 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  dle associated w
10890 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65  ith the VM passe
108a0 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
108b0 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
108c0 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49  .** committed. I
108d0 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
108e0 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64  tanding deferred
108f0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
10900 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61  straint.** viola
10910 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51  tions, return SQ
10920 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65  LITE_ERROR. Othe
10930 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
10940 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
10950 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
10960 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61   FK violations a
10970 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
10980 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
10990 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74  ITE_ERROR, set t
109a0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
109b0 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f   VM to SQLITE_CO
109c0 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
109d0 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  KEY.** and write
109e0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
109f0 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65  e to it. Then re
10a00 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
10a10 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  R..*/.#ifndef SQ
10a20 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
10a30 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65  N_KEY.int sqlite
10a40 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62  3VdbeCheckFk(Vdb
10a50 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72  e *p, int deferr
10a60 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ed){.  sqlite3 *
10a70 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
10a80 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20 28  ( (deferred && (
10a90 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
10aa0 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49  s+db->nDeferredI
10ab0 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c  mmCons)>0) .   |
10ac0 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20  | (!deferred && 
10ad0 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
10ae0 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d  >0) .  ){.    p-
10af0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e  >rc = SQLITE_CON
10b00 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
10b10 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72  EY;.    p->error
10b20 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
10b30 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  t;.    sqlite3Se
10b40 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
10b50 4d 73 67 2c 20 64 62 2c 20 22 46 4f 52 45 49 47  Msg, db, "FOREIG
10b60 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
10b70 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72   failed");.    r
10b80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
10b90 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
10ba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
10bb0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
10bc0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
10bd0 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
10be0 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
10bf0 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
10c00 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
10c10 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
10c20 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
10c30 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
10c40 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
10c50 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
10c60 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
10c70 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
10c80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10c90 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
10ca0 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
10cb0 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
10cc0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
10cd0 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
10ce0 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
10cf0 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
10d00 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
10d10 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
10d20 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
10d30 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
10d40 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
10d50 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
10d60 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
10d70 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
10d80 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
10d90 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
10da0 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
10db0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
10dc0 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
10dd0 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
10de0 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
10df0 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
10e00 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
10e10 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
10e20 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
10e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e40 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
10e50 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65  to store transie
10e60 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  nt return codes 
10e70 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
10e80 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
10e90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
10ea0 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
10eb0 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
10ec0 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
10ed0 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
10ee0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
10ef0 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
10f00 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
10f10 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
10f20 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
10f30 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
10f40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
10f50 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
10f60 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
10f70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
10f80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
10f90 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
10fa0 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
10fb0 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
10fc0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
10fd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
10fe0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
10ff0 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
11000 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
11010 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
11020 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
11030 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
11040 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
11050 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
11060 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
11070 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
11080 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
11090 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
110a0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
110b0 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62   */..  if( p->db
110c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
110d0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
110e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
110f0 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c    if( p->aOnceFl
11100 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61  ag ) memset(p->a
11110 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e  OnceFlag, 0, p->
11120 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c  nOnceFlag);.  cl
11130 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29  oseAllCursors(p)
11140 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
11150 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
11160 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11170 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
11180 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
11190 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  nt(db);..  /* No
111a0 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
111b0 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68  ack needed if th
111c0 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20  e program never 
111d0 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74 68  started or if th
111e0 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  e.  ** SQL state
111f0 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  ment does not re
11200 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64 61  ad or write a da
11210 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f  tabase file.  */
11220 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
11230 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  && p->bIsReader 
11240 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20  ){.    int mrc; 
11250 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72    /* Primary err
11260 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e  or code from p->
11270 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53  rc */.    int eS
11280 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a  tatementOp = 0;.
11290 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61      int isSpecia
112a0 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
112b0 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
112c0 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27  e if a 'special'
112d0 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f   error */..    /
112e0 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65  * Lock all btree
112f0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74  s used by the st
11300 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73  atement */.    s
11310 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
11320 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  p);..    /* Chec
11330 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  k for one of the
11340 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
11350 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
11360 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61  rc & 0xff;.    a
11370 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
11380 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
11390 45 44 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 65  ED );  /* This e
113a0 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 65  rror no longer e
113b0 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 73 53  xists */.    isS
113c0 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72  pecialError = mr
113d0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
113e0 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
113f0 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20  OERR.           
11400 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63            || mrc
11410 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  ==SQLITE_INTERRU
11420 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  PT || mrc==SQLIT
11430 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20  E_FULL;.    if( 
11440 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29  isSpecialError )
11450 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
11460 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64  e query was read
11470 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72  -only and the er
11480 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
11490 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20  TE_INTERRUPT, . 
114a0 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62       ** no rollb
114b0 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79  ack is necessary
114c0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20  . Otherwise, at 
114d0 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e  least a savepoin
114e0 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  t .      ** tran
114f0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
11500 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72  rolled back to r
11510 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
11520 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20  ase to a .      
11530 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74  ** consistent st
11540 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ate..      **.  
11550 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74      ** Even if t
11560 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
11570 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73  read-only, it is
11580 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65   important to pe
11590 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61  rform.      ** a
115a0 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72   statement or tr
115b0 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
115c0 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66  ck operation. If
115d0 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20   the error .    
115e0 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20 77 68    ** occurred wh
115f0 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ile writing to t
11600 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d  he journal, sub-
11610 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62  journal or datab
11620 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  ase.      ** fil
11630 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  e as part of an 
11640 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75  effort to free u
11650 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28 73  p cache space (s
11660 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  ee function.    
11670 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73    ** pagerStress
11680 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20  () in pager.c), 
11690 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  the rollback is 
116a0 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73 74  required to rest
116b0 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ore .      ** th
116c0 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e  e pager to a con
116d0 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
116e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
116f0 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c  ( !p->readOnly |
11700 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e  | mrc!=SQLITE_IN
11710 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20  TERRUPT ){.     
11720 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c     if( (mrc==SQL
11730 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
11740 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26  ==SQLITE_FULL) &
11750 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  & p->usesStmtJou
11760 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  rnal ){.        
11770 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
11780 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
11790 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ACK;.        }el
117a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
117b0 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74   We are forced t
117c0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20  o roll back the 
117d0 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
117e0 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  on. Before doing
117f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
11800 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65  , abort any othe
11810 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69  r statements thi
11820 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74  s handle current
11830 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20  ly has active.. 
11840 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
11850 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
11860 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
11870 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
11880 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  CK);.          s
11890 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
118a0 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
118b0 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
118c0 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
118d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
118e0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
118f0 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  or immediate for
11900 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69  eign key violati
11910 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ons. */.    if( 
11920 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
11930 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11940 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
11950 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  0);.    }.  .   
11960 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
11970 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
11980 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74  et and this is t
11990 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77  he only active w
119a0 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d  riter .    ** VM
119b0 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74  , then we do eit
119c0 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20  her a commit or 
119d0 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20  rollback of the 
119e0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
119f0 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion. .    **.   
11a00 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62   ** Note: This b
11a10 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69  lock also runs i
11a20 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  f one of the spe
11a30 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64  cial errors hand
11a40 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76  led .    ** abov
11a50 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  e has occurred. 
11a60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11a70 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79  !sqlite3VtabInSy
11a80 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20  nc(db) .     && 
11a90 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a  db->autoCommit .
11aa0 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62       && db->nVdb
11ab0 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64  eWrite==(p->read
11ac0 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b  Only==0) .    ){
11ad0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
11ae0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
11af0 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
11b00 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70  OE_Fail && !isSp
11b10 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20  ecialError) ){. 
11b20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11b30 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
11b40 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
11b50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11b60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
11b70 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e   NEVER(p->readOn
11b80 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ly) ){.         
11b90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
11ba0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
11bb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11bc0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
11bd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
11be0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
11bf0 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
11c00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11c10 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   .          /* T
11c20 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
11c30 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
11c40 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61   vdbe program wa
11c50 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20  s successful .  
11c60 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69          ** or hi
11c70 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63  t an 'OR FAIL' c
11c80 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
11c90 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72  ere are no defer
11ca0 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20  red foreign.    
11cb0 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e        ** key con
11cc0 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64  straints to hold
11cd0 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
11ce0 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
11cf0 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20  a commit .      
11d00 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
11d10 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
11d20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74   rc = vdbeCommit
11d30 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
11d40 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
11d50 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
11d60 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  & p->readOnly ){
11d70 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11d80 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
11d90 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11da0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
11db0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11dc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11dd0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
11de0 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
11df0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
11e00 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
11e10 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  K);.        }els
11e20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  e{.          db-
11e30 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
11e40 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
11e50 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
11e60 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
11e70 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
11e80 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b  SQLITE_DeferFKs;
11e90 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11ea0 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
11eb0 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
11ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
11ed0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
11ee0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
11ef0 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
11f00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d       }.      db-
11f10 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
11f20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
11f30 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29  StatementOp==0 )
11f40 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
11f50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
11f60 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
11f70 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
11f80 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
11f90 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  = SAVEPOINT_RELE
11fa0 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ASE;.      }else
11fb0 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74   if( p->errorAct
11fc0 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ion==OE_Abort ){
11fd0 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
11fe0 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
11ff0 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
12000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12010 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
12020 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
12030 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
12040 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
12050 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
12060 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
12070 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
12080 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12090 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74  .    /* If eStat
120a0 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a  ementOp is non-z
120b0 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74  ero, then a stat
120c0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
120d0 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  n needs to.    *
120e0 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  * be committed o
120f0 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43  r rolled back. C
12100 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43  all sqlite3VdbeC
12110 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20  loseStatement() 
12120 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e  to.    ** do so.
12130 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   If this operati
12140 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
12150 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72  ror, and the cur
12160 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  rent statement. 
12170 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65     ** error code
12180 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72   is SQLITE_OK or
12190 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
121a0 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65  NT, then promote
121b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
121c0 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72  ent statement er
121d0 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f  ror code..    */
121e0 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d  .    if( eStatem
121f0 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72  entOp ){.      r
12200 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
12210 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
12220 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a   eStatementOp);.
12230 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
12240 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
12250 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
12260 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51  (p->rc&0xff)==SQ
12270 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
12280 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
12290 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
122a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
122b0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
122c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a  ;.          p->z
122d0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
122e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
122f0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
12300 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
12310 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
12320 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
12330 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
12340 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
12350 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
12360 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
12370 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
12380 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   an INSERT, UPDA
12390 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64  TE or DELETE and
123a0 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
123b0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ansaction.    **
123c0 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64   has been rolled
123d0 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68   back, update th
123e0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
123f0 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75  ction change-cou
12400 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  nter. .    */.  
12410 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43    if( p->changeC
12420 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  ntOn ){.      if
12430 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d  ( eStatementOp!=
12440 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
12450 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CK ){.        sq
12460 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
12470 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
12480 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ge);.      }else
12490 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
124a0 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
124b0 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  db, 0);.      }.
124c0 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
124d0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
124e0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
124f0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
12500 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
12510 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  ;.  }..  /* We h
12520 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
12530 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
12540 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
12550 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
12560 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
12570 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65  ){.    db->nVdbe
12580 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66  Active--;.    if
12590 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ( !p->readOnly )
125a0 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d   db->nVdbeWrite-
125b0 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49  -;.    if( p->bI
125c0 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56  sReader ) db->nV
125d0 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61  dbeRead--;.    a
125e0 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
125f0 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62  Active>=db->nVdb
12600 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73  eRead );.    ass
12610 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65  ert( db->nVdbeRe
12620 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69  ad>=db->nVdbeWri
12630 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  te );.    assert
12640 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ( db->nVdbeWrite
12650 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  >=0 );.  }.  p->
12660 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
12670 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b  IC_HALT;.  check
12680 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
12690 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
126a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
126b0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
126c0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
126d0 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
126e0 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
126f0 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e  et to true, then
12700 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20   any locks that 
12710 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62  were held.  ** b
12720 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  y connection db 
12730 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
12740 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c  leased. Call sql
12750 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
12760 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74  locked() .  ** t
12770 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71  o invoke any req
12780 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  uired unlock-not
12790 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
127a0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75   */.  if( db->au
127b0 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
127c0 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
127d0 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20  nUnlocked(db);. 
127e0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62   }..  assert( db
127f0 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20  ->nVdbeActive>0 
12800 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  || db->autoCommi
12810 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61  t==0 || db->nSta
12820 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72  tement==0 );.  r
12830 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51  eturn (p->rc==SQ
12840 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49  LITE_BUSY ? SQLI
12850 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45  TE_BUSY : SQLITE
12860 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  _OK);.}.../*.** 
12870 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20  Each VDBE holds 
12880 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
12890 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  e most recent sq
128a0 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c  lite3_step() cal
128b0 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20  l.** in p->rc.  
128c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
128d0 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61  s that result ba
128e0 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e  ck to SQLITE_OK.
128f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12900 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73  VdbeResetStepRes
12910 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ult(Vdbe *p){.  
12920 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
12930 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  K;.}../*.** Copy
12940 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
12950 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
12960 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  e belonging to t
12970 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a  he VDBE passed.*
12980 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
12990 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64  rgument to its d
129a0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28  atabase handle (
129b0 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c  so that they wil
129c0 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65  l be .** returne
129d0 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71  d by calls to sq
129e0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20  lite3_errcode() 
129f0 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  and sqlite3_errm
12a00 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  sg())..**.** Thi
12a10 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
12a20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56 44  not clear the VD
12a30 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72  BE error code or
12a40 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a   message, just.*
12a50 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f  * copies them to
12a60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
12a70 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
12a80 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
12a90 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a  Error(Vdbe *p){.
12aa0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
12ab0 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
12ac0 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70  = p->rc;.  if( p
12ad0 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
12ae0 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64   u8 mallocFailed
12af0 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69   = db->mallocFai
12b00 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  led;.    sqlite3
12b10 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
12b20 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  c();.    if( db-
12b30 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70  >pErr==0 ) db->p
12b40 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Err = sqlite3Val
12b50 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73  ueNew(db);.    s
12b60 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
12b70 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
12b80 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
12b90 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
12ba0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
12bb0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
12bc0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62  Malloc();.    db
12bd0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
12be0 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20   mallocFailed;. 
12bf0 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d     db->errCode =
12c00 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   rc;.  }else{.  
12c10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
12c20 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20  b, rc, 0);.  }. 
12c30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
12c40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
12c50 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a  BLE_SQLLOG./*.**
12c60 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f   If an SQLITE_CO
12c70 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b  NFIG_SQLLOG hook
12c80 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61   is registered a
12c90 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65  nd the VM has be
12ca0 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f  en run, .** invo
12cb0 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ke it..*/.static
12cc0 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65   void vdbeInvoke
12cd0 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b  Sqllog(Vdbe *v){
12ce0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
12cf0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
12d00 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c  og && v->rc==SQL
12d10 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71  ITE_OK && v->zSq
12d20 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b  l && v->pc>=0 ){
12d30 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61  .    char *zExpa
12d40 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64  nded = sqlite3Vd
12d50 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76  beExpandSql(v, v
12d60 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73  ->zSql);.    ass
12d70 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74  ert( v->db->init
12d80 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20  .busy==0 );.    
12d90 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b  if( zExpanded ){
12da0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
12db0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
12dc0 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20 73 71  og(.          sq
12dd0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
12de0 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d  g.pSqllogArg, v-
12df0 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20  >db, zExpanded, 
12e00 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  1.      );.     
12e10 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76   sqlite3DbFree(v
12e20 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29  ->db, zExpanded)
12e30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
12e40 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62  lse.# define vdb
12e50 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29  eInvokeSqllog(x)
12e60 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
12e70 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
12e80 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
12e90 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
12ea0 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
12eb0 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
12ec0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
12ed0 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
12ee0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
12ef0 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
12f00 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
12f10 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
12f20 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
12f30 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
12f40 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
12f50 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
12f60 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
12f70 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
12f80 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
12f90 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
12fa0 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
12fb0 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
12fc0 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
12fd0 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
12fe0 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
12ff0 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
13000 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
13010 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20  te3 *db;.  db = 
13020 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->db;..  /* If 
13030 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
13040 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
13050 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
13060 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
13070 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
13080 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
13090 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
130a0 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
130b0 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73  it now..  */.  s
130c0 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
130d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
130e0 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20  VDBE has be run 
130f0 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20  even partially, 
13100 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
13110 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  e error code.  *
13120 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  * and error mess
13130 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42  age from the VDB
13140 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  E into the main 
13150 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
13160 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66  re.  But.  ** if
13170 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75   the VDBE has ju
13180 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72  st been set to r
13190 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61  un but has not a
131a0 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64  ctually executed
131b0 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75   any.  ** instru
131c0 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76  ctions yet, leav
131d0 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  e the main datab
131e0 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d  ase error inform
131f0 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
13200 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
13210 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65  c>=0 ){.    vdbe
13220 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b  InvokeSqllog(p);
13230 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13240 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29  TransferError(p)
13250 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
13260 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
13270 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
13280 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Msg = 0;.    if(
13290 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
132a0 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31  ) p->expired = 1
132b0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
132c0 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65  >rc && p->expire
132d0 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  d ){.    /* The 
132e0 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73  expired flag was
132f0 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45   set on the VDBE
13300 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
13310 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
13320 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
13330 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79   For consistency
13340 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f   (since sqlite3_
13350 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a  step() was.    *
13360 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74  * called), set t
13370 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  he database erro
13380 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  r in this case a
13390 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  s well..    */. 
133a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
133b0 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45  db, p->rc, p->zE
133c0 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30  rrMsg ? "%s" : 0
133d0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
133e0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
133f0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
13400 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
13410 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
13420 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f  Reclaim all memo
13430 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56  ry used by the V
13440 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e  DBE.  */.  Clean
13450 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76  up(p);..  /* Sav
13460 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f  e profiling info
13470 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69  rmation from thi
13480 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f  s VDBE run..  */
13490 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
134a0 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c  FILE.  {.    FIL
134b0 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22  E *out = fopen("
134c0 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74  vdbe_profile.out
134d0 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28  ", "a");.    if(
134e0 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e   out ){.      in
134f0 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  t i;.      fprin
13500 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29  tf(out, "---- ")
13510 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
13520 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
13530 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
13540 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d  (out, "%02x", p-
13550 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b  >aOp[i].opcode);
13560 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
13570 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
13580 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
13590 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
135a0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
135b0 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c  f(out, "%6d %10l
135c0 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20  ld %8lld ",.    
135d0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
135e0 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  .cnt,.          
135f0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
13600 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  s,.           p-
13610 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20  >aOp[i].cnt>0 ? 
13620 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
13630 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a  /p->aOp[i].cnt :
13640 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   0.        );.  
13650 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13660 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c  ePrintOp(out, i,
13670 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
13680 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f      }.      fclo
13690 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  se(out);.    }. 
136a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69   }.#endif.  p->i
136b0 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b  CurrentTime = 0;
136c0 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
136d0 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
136e0 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20   return p->rc & 
136f0 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20  db->errMask;.}. 
13700 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
13710 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
13720 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
13730 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
13740 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
13750 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
13760 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
13770 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
13780 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
13790 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
137a0 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
137b0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
137c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
137d0 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
137e0 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d  _MAGIC_RUN || p-
137f0 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
13800 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72  IC_HALT ){.    r
13810 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
13820 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73  eset(p);.    ass
13830 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62  ert( (rc & p->db
13840 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29  ->errMask)==rc )
13850 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
13860 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  dbeDelete(p);.  
13870 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13880 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
13890 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61   iOp is less tha
138a0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76  n zero, then inv
138b0 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
138c0 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75  or for.** all au
138d0 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69  xiliary data poi
138e0 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20  nters currently 
138f0 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d  cached by the VM
13900 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68   passed as.** th
13910 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
13920 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69  ..**.** Or, if i
13930 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68  Op is greater th
13940 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
13950 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65  ero, then the de
13960 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f  structor is.** o
13970 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20  nly invoked for 
13980 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20  those auxiliary 
13990 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72  data pointers cr
139a0 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65  eated by the use
139b0 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  r .** function i
139c0 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50  nvoked by the OP
139d0 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65  _Function opcode
139e0 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   at instruction 
139f0 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56  iOp of .** VM pV
13a00 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68  dbe, and only th
13a10 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  en if:.**.**    
13a20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  * the associated
13a30 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
13a40 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20  ter is the 32nd 
13a50 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69  or later (counti
13a60 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ng.**      from 
13a70 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20  left to right), 
13a80 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  or.**.**    * th
13a90 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
13aa0 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20  bit in argument 
13ab0 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77  mask is clear (w
13ac0 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  here the first.*
13ad0 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20  *      function 
13ae0 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 73 70  parameter corrsp
13af0 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74  onds to bit 0 et
13b00 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c.)..*/.void sql
13b10 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
13b20 78 44 61 74 61 28 56 64 62 65 20 2a 70 56 64 62  xData(Vdbe *pVdb
13b30 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20  e, int iOp, int 
13b40 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44 61 74 61  mask){.  AuxData
13b50 20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65 2d 3e   **pp = &pVdbe->
13b60 70 41 75 78 44 61 74 61 3b 0a 20 20 77 68 69 6c  pAuxData;.  whil
13b70 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75  e( *pp ){.    Au
13b80 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70  xData *pAux = *p
13b90 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c  p;.    if( (iOp<
13ba0 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78  0).     || (pAux
13bb0 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70  ->iOp==iOp && (p
13bc0 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20  Aux->iArg>31 || 
13bd0 21 28 6d 61 73 6b 20 26 20 28 28 75 33 32 29 31  !(mask & ((u32)1
13be0 3c 3c 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29  <<pAux->iArg))))
13bf0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
13c00 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20  ( pAux->xDelete 
13c10 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d  ){.        pAux-
13c20 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70  >xDelete(pAux->p
13c30 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aux);.      }.  
13c40 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e      *pp = pAux->
13c50 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
13c60 69 74 65 33 44 62 46 72 65 65 28 70 56 64 62 65  ite3DbFree(pVdbe
13c70 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20  ->db, pAux);.   
13c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
13c90 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a  = &pAux->pNext;.
13ca0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
13cb0 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  ** Free all memo
13cc0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
13cd0 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73  th the Vdbe pass
13ce0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
13cf0 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78   argument,.** ex
13d00 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20  cept for object 
13d10 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73  itself, which is
13d20 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a   preserved..**.*
13d30 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
13d40 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
13d50 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74  nction and sqlit
13d60 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69  e3VdbeDelete() i
13d70 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65  s that.** VdbeDe
13d80 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69  lete() also unli
13d90 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f  nks the Vdbe fro
13da0 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d  m the list of VM
13db0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
13dc0 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  h.** the databas
13dd0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64  e connection and
13de0 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63   frees the objec
13df0 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69  t itself..*/.voi
13e00 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65  d sqlite3VdbeCle
13e10 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  arObject(sqlite3
13e20 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
13e30 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53    SubProgram *pS
13e40 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e  ub, *pNext;.  in
13e50 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t i;.  assert( p
13e60 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ->db==0 || p->db
13e70 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73  ==db );.  releas
13e80 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
13e90 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72  r, p->nVar);.  r
13ea0 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
13eb0 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
13ec0 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
13ed0 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62  E_N);.  for(pSub
13ee0 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53  =p->pProgram; pS
13ef0 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b  ub; pSub=pNext){
13f00 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75  .    pNext = pSu
13f10 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64  b->pNext;.    vd
13f20 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
13f30 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75  , pSub->aOp, pSu
13f40 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c  b->nOp);.    sql
13f50 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
13f60 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Sub);.  }.  for(
13f70 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e  i=p->nzVar-1; i>
13f80 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33  =0; i--) sqlite3
13f90 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a  DbFree(db, p->az
13fa0 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46  Var[i]);.  vdbeF
13fb0 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70  reeOpArray(db, p
13fc0 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a  ->aOp, p->nOp);.
13fd0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
13fe0 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  db, p->aColName)
13ff0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
14000 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a  e(db, p->zSql);.
14010 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
14020 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23  db, p->pFree);.#
14030 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
14040 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
14050 50 4c 41 49 4e 29 0a 20 20 73 71 6c 69 74 65 33  PLAIN).  sqlite3
14060 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
14070 78 70 6c 61 69 6e 29 3b 0a 20 20 73 71 6c 69 74  xplain);.  sqlit
14080 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
14090 70 45 78 70 6c 61 69 6e 29 3b 0a 23 65 6e 64 69  pExplain);.#endi
140a0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  f.}../*.** Delet
140b0 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45  e an entire VDBE
140c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
140d0 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65  3VdbeDelete(Vdbe
140e0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
140f0 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  *db;..  if( NEVE
14100 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
14110 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
14120 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14130 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
14140 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
14150 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a  ite3VdbeClearObj
14160 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69 66  ect(db, p);.  if
14170 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
14180 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
14190 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
141a0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
141b0 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20  t( db->pVdbe==p 
141c0 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65  );.    db->pVdbe
141d0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
141e0 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
141f0 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
14200 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
14210 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  v;.  }.  p->magi
14220 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44  c = VDBE_MAGIC_D
14230 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30  EAD;.  p->db = 0
14240 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
14250 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
14260 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
14270 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61   cursor p is rea
14280 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  dy to read or wr
14290 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77  ite the row to w
142a0 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c  hich it.** was l
142b0 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20  ast positioned. 
142c0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
142d0 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20   code if an OOM 
142e0 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72  fault or I/O err
142f0 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75  or.** prevents u
14300 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69  s from positioni
14310 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
14320 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73   its correct pos
14330 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
14340 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
14350 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
14360 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
14370 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
14380 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
14390 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65  If no move is pe
143a0 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20  nding, check to 
143b0 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68  see if the row h
143c0 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74  as been.** delet
143d0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
143e0 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  r the cursor and
143f0 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b   if it has, mark
14400 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61   the row as.** a
14410 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a   NULL row..**.**
14420 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
14430 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
14440 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  ng to the correc
14450 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72  t row and that r
14460 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65  ow has.** not be
14470 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
14480 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
14490 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20  rsor, then this 
144a0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
144b0 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
144c0 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
144d0 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  to(VdbeCursor *p
144e0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65  ){.  if( p->defe
144f0 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20  rredMoveto ){.  
14500 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23    int res, rc;.#
14510 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
14520 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  T.    extern int
14530 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
14540 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20  count;.#endif.  
14550 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54    assert( p->isT
14560 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d  able );.    rc =
14570 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
14580 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70  etoUnpacked(p->p
14590 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f  Cursor, 0, p->mo
145a0 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26  vetoTarget, 0, &
145b0 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  res);.    if( rc
145c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
145d0 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d    p->lastRowid =
145e0 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
145f0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 21 3d 30  ;.    if( res!=0
14600 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
14610 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
14620 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c     p->rowidIsVal
14630 69 64 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53  id = 1;.#ifdef S
14640 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73  QLITE_TEST.    s
14650 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
14660 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
14670 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
14680 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  eto = 0;.    p->
14690 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
146a0 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c  CHE_STALE;.  }el
146b0 73 65 20 69 66 28 20 70 2d 3e 70 43 75 72 73 6f  se if( p->pCurso
146c0 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61 73  r ){.    int has
146d0 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74 20 72  Moved;.    int r
146e0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
146f0 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
14700 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68 61 73 4d  ->pCursor, &hasM
14710 6f 76 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  oved);.    if( r
14720 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
14730 20 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64 20     if( hasMoved 
14740 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61 63 68  ){.      p->cach
14750 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
14760 53 54 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d 3e  STALE;.      p->
14770 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20  nullRow = 1;.   
14780 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
14790 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
147a0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
147b0 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a  g functions:.**.
147c0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
147d0 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71  rialType().** sq
147e0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
147f0 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ypeLen().** sqli
14800 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e  te3VdbeSerialLen
14810 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
14820 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20  eSerialPut().** 
14830 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
14840 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63  lGet().**.** enc
14850 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64  apsulate the cod
14860 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65  e that serialize
14870 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f  s values for sto
14880 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a  rage in SQLite.*
14890 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78  * data and index
148a0 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73   records. Each s
148b0 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20  erialized value 
148c0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
148d0 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61   'serial-type' a
148e0 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  nd a blob of dat
148f0 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  a. The serial ty
14900 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20  pe is an 8-byte 
14910 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65  unsigned.** inte
14920 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ger, stored as a
14930 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   varint..**.** I
14940 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65  n an SQLite inde
14950 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65  x record, the se
14960 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f  rial type is sto
14970 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66  red directly bef
14980 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20  ore.** the blob 
14990 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20  of data that it 
149a0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20  corresponds to. 
149b0 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72  In a table recor
149c0 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a  d, all serial.**
149d0 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65   types are store
149e0 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
149f0 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e  f the record, an
14a00 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64  d the blobs of d
14a10 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ata at.** the en
14a20 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66  d. Hence these f
14a30 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74  unctions allow t
14a40 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e  he caller to han
14a50 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61  dle the.** seria
14a60 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20  l-type and data 
14a70 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e  blob separately.
14a80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
14a90 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
14aa0 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73  ibes the various
14ab0 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73   storage classes
14ac0 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a   for data:.**.**
14ad0 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20     serial type  
14ae0 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64        bytes of d
14af0 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a  ata      type.**
14b00 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
14b10 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
14b20 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
14b30 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
14b40 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
14b50 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
14b60 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20      NULL.**     
14b70 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
14b80 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
14b90 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
14ba0 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20  er.**      2    
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bc0 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69   2            si
14bd0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
14be0 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
14bf0 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20             3    
14c00 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
14c10 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34  nteger.**      4
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c30 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
14c40 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
14c50 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20  .**      5      
14c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36                 6
14c70 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
14c80 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
14c90 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
14ca0 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
14cb0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
14cc0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20  eger.**      7  
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ce0 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
14cf0 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20  IEEE float.**   
14d00 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
14d10 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
14d20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
14d30 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20  nstant 0.**     
14d40 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20   9              
14d50 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
14d60 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
14d70 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30  tant 1.**     10
14d80 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20  ,11             
14d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14da0 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65    reserved for e
14db0 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e  xpansion.**    N
14dc0 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20  >=12 and even   
14dd0 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20      (N-12)/2    
14de0 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e      BLOB.**    N
14df0 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20  >=13 and odd    
14e00 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20      (N-13)/2    
14e10 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54      text.**.** T
14e20 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73  he 8 and 9 types
14e30 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33   were added in 3
14e40 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61  .3.0, file forma
14e50 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73  t 4.  Prior vers
14e60 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
14e70 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72  e will not under
14e80 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69  stand those seri
14e90 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a  al types..*/../*
14ea0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
14eb0 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
14ec0 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
14ed0 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20  in pMem..*/.u32 
14ee0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
14ef0 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c  lType(Mem *pMem,
14f00 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
14f10 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
14f20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20   pMem->flags;.  
14f30 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c  int n;..  if( fl
14f40 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
14f50 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
14f60 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
14f70 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  M_Int ){.    /* 
14f80 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
14f90 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20  er to use 1, 2, 
14fa0 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e  4, 6 or 8 bytes.
14fb0 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
14fc0 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34  AX_6BYTE ((((i64
14fd0 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32  )0x00008000)<<32
14fe0 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d  )-1).    i64 i =
14ff0 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
15000 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69  u64 u;.    if( i
15010 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
15020 69 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29 20 29  i<(-MAX_6BYTE) )
15030 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 20   return 6;.     
15040 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65 73   /* Previous tes
15050 74 20 70 72 65 76 65 6e 74 73 3a 20 20 75 20 3d  t prevents:  u =
15060 20 2d 28 2d 39 32 32 33 33 37 32 30 33 36 38 35   -(-922337203685
15070 34 37 37 35 38 30 38 29 20 2a 2f 0a 20 20 20 20  4775808) */.    
15080 20 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65    u = -i;.    }e
15090 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69  lse{.      u = i
150a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
150b0 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20  u<=127 ){.      
150c0 72 65 74 75 72 6e 20 28 28 69 26 31 29 3d 3d 69  return ((i&1)==i
150d0 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e   && file_format>
150e0 3d 34 29 20 3f 20 38 2b 28 75 33 32 29 75 20 3a  =4) ? 8+(u32)u :
150f0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
15100 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74  ( u<=32767 ) ret
15110 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75  urn 2;.    if( u
15120 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74 75  <=8388607 ) retu
15130 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 3;.    if( u<
15140 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72 65  =2147483647 ) re
15150 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20  turn 4;.    if( 
15160 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72  u<=MAX_6BYTE ) r
15170 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74  eturn 5;.    ret
15180 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 6;.  }.  if(
15190 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20   flags&MEM_Real 
151a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b  ){.    return 7;
151b0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
151c0 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  Mem->db->mallocF
151d0 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28  ailed || flags&(
151e0 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
151f0 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d  ) );.  n = pMem-
15200 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  >n;.  if( flags 
15210 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
15220 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e    n += pMem->u.n
15230 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Zero;.  }.  asse
15240 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65  rt( n>=0 );.  re
15250 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32  turn ((n*2) + 12
15260 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53   + ((flags&MEM_S
15270 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a  tr)!=0));.}../*.
15280 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  ** Return the le
15290 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61  ngth of the data
152a0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
152b0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73  o the supplied s
152c0 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75  erial-type..*/.u
152d0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
152e0 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20  rialTypeLen(u32 
152f0 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
15300 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
15310 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =12 ){.    retur
15320 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  n (serial_type-1
15330 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2)/2;.  }else{. 
15340 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
15350 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30  u8 aSize[] = { 0
15360 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c  , 1, 2, 3, 4, 6,
15370 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20   8, 8, 0, 0, 0, 
15380 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 };.    return 
15390 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70  aSize[serial_typ
153a0 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e];.  }.}../*.**
153b0 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e   If we are on an
153c0 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69   architecture wi
153d0 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  th mixed-endian 
153e0 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69  floating .** poi
153f0 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74  nts (ex: ARM7) t
15400 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77  hen swap the low
15410 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20  er 4 bytes with 
15420 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20  the .** upper 4 
15430 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74  bytes.  Return t
15440 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
15450 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74   For most archit
15460 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73  ectures, this is
15470 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
15480 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20  (later):  It is 
15490 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74  reported to me t
154a0 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e  hat the mixed-en
154b0 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  dian problem.** 
154c0 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73  on ARM7 is an is
154d0 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f  sue with GCC, no
154e0 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20  t with the ARM7 
154f0 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a  chip.  It seems.
15500 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65  ** that early ve
15510 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74  rsions of GCC st
15520 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72  ored the two wor
15530 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a  ds of a 64-bit.*
15540 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77  * float in the w
15550 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64  rong order.  And
15560 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20   that error has 
15570 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a  been propagated.
15580 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20  ** ever since.  
15590 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74  The blame is not
155a0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74   necessarily wit
155b0 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a  h GCC, though..*
155c0 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65  * GCC might have
155d0 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68   just copying th
155e0 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61  e problem from a
155f0 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e   prior compiler.
15600 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f  .** I am also to
15610 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65  ld that newer ve
15620 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68  rsions of GCC th
15630 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66  at follow a diff
15640 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74  erent.** ABI get
15650 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
15660 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76  right..**.** Dev
15670 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51  elopers using SQ
15680 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20  Lite on an ARM7 
15690 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61  should compile a
156a0 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20  nd run their.** 
156b0 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e  application usin
156c0 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47  g -DSQLITE_DEBUG
156d0 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  =1 at least once
156e0 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a  .  With DEBUG.**
156f0 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61   enabled, some a
15700 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c  sserts below wil
15710 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  l ensure that th
15720 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a  e byte order of.
15730 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
15740 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72  t values is corr
15750 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37  ect..**.** (2007
15760 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76  -08-30)  Frank v
15770 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64  an Vugt has stud
15780 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  ied this problem
15790 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20   closely.** and 
157a0 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e  has send his fin
157b0 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c  dings to the SQL
157c0 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20  ite developers. 
157d0 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73   Frank.** writes
157e0 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78   that some Linux
157f0 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66   kernels offer f
15800 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61  loating point ha
15810 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74  rdware.** emulat
15820 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e  ion that uses on
15830 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73  ly 32-bit mantis
15840 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61  sas instead of a
15850 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74   full .** 48-bit
15860 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79  s as required by
15870 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61   the IEEE standa
15880 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68  rd.  (This is th
15890 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f  e.** CONFIG_FPE_
158a0 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29  FASTFPE option.)
158b0 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d    On such system
158c0 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  s, floating poin
158d0 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69  t.** byte swappi
158e0 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20  ng becomes very 
158f0 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f  complicated.  To
15900 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c   avoid problems,
15910 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72  .** the necessar
15920 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  y byte swapping 
15930 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75  is carried out u
15940 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e  sing a 64-bit in
15950 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20  teger.** rather 
15960 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c  than a 64-bit fl
15970 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75  oat.  Frank assu
15980 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20  res us that the 
15990 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72  code here.** wor
159a0 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c  ks for him.  We,
159b0 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c   the developers,
159c0 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20   have no way to 
159d0 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a  independently.**
159e0 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75   verify this, bu
159f0 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f  t Frank seems to
15a00 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73   know what he is
15a10 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a   talking about.*
15a20 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69  * so we trust hi
15a30 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
15a40 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
15a50 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61  _64BIT_FLOAT.sta
15a60 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61  tic u64 floatSwa
15a70 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69  p(u64 in){.  uni
15a80 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a  on {.    u64 r;.
15a90 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20      u32 i[2];.  
15aa0 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20  } u;.  u32 t;.. 
15ab0 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d   u.r = in;.  t =
15ac0 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30   u.i[0];.  u.i[0
15ad0 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e  ] = u.i[1];.  u.
15ae0 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75  i[1] = t;.  retu
15af0 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69  rn u.r;.}.# defi
15b00 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
15b10 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20  anFloat(X)  X = 
15b20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c  floatSwap(X).#el
15b30 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  se.# define swap
15b40 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
15b50 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
15b60 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69  * Write the seri
15b70 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62  alized data blob
15b80 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
15b90 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e  tored in pMem in
15ba0 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69  to .** buf. It i
15bb0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
15bc0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
15bd0 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65  located sufficie
15be0 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74  nt space..** Ret
15bf0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
15c00 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e  f bytes written.
15c10 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74  .**.** nBuf is t
15c20 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61  he amount of spa
15c30 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d  ce left in buf[]
15c40 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  .  The caller is
15c50 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20   responsible.** 
15c60 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65  for allocating e
15c70 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62  nough space to b
15c80 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65  uf[] to hold the
15c90 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65   entire field, e
15ca0 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74  xclusive.** of t
15cb0 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  he pMem->u.nZero
15cc0 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d   bytes for a MEM
15cd0 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a  _Zero value..**.
15ce0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
15cf0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
15d00 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  tually written i
15d10 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20  nto buf[].  The 
15d20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74  number.** of byt
15d30 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66  es in the zero-f
15d40 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e  illed tail is in
15d50 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
15d60 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a  turn value only.
15d70 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65  ** if those byte
15d80 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e  s were zeroed in
15d90 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20   buf[]..*/ .u32 
15da0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
15db0 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65  lPut(u8 *buf, Me
15dc0 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72  m *pMem, u32 ser
15dd0 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32  ial_type){.  u32
15de0 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65   len;..  /* Inte
15df0 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a  ger and Real */.
15e00 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
15e10 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=7 && serial_t
15e20 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34  ype>0 ){.    u64
15e30 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20   v;.    u32 i;. 
15e40 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
15e50 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61  pe==7 ){.      a
15e60 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29  ssert( sizeof(v)
15e70 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72  ==sizeof(pMem->r
15e80 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
15e90 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20  y(&v, &pMem->r, 
15ea0 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20  sizeof(v));.    
15eb0 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
15ec0 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d  nFloat(v);.    }
15ed0 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20  else{.      v = 
15ee0 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  pMem->u.i;.    }
15ef0 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73  .    len = i = s
15f00 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15f10 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
15f20 79 70 65 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ype);.    while(
15f30 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75   i-- ){.      bu
15f40 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78  f[i] = (u8)(v&0x
15f50 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d  FF);.      v >>=
15f60 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   8;.    }.    re
15f70 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
15f80 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c   /* String or bl
15f90 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  ob */.  if( seri
15fa0 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
15fb0 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
15fc0 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61  >n + ((pMem->fla
15fd0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70  gs & MEM_Zero)?p
15fe0 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a  Mem->u.nZero:0).
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
16000 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65  (int)sqlite3Vdbe
16010 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
16020 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20  rial_type) );.  
16030 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
16040 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c  .    memcpy(buf,
16050 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a   pMem->z, len);.
16060 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
16070 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f    }..  /* NULL o
16080 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72  r constants 0 or
16090 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30   1 */.  return 0
160a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72  ;.}../*.** Deser
160b0 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20  ialize the data 
160c0 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20  blob pointed to 
160d0 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c  by buf as serial
160e0 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70   type serial_typ
160f0 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74  e.** and store t
16100 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65  he result in pMe
16110 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  m.  Return the n
16120 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
16130 65 61 64 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c  ead..*/ .u32 sql
16140 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
16150 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  t(.  const unsig
16160 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20  ned char *buf,  
16170 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
16180 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d  deserialize from
16190 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c   */.  u32 serial
161a0 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  _type,          
161b0 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
161c0 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  pe to deserializ
161d0 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
16200 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c  ell to write val
16210 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ue into */.){.  
16220 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
16230 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
16240 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  10:   /* Reserve
16250 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
16260 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a   */.    case 11:
16270 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
16280 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
16290 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20  .    case 0: {  
162a0 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20  /* NULL */.     
162b0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
162c0 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62  EM_Null;.      b
162d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
162e0 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62  case 1: { /* 1-b
162f0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
16300 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
16310 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65 64 20  ->u.i = (signed 
16320 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20  char)buf[0];.   
16330 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
16340 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
16350 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
16360 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a      case 2: { /*
16370 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   2-byte signed i
16380 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
16390 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73  pMem->u.i = (((s
163a0 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
163b0 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b  ])<<8) | buf[1];
163c0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
163d0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
163e0 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
163f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20    }.    case 3: 
16400 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e  { /* 3-byte sign
16410 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
16420 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
16430 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  (((signed char)b
16440 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62  uf[0])<<16) | (b
16450 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[1]<<8) | buf[
16460 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  2];.      pMem->
16470 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
16480 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b  .      return 3;
16490 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
164a0 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73  4: { /* 4-byte s
164b0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
164c0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
164d0 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20   = (buf[0]<<24) 
164e0 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c  | (buf[1]<<16) |
164f0 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62   (buf[2]<<8) | b
16500 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[3];.      pMe
16510 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
16520 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
16530 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   4;.    }.    ca
16540 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
16550 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
16560 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20   */.      u64 x 
16570 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
16580 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62  )buf[0])<<8) | b
16590 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32  uf[1];.      u32
165a0 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34   y = (buf[2]<<24
165b0 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29  ) | (buf[3]<<16)
165c0 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c   | (buf[4]<<8) |
165d0 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78   buf[5];.      x
165e0 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a   = (x<<32) | y;.
165f0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
16600 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
16610 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
16620 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
16630 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a  return 6;.    }.
16640 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a      case 6:   /*
16650 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
16660 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61  nteger */.    ca
16670 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20  se 7: { /* IEEE 
16680 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a  floating point *
16690 2f 0a 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20  /.      u64 x;. 
166a0 20 20 20 20 20 75 33 32 20 79 3b 0a 23 69 66 20       u32 y;.#if 
166b0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
166c0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
166d0 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
166e0 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f  G_POINT).      /
166f0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e  * Verify that in
16700 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74  tegers and float
16710 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
16720 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20   use the same.  
16730 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65      ** byte orde
16740 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20  r.  Or, that if 
16750 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
16760 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20  IAN_64BIT_FLOAT 
16770 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 69  is.      ** defi
16780 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20  ned that 64-bit 
16790 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
167a0 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65  alues really are
167b0 20 6d 69 78 65 64 0a 20 20 20 20 20 20 2a 2a 20   mixed.      ** 
167c0 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f  endian..      */
167d0 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
167e0 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75  nst u64 t1 = ((u
167f0 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c  64)0x3ff00000)<<
16800 33 32 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63  32;.      static
16810 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31   const double r1
16820 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 75 36   = 1.0;.      u6
16830 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 20  4 t2 = t1;.     
16840 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
16850 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 20  Float(t2);.     
16860 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
16870 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20  r1)==sizeof(t2) 
16880 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26  && memcmp(&r1, &
16890 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d  t2, sizeof(r1))=
168a0 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  =0 );.#endif..  
168b0 20 20 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c      x = (buf[0]<
168c0 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c  <24) | (buf[1]<<
168d0 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38  16) | (buf[2]<<8
168e0 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20  ) | buf[3];.    
168f0 20 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32    y = (buf[4]<<2
16900 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36  4) | (buf[5]<<16
16910 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20  ) | (buf[6]<<8) 
16920 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20  | buf[7];.      
16930 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b  x = (x<<32) | y;
16940 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
16950 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20  l_type==6 ){.   
16960 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
16970 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
16980 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
16990 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
169a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
169b0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78  assert( sizeof(x
169c0 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70  )==8 && sizeof(p
169d0 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20  Mem->r)==8 );.  
169e0 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
169f0 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20  ndianFloat(x);. 
16a00 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
16a10 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65  Mem->r, &x, size
16a20 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20 20 20  of(x));.        
16a30 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71  pMem->flags = sq
16a40 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d  lite3IsNaN(pMem-
16a50 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a  >r) ? MEM_Null :
16a60 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20   MEM_Real;.     
16a70 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
16a80 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  8;.    }.    cas
16a90 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67  e 8:    /* Integ
16aa0 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65  er 0 */.    case
16ab0 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65   9: {  /* Intege
16ac0 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  r 1 */.      pMe
16ad0 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f  m->u.i = serial_
16ae0 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d  type-8;.      pM
16af0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
16b00 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
16b10 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  n 0;.    }.    d
16b20 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
16b30 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
16b40 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d   aFlag[] = { MEM
16b50 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c  _Blob|MEM_Ephem,
16b60 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68   MEM_Str|MEM_Eph
16b70 65 6d 20 7d 3b 0a 20 20 20 20 20 20 75 33 32 20  em };.      u32 
16b80 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  len = (serial_ty
16b90 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20  pe-12)/2;.      
16ba0 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20  pMem->z = (char 
16bb0 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65  *)buf;.      pMe
16bc0 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20  m->n = len;.    
16bd0 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30    pMem->xDel = 0
16be0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
16bf0 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69  ags = aFlag[seri
16c00 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20  al_type&1];.    
16c10 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
16c20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
16c30 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
16c40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
16c50 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75  d to allocate su
16c60 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 66  fficient space f
16c70 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65  or an UnpackedRe
16c80 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72  cord.** structur
16c90 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  e large enough t
16ca0 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20 73  o be used with s
16cb0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
16cc0 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74  Unpack() if.** t
16cd0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
16ce0 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
16cf0 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  o KeyInfo struct
16d00 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a  ure pKeyInfo..**
16d10 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69 73  .** The space is
16d20 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65   either allocate
16d30 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  d using sqlite3D
16d40 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20  bMallocRaw() or 
16d50 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74  from within.** t
16d60 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66  he unaligned buf
16d70 66 65 72 20 70 61 73 73 65 64 20 76 69 61 20 74  fer passed via t
16d80 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68  he second and th
16d90 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70  ird arguments (p
16da0 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61  resumably.** sta
16db0 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74 68  ck space). If th
16dc0 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a  e former, then *
16dd0 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f  ppFree is set to
16de0 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20   a pointer that 
16df0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65  should.** be eve
16e00 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79  ntually freed by
16e10 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
16e20 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  g sqlite3DbFree(
16e30 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a  ). Or, if the .*
16e40 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d  * allocation com
16e50 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61  es from the pSpa
16e60 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65  ce/szSpace buffe
16e70 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73 65  r, *ppFree is se
16e80 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66  t to NULL.** bef
16e90 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
16ea0 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
16eb0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
16ec0 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
16ed0 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  /.UnpackedRecord
16ee0 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c   *sqlite3VdbeAll
16ef0 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  ocUnpackedRecord
16f00 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  (.  KeyInfo *pKe
16f10 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
16f20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
16f30 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  on of the record
16f40 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
16f50 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
16f60 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e        /* Unalign
16f70 65 64 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  ed space availab
16f80 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70  le */.  int szSp
16f90 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
16fa0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
16fb0 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62  of pSpace[] in b
16fc0 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
16fd0 2a 70 70 46 72 65 65 20 20 20 20 20 20 20 20 20  *ppFree         
16fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
16ff0 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  : Caller should 
17000 66 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74 65  free this pointe
17010 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b  r */.){.  Unpack
17020 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20  edRecord *p;    
17030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70            /* Unp
17040 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20  acked record to 
17050 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
17060 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  nOff;           
17070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
17080 6e 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65 20  ncrement pSpace 
17090 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e  by nOff to align
170a0 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79   it */.  int nBy
170b0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
170c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
170d0 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
170e0 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a  ired for *p */..
170f0 20 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f 20    /* We want to 
17100 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65  shift the pointe
17110 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63 68  r pSpace up such
17120 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62 79   that it is 8-by
17130 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a  te aligned..  **
17140 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74   Thus, we need t
17150 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61  o calculate a va
17160 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65  lue, nOff, betwe
17170 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73  en 0 and 7, to s
17180 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79  hift .  ** it by
17190 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73 20  .  If pSpace is 
171a0 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20 61  already 8-byte a
171b0 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f  ligned, nOff sho
171c0 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a  uld be zero..  *
171d0 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20  /.  nOff = (8 - 
171e0 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  (SQLITE_PTR_TO_I
171f0 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29 29  NT(pSpace) & 7))
17200 20 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20   & 7;.  nByte = 
17210 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e  ROUND8(sizeof(Un
17220 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b  packedRecord)) +
17230 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b   sizeof(Mem)*(pK
17240 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31  eyInfo->nField+1
17250 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73  );.  if( nByte>s
17260 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20  zSpace+nOff ){. 
17270 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64     p = (Unpacked
17280 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33  Record *)sqlite3
17290 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79  DbMallocRaw(pKey
172a0 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29  Info->db, nByte)
172b0 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20  ;.    *ppFree = 
172c0 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20 69  (char *)p;.    i
172d0 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30  f( !p ) return 0
172e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
172f0 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f   = (UnpackedReco
17300 72 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66 66  rd*)&pSpace[nOff
17310 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d  ];.    *ppFree =
17320 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d   0;.  }..  p->aM
17330 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68  em = (Mem*)&((ch
17340 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69  ar*)p)[ROUND8(si
17350 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63  zeof(UnpackedRec
17360 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74  ord))];.  assert
17370 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
17380 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70  tOrder!=0 );.  p
17390 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
173a0 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65  yInfo;.  p->nFie
173b0 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
173c0 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74  Field + 1;.  ret
173d0 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
173e0 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62  Given the nKey-b
173f0 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  yte encoding of 
17400 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79  a record in pKey
17410 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  [], populate the
17420 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63   .** UnpackedRec
17430 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69 6e  ord structure in
17440 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66  dicated by the f
17450 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77  ourth argument w
17460 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ith the.** conte
17470 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64  nts of the decod
17480 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76  ed record..*/ .v
17490 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
174a0 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b  ecordUnpack(.  K
174b0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
174c0 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  ,     /* Informa
174d0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72  tion about the r
174e0 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a  ecord format */.
174f0 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20    int nKey,     
17500 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
17510 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72   of the binary r
17520 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
17530 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20   void *pKey,    
17540 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20    /* The binary 
17550 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61  record */.  Unpa
17560 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20  ckedRecord *p   
17570 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
17580 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62 65  his structure be
17590 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
175a0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  */.){.  const un
175b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
175c0 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  y = (const unsig
175d0 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b  ned char *)pKey;
175e0 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32  .  int d; .  u32
175f0 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20   idx;           
17600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17610 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d  Offset in aKey[]
17620 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
17630 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20  .  u16 u;       
17640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17650 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
17660 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
17670 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65   u32 szHdr;.  Me
17680 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65  m *pMem = p->aMe
17690 6d 3b 0a 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d  m;..  p->flags =
176a0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   0;.  assert( EI
176b0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
176c0 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64  NT(pMem) );.  id
176d0 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  x = getVarint32(
176e0 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20  aKey, szHdr);.  
176f0 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d  d = szHdr;.  u =
17700 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78   0;.  while( idx
17710 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e  <szHdr && u<p->n
17720 46 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65 79  Field && d<=nKey
17730 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
17740 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
17750 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
17760 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72  (&aKey[idx], ser
17770 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70  ial_type);.    p
17780 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49  Mem->enc = pKeyI
17790 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d  nfo->enc;.    pM
177a0 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em->db = pKeyInf
177b0 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d  o->db;.    /* pM
177c0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f  em->flags = 0; /
177d0 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  / sqlite3VdbeSer
177e0 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65  ialGet() will se
177f0 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f  t this for us */
17800 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c  .    pMem->zMall
17810 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d  oc = 0;.    pMem
17820 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  ->z = 0;.    d +
17830 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
17840 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
17850 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
17860 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
17870 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20  .    u++;.  }.  
17880 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49  assert( u<=pKeyI
17890 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20  nfo->nField + 1 
178a0 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  );.  p->nField =
178b0 20 75 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   u;.}../*.** Thi
178c0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
178d0 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c  res the two tabl
178e0 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20  e rows or index 
178f0 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69  records.** speci
17900 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20  fied by {nKey1, 
17910 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79  pKey1} and pPKey
17920 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61  2.  It returns a
17930 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a   negative, zero.
17940 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ** or positive i
17950 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69  nteger if key1 i
17960 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
17970 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65  al to or .** gre
17980 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20  ater than key2. 
17990 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65   The {nKey1, pKe
179a0 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20  y1} key must be 
179b0 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65  a blob.** create
179c0 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52  d by th OP_MakeR
179d0 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
179e0 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70  the VDBE.  The p
179f0 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73  PKey2.** key mus
17a00 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65  t be a parsed ke
17a10 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e  y such as obtain
17a20 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
17a30 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72  e3VdbeParseRecor
17a40 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e  d..**.** Key1 an
17a50 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61  d Key2 do not ha
17a60 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ve to contain th
17a70 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
17a80 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65 20   fields..** The 
17a90 6b 65 79 20 77 69 74 68 20 66 65 77 65 72 20 66  key with fewer f
17aa0 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c 79  ields is usually
17ab0 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20 74   compares less t
17ac0 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67  han the .** long
17ad0 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65 72  er key.  However
17ae0 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   if the UNPACKED
17af0 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20 69  _INCRKEY flags i
17b00 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65 74 0a  n pPKey2 is set.
17b10 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d 6f  ** and the commo
17b20 6e 20 70 72 65 66 69 78 65 73 20 61 72 65 20 65  n prefixes are e
17b30 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31 20  qual, then key1 
17b40 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65 79  is less than key
17b50 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65 20  2..** Or if the 
17b60 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f 50  UNPACKED_MATCH_P
17b70 52 45 46 49 58 20 66 6c 61 67 20 69 73 20 73 65  REFIX flag is se
17b80 74 20 61 6e 64 20 74 68 65 20 70 72 65 66 69 78  t and the prefix
17b90 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c  es are.** equal,
17ba0 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20 61   then the keys a
17bb0 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  re considered to
17bc0 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a 2a   be equal and.**
17bd0 20 74 68 65 20 70 61 72 74 73 20 62 65 79 6f 6e   the parts beyon
17be0 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  d the common pre
17bf0 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  fix are ignored.
17c00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
17c10 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
17c20 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
17c30 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
17c40 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
17c50 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
17c60 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
17c70 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
17c80 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20  .){.  u32 d1;   
17c90 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
17ca0 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
17cb0 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
17cc0 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  ent */.  u32 idx
17cd0 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  1;          /* O
17ce0 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
17cf0 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72  ] of next header
17d00 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
17d10 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20  2 szHdr1;       
17d20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
17d30 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f  tes in header */
17d40 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
17d50 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f  int rc = 0;.  co
17d60 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
17d70 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
17d80 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
17d90 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e  *)pKey1;.  KeyIn
17da0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
17db0 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65  Mem mem1;..  pKe
17dc0 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
17dd0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31  pKeyInfo;.  mem1
17de0 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
17df0 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20  >enc;.  mem1.db 
17e00 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
17e10 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20    /* mem1.flags 
17e20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65  = 0;  // Will be
17e30 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
17e40 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17e50 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f  lGet() */.  VVA_
17e60 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c  ONLY( mem1.zMall
17e70 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
17e80 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
17e90 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
17ea0 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  */..  /* Compile
17eb0 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20  rs may complain 
17ec0 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73  that mem1.u.i is
17ed0 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69   potentially uni
17ee0 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
17ef0 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61   We could initia
17f00 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77  lize it, as show
17f10 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e  n here, to silen
17f20 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69  ce those complai
17f30 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e  nts..  ** But in
17f40 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20   fact, mem1.u.i 
17f50 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61  will never actua
17f60 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e  lly be used unin
17f70 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64  itialized, and d
17f80 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75  oing .  ** the u
17f90 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69  nnecessary initi
17fa0 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20  alization has a 
17fb0 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74  measurable negat
17fc0 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ive performance.
17fd0 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e    ** impact, sin
17fe0 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
17ff0 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72  is a very high r
18000 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20  unner.  And so, 
18010 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74  we choose.  ** t
18020 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d  o ignore the com
18030 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61  piler warnings a
18040 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61  nd leave this va
18050 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c  riable uninitial
18060 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20  ized..  */.  /* 
18070 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20   mem1.u.i = 0;  
18080 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68  // not needed, h
18090 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63  ere to silence c
180a0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20  ompiler warning 
180b0 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67  */.  .  idx1 = g
180c0 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
180d0 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20  , szHdr1);.  d1 
180e0 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65  = szHdr1;.  asse
180f0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
18100 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ield+pKeyInfo->n
18110 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e  XField>=pPKey2->
18120 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50  nField || CORRUP
18130 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
18140 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
18150 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61  tOrder!=0 );.  a
18160 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
18170 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61  >nField>0 );.  a
18180 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48  ssert( idx1<=szH
18190 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  dr1 || CORRUPT_D
181a0 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75  B );.  do{.    u
181b0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
181c0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
181d0 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
181e0 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
181f0 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
18200 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
18210 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65  getVarint32( aKe
18220 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
18230 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a  type1 );..    /*
18240 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
18250 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79  re is enough key
18260 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67   space remaining
18270 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a   to avoid.    **
18280 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65   a buffer overre
18290 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72  ad.  The "d1+ser
182a0 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62  ial_type1+2" sub
182b0 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a  expression will.
182c0 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
182d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
182e0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d   equal to the am
182f0 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64  ount of required
18300 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20   key space..    
18310 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70 72  ** Use that appr
18320 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f  oximation to avo
18330 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65  id the more expe
18340 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20  nsive call to.  
18350 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
18360 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20  SerialTypeLen() 
18370 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
18380 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
18390 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70  f( d1+serial_typ
183a0 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a  e1+2>(u32)nKey1.
183b0 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74       && d1+sqlit
183c0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
183d0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
183e0 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20  )>(u32)nKey1 .  
183f0 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
18400 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
18410 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
18420 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65  es to be compare
18430 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31  d..    */.    d1
18440 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
18450 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
18460 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
18470 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20  1, &mem1);..    
18480 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72  /* Do the compar
18490 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ison.    */.    
184a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  rc = sqlite3MemC
184b0 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70  ompare(&mem1, &p
184c0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20  PKey2->aMem[i], 
184d0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
184e0 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  i]);.    if( rc!
184f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
18500 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63  rt( mem1.zMalloc
18510 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63  ==0 );  /* See c
18520 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a  omment below */.
18530 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
18540 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
18550 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ] ){.        rc 
18560 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72  = -rc;  /* Inver
18570 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72  t the result for
18580 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72   DESC sort order
18590 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  . */.      }.   
185a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
185b0 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
185c0 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
185d0 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
185e0 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20  nField );..  /* 
185f0 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  No memory alloca
18600 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65  tion is ever use
18610 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76  d on mem1.  Prov
18620 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a  e this using.  *
18630 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
18640 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68  assert().  If th
18650 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73  e assert() fails
18660 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61  , it indicates a
18670 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61  .  ** memory lea
18680 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20  k and a need to 
18690 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  call sqlite3Vdbe
186a0 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31  MemRelease(&mem1
186b0 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
186c0 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d  ( mem1.zMalloc==
186d0 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30  0 );..  /* rc==0
186e0 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74   here means that
186f0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73   one of the keys
18700 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
18710 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20  ds and.  ** all 
18720 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
18730 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
18740 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 55   equal. If the U
18750 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a  NPACKED_INCRKEY.
18760 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
18770 2c 20 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65  , then break the
18780 20 74 69 65 20 62 79 20 74 72 65 61 74 69 6e 67   tie by treating
18790 20 6b 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e   key2 as larger.
187a0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 55 50 41  .  ** If the UPA
187b0 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43  CKED_PREFIX_MATC
187c0 48 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  H flag is set, t
187d0 68 65 6e 20 6b 65 79 73 20 77 69 74 68 20 63 6f  hen keys with co
187e0 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a 20 20  mmon prefixes.  
187f0 2a 2a 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ** are considere
18800 64 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20  d to be equal.  
18810 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c  Otherwise, the l
18820 6f 6e 67 65 72 20 6b 65 79 20 69 73 20 74 68 65  onger key is the
18830 20 0a 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20   .  ** larger.  
18840 41 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74  As it happens, t
18850 68 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61  he pPKey2 will a
18860 6c 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e  lways be the lon
18870 67 65 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 72  ger.  ** if ther
18880 65 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 63  e is a differenc
18890 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
188a0 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ( rc==0 );.  if(
188b0 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26   pPKey2->flags &
188c0 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45   UNPACKED_INCRKE
188d0 59 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 31  Y ){.    rc = -1
188e0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
188f0 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e  Key2->flags & UN
18900 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41  PACKED_PREFIX_MA
18910 54 43 48 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 65  TCH ){.    /* Le
18920 61 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 7d  ave rc==0 */.  }
18930 65 6c 73 65 20 69 66 28 20 69 64 78 31 3c 73 7a  else if( idx1<sz
18940 48 64 72 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  Hdr1 ){.    rc =
18950 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
18960 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20   rc;.}. ../*.** 
18970 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
18980 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
18990 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
189a0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
189b0 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
189c0 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
189d0 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
189e0 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
189f0 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
18a00 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
18a10 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
18a20 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
18a30 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
18a40 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d  se..**.** pCur m
18a50 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  ight be pointing
18a60 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65   to text obtaine
18a70 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74  d from a corrupt
18a80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
18a90 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ** So the conten
18aa0 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  t cannot be trus
18ab0 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72  ted.  Do appropr
18ac0 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74  iate checks on t
18ad0 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69  he content..*/.i
18ae0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
18af0 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  xRowid(sqlite3 *
18b00 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43  db, BtCursor *pC
18b10 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b  ur, i64 *rowid){
18b20 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
18b30 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
18b40 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
18b50 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
18b60 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
18b70 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
18b80 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
18b90 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
18ba0 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20   u32 lenRowid;  
18bb0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
18bc0 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d  e rowid */.  Mem
18bd0 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53 45 44   m, v;..  UNUSED
18be0 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
18bf0 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69  .  /* Get the si
18c00 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
18c10 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64  entry.  Only ind
18c20 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20  ices entries of 
18c30 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32  less.  ** than 2
18c40 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20  GiB are support 
18c50 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65  - anything large
18c60 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73   must be databas
18c70 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
18c80 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f  ** Any corruptio
18c90 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e  n is detected in
18ca0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
18cb0 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f  seCellPtr(), tho
18cc0 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69  ugh, so.  ** thi
18cd0 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c  s code can safel
18ce0 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43  y assume that nC
18cf0 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74  ellKey is 32-bit
18d00 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s  .  */.  asser
18d10 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
18d20 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
18d30 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  r) );.  VVA_ONLY
18d40 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74  (rc =) sqlite3Bt
18d50 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
18d60 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61   &nCellKey);.  a
18d70 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
18d80 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70  E_OK );     /* p
18d90 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61  Cur is always va
18da0 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63  lid so KeySize c
18db0 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20  annot fail */.  
18dc0 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65  assert( (nCellKe
18dd0 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55  y & SQLITE_MAX_U
18de0 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b  32)==(u64)nCellK
18df0 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  ey );..  /* Read
18e00 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   in the complete
18e10 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
18e20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20  index entry */. 
18e30 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73   memset(&m, 0, s
18e40 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20  izeof(m));.  rc 
18e50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
18e60 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
18e70 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79  0, (u32)nCellKey
18e80 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
18e90 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
18ea0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   rc;.  }..  /* T
18eb0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d  he index entry m
18ec0 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  ust begin with a
18ed0 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a   header size */.
18ee0 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
18ef0 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a  t32((u8*)m.z, sz
18f00 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65  Hdr);.  testcase
18f10 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20  ( szHdr==3 );.  
18f20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
18f30 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e  =m.n );.  if( un
18f40 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c  likely(szHdr<3 |
18f50 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e  | (int)szHdr>m.n
18f60 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
18f70 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
18f80 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  on;.  }..  /* Th
18f90 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20  e last field of 
18fa0 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  the index should
18fb0 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   be an integer -
18fc0 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a   the ROWID..  **
18fd0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
18fe0 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c   last entry real
18ff0 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ly is an integer
19000 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
19010 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
19020 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70  .z[szHdr-1], typ
19030 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
19040 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
19050 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
19060 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b   typeRowid==2 );
19070 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
19080 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74  eRowid==3 );.  t
19090 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
190a0 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63  id==4 );.  testc
190b0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
190c0 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  5 );.  testcase(
190d0 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b   typeRowid==6 );
190e0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
190f0 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74  eRowid==8 );.  t
19100 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
19110 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75  id==9 );.  if( u
19120 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69  nlikely(typeRowi
19130 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d<1 || typeRowid
19140 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d  >9 || typeRowid=
19150 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =7) ){.    goto 
19160 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
19170 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52  tion;.  }.  lenR
19180 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64  owid = sqlite3Vd
19190 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
191a0 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65  typeRowid);.  te
191b0 73 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e  stcase( (u32)m.n
191c0 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  ==szHdr+lenRowid
191d0 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
191e0 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64  ly((u32)m.n<szHd
191f0 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20  r+lenRowid) ){. 
19200 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
19210 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
19220 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68  }..  /* Fetch th
19230 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68  e integer off th
19240 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
19250 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73  ex record */.  s
19260 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
19270 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e  Get((u8*)&m.z[m.
19280 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70  n-lenRowid], typ
19290 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a  eRowid, &v);.  *
192a0 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20  rowid = v.u.i;. 
192b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
192c0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
192d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
192e0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
192f0 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  if database corr
19300 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
19310 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62  ed after m has b
19320 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  een.  ** allocat
19330 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20  ed.  Free the m 
19340 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
19350 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
19360 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63  . */.idx_rowid_c
19370 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73  orruption:.  tes
19380 74 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63  tcase( m.zMalloc
19390 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
193a0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
193b0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
193c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
193d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
193e0 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  re the key of th
193f0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68  e index entry th
19400 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20  at cursor pC is 
19410 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69  pointing to agai
19420 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
19430 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b  tring in pUnpack
19440 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  ed.  Write into 
19450 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
19460 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
19470 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
19480 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
19490 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
194a0 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
194b0 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64  r than pUnpacked
194c0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
194d0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
194e0 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20  **.** pUnpacked 
194f0 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65  is either create
19500 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69  d without a rowi
19510 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65  d or is truncate
19520 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  d so that it.** 
19530 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20  omits the rowid 
19540 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65  at the end.  The
19550 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
19560 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  d of the index e
19570 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  ntry.** is ignor
19580 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e  ed as well.  Hen
19590 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ce, this routine
195a0 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74   only compares t
195b0 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20  he prefixes .** 
195c0 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f  of the keys prio
195d0 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72  r to the final r
195e0 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e  owid, not the en
195f0 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74  tire key..*/.int
19600 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
19610 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 56 64 62  eyCompare(.  Vdb
19620 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20  eCursor *pC,    
19630 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19640 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72  cursor to compar
19650 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55  e against */.  U
19660 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
19670 55 6e 70 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e  Unpacked,  /* Un
19680 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f  packed version o
19690 66 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65  f key to compare
196a0 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e   against */.  in
196b0 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20  t *res          
196c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
196d0 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
196e0 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
196f0 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  .){.  i64 nCellK
19700 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
19710 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
19720 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72  ur = pC->pCursor
19730 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73  ;.  Mem m;..  as
19740 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
19750 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
19760 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f  pCur) );.  VVA_O
19770 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65  NLY(rc =) sqlite
19780 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
19790 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
197a0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
197b0 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a  LITE_OK );    /*
197c0 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20   pCur is always 
197d0 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65  valid so KeySize
197e0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
197f0 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69    /* nCellKey wi
19800 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74  ll always be bet
19810 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66  ween 0 and 0xfff
19820 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66  fffff because of
19830 20 74 68 65 20 73 61 79 0a 20 20 2a 2a 20 74 68   the say.  ** th
19840 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  at btreeParseCel
19850 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74  lPtr() and sqlit
19860 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20  e3GetVarint32() 
19870 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
19880 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  */.  if( nCellKe
19890 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79  y<=0 || nCellKey
198a0 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20  >0x7fffffff ){. 
198b0 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
198c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
198d0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
198e0 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c  .  memset(&m, 0,
198f0 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72   sizeof(m));.  r
19900 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
19910 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e  emFromBtree(pC->
19920 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 33 32  pCursor, 0, (u32
19930 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d  )nCellKey, 1, &m
19940 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
19950 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19960 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55 6e 70  }.  assert( pUnp
19970 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26 20 55  acked->flags & U
19980 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d  NPACKED_PREFIX_M
19990 41 54 43 48 20 29 3b 0a 20 20 2a 72 65 73 20 3d  ATCH );.  *res =
199a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
199b0 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
199c0 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a  .z, pUnpacked);.
199d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
199e0 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
199f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
19a10 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
19a20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
19a30 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
19a40 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
19a50 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
19a60 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
19a70 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
19a80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
19a90 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
19aa0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
19ab0 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
19ac0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
19ad0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
19ae0 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
19af0 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
19b00 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
19b10 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
19b20 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
19b30 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
19b40 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
19b50 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
19b60 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
19b70 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
19b80 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
19b90 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
19ba0 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
19bb0 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
19bc0 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
19bd0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
19be0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
19bf0 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
19c00 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
19c10 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
19c20 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
19c30 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
19c40 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
19c50 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
19c60 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
19c70 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
19c80 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
19c90 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
19ca0 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
19cb0 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
19cc0 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
19cd0 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
19ce0 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
19cf0 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
19d00 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
19d10 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
19d20 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
19d30 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
19d40 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
19d50 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
19d60 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
19d70 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
19d80 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
19d90 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
19da0 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
19db0 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
19dc0 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
19dd0 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
19de0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
19df0 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
19e00 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
19e10 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
19e20 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
19e30 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
19e40 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
19e50 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
19e60 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
19e70 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
19e80 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
19e90 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
19ea0 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
19eb0 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
19ec0 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
19ed0 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
19ee0 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
19ef0 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
19f00 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
19f10 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
19f20 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
19f30 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
19f40 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
19f50 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
19f60 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
19f70 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
19f80 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
19f90 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
19fa0 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
19fb0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
19fc0 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
19fd0 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  ndValue(Vdbe *v,
19fe0 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
19ff0 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
1a000 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
1a010 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
1a020 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
1a030 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  -1];.    if( 0==
1a040 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
1a050 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
1a060 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1a070 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
1a080 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
1a090 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
1a0a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a0b0 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
1a0c0 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
1a0d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a0e0 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
1a0f0 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
1a100 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
1a110 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1a120 65 6d 53 74 6f 72 65 54 79 70 65 28 28 4d 65 6d  emStoreType((Mem
1a130 20 2a 29 70 52 65 74 29 3b 0a 20 20 20 20 20 20   *)pRet);.      
1a140 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
1a150 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Ret;.    }.  }. 
1a160 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1a170 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51  .** Configure SQ
1a180 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20  L variable iVar 
1a190 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20  so that binding 
1a1a0 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69  a new value to i
1a1b0 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20  t signals.** to 
1a1c0 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69  sqlite3_reoptimi
1a1d0 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65  ze() that re-pre
1a1e0 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65  paring the state
1a1f0 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a  ment may result.
1a200 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71  ** in a better q
1a210 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f  uery plan..*/.vo
1a220 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
1a230 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76  tVarmask(Vdbe *v
1a240 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61  , int iVar){.  a
1a250 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
1a260 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20 29  .  if( iVar>32 )
1a270 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
1a280 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20   = 0xffffffff;. 
1a290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65   }else{.    v->e
1a2a0 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29  xpmask |= ((u32)
1a2b0 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a  1 << (iVar-1));.
1a2c0 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
1a2d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1a2e0 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72  ALTABLE./*.** Tr
1a2f0 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73  ansfer error mes
1a300 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61  sage text from a
1a310 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a  n sqlite3_vtab.z
1a320 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f  ErrMsg (text sto
1a330 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  red.** in memory
1a340 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
1a350 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69  qlite3_malloc) i
1a360 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d  nto a Vdbe.zErrM
1a370 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a  sg (text stored.
1a380 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ** in memory obt
1a390 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1a3a0 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a  e3DbMalloc)..*/.
1a3b0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62  void sqlite3Vtab
1a3c0 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62  ImportErrmsg(Vdb
1a3d0 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74  e *p, sqlite3_vt
1a3e0 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71  ab *pVtab){.  sq
1a3f0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
1a400 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  b;.  sqlite3DbFr
1a410 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
1a420 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
1a430 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
1a440 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45  up(db, pVtab->zE
1a450 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
1a460 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45  3_free(pVtab->zE
1a470 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d  rrMsg);.  pVtab-
1a480 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a  >zErrMsg = 0;.}.
1a490 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1a4a0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1a4b0 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  LE */..#ifdef SQ
1a4c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
1a4d0 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a  PDATE_HOOK../*.*
1a4e0 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
1a4f0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
1a500 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e  NULL, release an
1a510 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73  y allocations as
1a520 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74  sociated .** wit
1a530 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  h the memory cel
1a540 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65  ls in the p->aMe
1a550 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f 20  m[] array. Also 
1a560 66 72 65 65 20 74 68 65 20 55 6e 70 61 63 6b 65  free the Unpacke
1a570 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63  dRecord.** struc
1a580 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75 73 69  ture itself, usi
1a590 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
1a5a0 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ()..**.** This f
1a5b0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
1a5c0 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b 65 64  to free Unpacked
1a5d0 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
1a5e0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
1a5f0 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61 63 6b  * the vdbeUnpack
1a600 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f  Record() functio
1a610 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62 65 61  n found in vdbea
1a620 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pi.c..*/.static 
1a630 76 6f 69 64 20 76 64 62 65 46 72 65 65 55 6e 70  void vdbeFreeUnp
1a640 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20 2a 64  acked(sqlite3 *d
1a650 62 2c 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  b, UnpackedRecor
1a660 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  d *p){.  if( p )
1a670 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1a680 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
1a690 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Field; i++){.   
1a6a0 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26     Mem *pMem = &
1a6b0 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20  p->aMem[i];.    
1a6c0 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c    if( pMem->zMal
1a6d0 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64 62  loc ) sqlite3Vdb
1a6e0 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d  eMemRelease(pMem
1a6f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1a700 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1a710 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1a720 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75  Invoke the pre-u
1a730 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74  pdate hook. If t
1a740 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54 45  his is an UPDATE
1a750 20 6f 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75   or DELETE pre-u
1a760 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74  pdate call,.** t
1a770 68 65 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65  hen cursor passe
1a780 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
1a790 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
1a7a0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77  point to the row
1a7b0 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20   about.** to be 
1a7c0 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65  update or delete
1a7d0 64 2e 20 49 66 20 74 68 65 20 61 70 70 6c 69 63  d. If the applic
1a7e0 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69  ation calls sqli
1a7f0 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c  te3_preupdate_ol
1a800 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75  d(),.** the requ
1a810 69 72 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20  ired value will 
1a820 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
1a830 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20   row the cursor 
1a840 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f  points to..*/.vo
1a850 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
1a860 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56  eUpdateHook(.  V
1a870 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a890 2a 20 56 64 62 65 20 70 72 65 2d 75 70 64 61 74  * Vdbe pre-updat
1a8a0 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65  e hook is invoke
1a8b0 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75  d by */.  VdbeCu
1a8c0 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20  rsor *pCsr,     
1a8d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1a8e0 73 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e  sor to grab old.
1a8f0 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f  * values from */
1a900 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
1a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a920 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53     /* SQLITE_INS
1a930 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
1a940 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74  ELETE */.  const
1a950 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
1a960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1a970 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20  tabase name */. 
1a980 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
1a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9a0 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62   /* Modified tab
1a9b0 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79  le */.  i64 iKey
1a9c0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
1a9d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
1a9e0 61 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a  al key value */.
1a9f0 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20    int iReg      
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa10 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
1aa20 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a  r new.* record *
1aa30 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
1aa40 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36  db = v->db;.  i6
1aa50 34 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70  4 iKey2;.  PreUp
1aa60 64 61 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a  date preupdate;.
1aa70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1aa80 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  bl = pTab->zName
1aa90 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
1aaa0 20 75 38 20 66 61 6b 65 53 6f 72 74 4f 72 64 65   u8 fakeSortOrde
1aab0 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  r = 0;..  assert
1aac0 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65  ( db->pPreUpdate
1aad0 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ==0 );.  memset(
1aae0 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73  &preupdate, 0, s
1aaf0 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74 65 29  izeof(PreUpdate)
1ab00 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c  );.  if( op==SQL
1ab10 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20  ITE_UPDATE ){.  
1ab20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65    iKey2 = v->aMe
1ab30 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 7d  m[iReg].u.i;.  }
1ab40 65 6c 73 65 7b 0a 20 20 20 20 69 4b 65 79 32 20  else{.    iKey2 
1ab50 3d 20 69 4b 65 79 31 3b 0a 20 20 7d 0a 0a 20 20  = iKey1;.  }..  
1ab60 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 46  assert( pCsr->nF
1ab70 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  ield==pTab->nCol
1ab80 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 43 73   .       || (pCs
1ab90 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d  r->nField==pTab-
1aba0 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d 53  >nCol+1 && op==S
1abb0 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20  QLITE_DELETE && 
1abc0 69 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a  iReg==-1).  );..
1abd0 20 20 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20    preupdate.v = 
1abe0 76 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70  v;.  preupdate.p
1abf0 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72  Csr = pCsr;.  pr
1ac00 65 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b  eupdate.op = op;
1ac10 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65  .  preupdate.iNe
1ac20 77 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70  wReg = iReg;.  p
1ac30 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
1ac40 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75  .db = db;.  preu
1ac50 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e  pdate.keyinfo.en
1ac60 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70  c = ENC(db);.  p
1ac70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
1ac80 2e 6e 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e  .nField = pTab->
1ac90 6e 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74  nCol;.  preupdat
1aca0 65 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74 4f  e.keyinfo.aSortO
1acb0 72 64 65 72 20 3d 20 28 75 38 2a 29 26 66 61 6b  rder = (u8*)&fak
1acc0 65 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70 72  eSortOrder;.  pr
1acd0 65 75 70 64 61 74 65 2e 69 4b 65 79 31 20 3d 20  eupdate.iKey1 = 
1ace0 69 4b 65 79 31 3b 0a 20 20 70 72 65 75 70 64 61  iKey1;.  preupda
1acf0 74 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79 32  te.iKey2 = iKey2
1ad00 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 50  ;.  preupdate.iP
1ad10 4b 65 79 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Key = pTab->iPKe
1ad20 79 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65 55 70  y;..  db->pPreUp
1ad30 64 61 74 65 20 3d 20 26 70 72 65 75 70 64 61 74  date = &preupdat
1ad40 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64  e;.  db->xPreUpd
1ad50 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  ateCallback(db->
1ad60 70 50 72 65 55 70 64 61 74 65 41 72 67 2c 20 64  pPreUpdateArg, d
1ad70 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c  b, op, zDb, zTbl
1ad80 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79 32 29 3b  , iKey1, iKey2);
1ad90 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  .  db->pPreUpdat
1ada0 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
1adb0 44 62 46 72 65 65 28 64 62 2c 20 70 72 65 75 70  DbFree(db, preup
1adc0 64 61 74 65 2e 61 52 65 63 6f 72 64 29 3b 0a 20  date.aRecord);. 
1add0 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65   vdbeFreeUnpacke
1ade0 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  d(db, preupdate.
1adf0 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76 64  pUnpacked);.  vd
1ae00 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64  beFreeUnpacked(d
1ae10 62 2c 20 70 72 65 75 70 64 61 74 65 2e 70 4e 65  b, preupdate.pNe
1ae20 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 69 66  wUnpacked);.  if
1ae30 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77  ( preupdate.aNew
1ae40 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1ae50 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
1ae60 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29  sr->nField; i++)
1ae70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1ae80 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 70  dbeMemRelease(&p
1ae90 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d  reupdate.aNew[i]
1aea0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1aeb0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1aec0 72 65 75 70 64 61 74 65 2e 61 4e 65 77 29 3b 0a  reupdate.aNew);.
1aed0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
1aee0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
1aef0 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a  EUPDATE_HOOK */.