/ Hex Artifact Content
Login

Artifact 915fda7ca876aa2df2a13b0621ad0326342c0638:


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 74   char *zTmp;.  t
0780: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
0790: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
07a0: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
07b0: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
07c0: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
07d0: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
07e0: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
07f0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
0800: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
0810: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
0820: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
0830: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
0840: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
0850: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
0860: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61  p;.  pB->isPrepa
0870: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65  reV2 = pA->isPre
0880: 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pareV2;.}../*.**
0890: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65   Resize the Vdbe
08a0: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68  .aOp array so th
08b0: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73  at it is at leas
08c0: 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67 65 72 20  t one op larger 
08d0: 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77 61 73 2e  than .** it was.
08e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74  .**.** If an out
08f0: 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72  -of-memory error
0900: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
0910: 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79  sizing the array
0920: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  , return.** SQLI
0930: 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69  TE_NOMEM. In thi
0940: 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20  s case Vdbe.aOp 
0950: 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f  and Vdbe.nOpAllo
0960: 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63  c remain .** unc
0970: 68 61 6e 67 65 64 20 28 74 68 69 73 20 69 73 20  hanged (this is 
0980: 73 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 63 6f  so that any opco
0990: 64 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f  des already allo
09a0: 63 61 74 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a  cated can be .**
09b0: 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c   correctly deall
09c0: 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
09d0: 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  h the rest of th
09e0: 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74  e Vdbe)..*/.stat
09f0: 69 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 72 72  ic int growOpArr
0a00: 61 79 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 56  ay(Vdbe *v){.  V
0a10: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0a20: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0a30: 72 73 65 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20  rse;.  int nNew 
0a40: 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f  = (p->nOpAlloc ?
0a50: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a   p->nOpAlloc*2 :
0a60: 20 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65   (int)(1024/size
0a70: 6f 66 28 4f 70 29 29 29 3b 0a 20 20 70 4e 65 77  of(Op)));.  pNew
0a80: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
0a90: 6c 6f 63 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f  loc(p->db, v->aO
0aa0: 70 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f  p, nNew*sizeof(O
0ab0: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  p));.  if( pNew 
0ac0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  ){.    p->nOpAll
0ad0: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
0ae0: 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20  llocSize(p->db, 
0af0: 70 4e 65 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29  pNew)/sizeof(Op)
0b00: 3b 0a 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70  ;.    v->aOp = p
0b10: 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  New;.  }.  retur
0b20: 6e 20 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45  n (pNew ? SQLITE
0b30: 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d  _OK : SQLITE_NOM
0b40: 45 4d 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  EM);.}..#ifdef S
0b50: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
0b60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
0b70: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74  ust a convenient
0b80: 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
0b90: 62 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20  breakpoint that 
0ba0: 77 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74  will.** fire aft
0bb0: 65 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69  er each opcode i
0bc0: 73 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64  s inserted and d
0bd0: 69 73 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a  isplayed using.*
0be0: 2a 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61  * "PRAGMA vdbe_a
0bf0: 64 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a  ddoptrace=on"..*
0c00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
0c10: 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f  st_addop_breakpo
0c20: 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  int(void){.  sta
0c30: 74 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  tic int n = 0;. 
0c40: 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   n++;.}.#endif..
0c50: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
0c60: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74  instruction to t
0c70: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72  he list of instr
0c80: 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20  uctions current 
0c90: 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20  in the.** VDBE. 
0ca0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
0cb0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69  ess of the new i
0cc0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
0cd0: 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a  * Parameters:.**
0ce0: 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20  .**    p        
0cf0: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
0d00: 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a  o the VDBE.**.**
0d10: 20 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20      op          
0d20: 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66      The opcode f
0d30: 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  or this instruct
0d40: 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c  ion.**.**    p1,
0d50: 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65   p2, p3      Ope
0d60: 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20  rands.**.** Use 
0d70: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
0d80: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75  esolveLabel() fu
0d90: 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e  nction to fix an
0da0: 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20   address and.** 
0db0: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43  the sqlite3VdbeC
0dc0: 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69  hangeP4() functi
0dd0: 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  on to change the
0de0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
0df0: 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a  .** operand..*/.
0e00: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
0e10: 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69  ddOp3(Vdbe *p, i
0e20: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
0e30: 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a  nt p2, int p3){.
0e40: 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f    int i;.  VdbeO
0e50: 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70  p *pOp;..  i = p
0e60: 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->nOp;.  assert(
0e70: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
0e80: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
0e90: 61 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20  assert( op>0 && 
0ea0: 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28  op<0xff );.  if(
0eb0: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
0ec0: 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69  lloc<=i ){.    i
0ed0: 66 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  f( growOpArray(p
0ee0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
0ef0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
0f00: 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70   p->nOp++;.  pOp
0f10: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
0f20: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28   pOp->opcode = (
0f30: 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35  u8)op;.  pOp->p5
0f40: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20   = 0;.  pOp->p1 
0f50: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20  = p1;.  pOp->p2 
0f60: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  = p2;.  pOp->p3 
0f70: 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  = p3;.  pOp->p4.
0f80: 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34  p = 0;.  pOp->p4
0f90: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
0fa0: 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  D;.#ifdef SQLITE
0fb0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
0fc0: 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e  COMMENTS.  pOp->
0fd0: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65  zComment = 0;.#e
0fe0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
0ff0: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1000: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1010: 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
1020: 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  ace ){.    int j
1030: 6a 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65  j, kk;.    Parse
1040: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
1050: 61 72 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a  arse;.    for(jj
1060: 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49 54 45  =kk=0; jj<SQLITE
1070: 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b  _N_COLCACHE; jj+
1080: 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1090: 20 79 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20   yColCache *x = 
10a0: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
10b0: 65 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 69 66  e + jj;.      if
10c0: 28 20 78 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72  ( x->iLevel>pPar
10d0: 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20  se->iCacheLevel 
10e0: 7c 7c 20 78 2d 3e 69 52 65 67 3d 3d 30 20 29 20  || x->iReg==0 ) 
10f0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1100: 70 72 69 6e 74 66 28 22 20 72 5b 25 64 5d 3d 7b  printf(" r[%d]={
1110: 25 64 3a 25 64 7d 22 2c 20 78 2d 3e 69 52 65 67  %d:%d}", x->iReg
1120: 2c 20 78 2d 3e 69 54 61 62 6c 65 2c 20 78 2d 3e  , x->iTable, x->
1130: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
1140: 6b 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  kk++;.    }.    
1150: 69 66 28 20 6b 6b 20 29 20 70 72 69 6e 74 66 28  if( kk ) printf(
1160: 22 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  "\n");.    sqlit
1170: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
1180: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
1190: 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f  .    test_addop_
11a0: 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20  breakpoint();.  
11b0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
11c0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70  VDBE_PROFILE.  p
11d0: 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  Op->cycles = 0;.
11e0: 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a    pOp->cnt = 0;.
11f0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1200: 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  i;.}.int sqlite3
1210: 56 64 62 65 41 64 64 4f 70 30 28 56 64 62 65 20  VdbeAddOp0(Vdbe 
1220: 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72  *p, int op){.  r
1230: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1240: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30  eAddOp3(p, op, 0
1250: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  , 0, 0);.}.int s
1260: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1270: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1280: 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74  , int p1){.  ret
1290: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
12a0: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
12b0: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
12c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12d0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
12e0: 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
12f0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1300: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1310: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a  op, p1, p2, 0);.
1320: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  }.../*.** Add an
1330: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1340: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1350: 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2e  ue as a pointer.
1360: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1370: 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64 62  dbeAddOp4(.  Vdb
1380: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1390: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f   /* Add the opco
13a0: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f  de to this VM */
13b0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
13c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
13d0: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  w opcode */.  in
13e0: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
13f0: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72    /* The P1 oper
1400: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c  and */.  int p2,
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1420: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a  The P2 operand *
1430: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20  /.  int p3,     
1440: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1450: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  3 operand */.  c
1460: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
1470: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65     /* The P4 ope
1480: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
1490: 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  type          /*
14a0: 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65   P4 operand type
14b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64   */.){.  int add
14c0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
14d0: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
14e0: 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69   p2, p3);.  sqli
14f0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
1500: 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70 34  p, addr, zP4, p4
1510: 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  type);.  return 
1520: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  addr;.}../*.** A
1530: 64 64 20 61 6e 20 4f 50 5f 50 61 72 73 65 53 63  dd an OP_ParseSc
1540: 68 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54 68  hema opcode.  Th
1550: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 62 72  is routine is br
1560: 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a  oken out from.**
1570: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1580: 70 34 28 29 20 73 69 6e 63 65 20 69 74 20 6e 65  p4() since it ne
1590: 65 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64  eds to also need
15a0: 73 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74  s to mark all bt
15b0: 72 65 65 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e  rees.** as havin
15c0: 67 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a  g been used..**.
15d0: 2a 2a 20 54 68 65 20 7a 57 68 65 72 65 20 73 74  ** The zWhere st
15e0: 72 69 6e 67 20 6d 75 73 74 20 68 61 76 65 20 62  ring must have b
15f0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  een obtained fro
1600: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
1610: 28 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ()..** This rout
1620: 69 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77  ine will take ow
1630: 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 61  nership of the a
1640: 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e  llocated memory.
1650: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1660: 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
1670: 6d 61 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  maOp(Vdbe *p, in
1680: 74 20 69 44 62 2c 20 63 68 61 72 20 2a 7a 57 68  t iDb, char *zWh
1690: 65 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20  ere){.  int j;. 
16a0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
16b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
16c0: 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c   OP_ParseSchema,
16d0: 20 69 44 62 2c 20 30 2c 20 30 29 3b 0a 20 20 73   iDb, 0, 0);.  s
16e0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
16f0: 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 57 68 65  P4(p, addr, zWhe
1700: 72 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  re, P4_DYNAMIC);
1710: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d  .  for(j=0; j<p-
1720: 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73  >db->nDb; j++) s
1730: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
1740: 72 65 65 28 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a  ree(p, j);.}../*
1750: 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64  .** Add an opcod
1760: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
1770: 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20  the p4 value as 
1780: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69  an integer..*/.i
1790: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
17a0: 64 4f 70 34 49 6e 74 28 0a 20 20 56 64 62 65 20  dOp4Int(.  Vdbe 
17b0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
17c0: 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65  * Add the opcode
17d0: 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   to this VM */. 
17e0: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
17f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
1800: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  opcode */.  int 
1810: 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p1,             
1820: 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e  /* The P1 operan
1830: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20  d */.  int p2,  
1840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1850: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P2 operand */.
1860: 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20    int p3,       
1870: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20        /* The P3 
1880: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1890: 20 70 34 20 20 20 20 20 20 20 20 20 20 20 20 20   p4             
18a0: 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61   /* The P4 opera
18b0: 6e 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  nd as an integer
18c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64   */.){.  int add
18d0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
18e0: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
18f0: 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69   p2, p3);.  sqli
1900: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
1910: 70 2c 20 61 64 64 72 2c 20 53 51 4c 49 54 45 5f  p, addr, SQLITE_
1920: 49 4e 54 5f 54 4f 5f 50 54 52 28 70 34 29 2c 20  INT_TO_PTR(p4), 
1930: 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 72 65 74  P4_INT32);.  ret
1940: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
1950: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
1960: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66  symbolic label f
1970: 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  or an instructio
1980: 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  n that has yet t
1990: 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20  o be.** coded.  
19a0: 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  The symbolic lab
19b0: 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  el is really jus
19c0: 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  t a negative num
19d0: 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62  ber.  The.** lab
19e0: 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20 61  el can be used a
19f0: 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 6f  s the P2 value o
1a00: 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20  f an operation. 
1a10: 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20   Later, when.** 
1a20: 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65 73  the label is res
1a30: 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63 69  olved to a speci
1a40: 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68 65  fic address, the
1a50: 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a   VDBE will scan.
1a60: 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20 6f  ** through its o
1a70: 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  peration list an
1a80: 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c  d change all val
1a90: 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68 20  ues of P2 which 
1aa0: 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62  match.** the lab
1ab0: 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73 6f  el into the reso
1ac0: 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a  lved address..**
1ad0: 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e 6f  .** The VDBE kno
1ae0: 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61 6c  ws that a P2 val
1af0: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62 65  ue is a label be
1b00: 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72 65  cause labels are
1b10: 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61 74  .** always negat
1b20: 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75 65  ive and P2 value
1b30: 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74 6f  s are suppose to
1b40: 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   be non-negative
1b50: 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65  ..** Hence, a ne
1b60: 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20  gative P2 value 
1b70: 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74 20  is a label that 
1b80: 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72 65  has yet to be re
1b90: 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65  solved..**.** Ze
1ba0: 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ro is returned i
1bb0: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  f a malloc() fai
1bc0: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
1bd0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1be0: 56 64 62 65 20 2a 76 29 7b 0a 20 20 50 61 72 73  Vdbe *v){.  Pars
1bf0: 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65  e *p = v->pParse
1c00: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e 6e  ;.  int i = p->n
1c10: 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72  Label++;.  asser
1c20: 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( v->magic==VDB
1c30: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
1c40: 20 20 69 66 28 20 28 69 20 26 20 28 69 2d 31 29    if( (i & (i-1)
1c50: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61  )==0 ){.    p->a
1c60: 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 44  Label = sqlite3D
1c70: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  bReallocOrFree(p
1c80: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c  ->db, p->aLabel,
1c90: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 20 20 20 20 20 20 28 69 2a 32 2b 31 29           (i*2+1)
1cc0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65  *sizeof(p->aLabe
1cd0: 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  l[0]));.  }.  if
1ce0: 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20  ( p->aLabel ){. 
1cf0: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20     p->aLabel[i] 
1d00: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
1d10: 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn -1-i;.}../*.*
1d20: 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20  * Resolve label 
1d30: 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64  "x" to be the ad
1d40: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
1d50: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
1d60: 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e  .** be inserted.
1d70: 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20    The parameter 
1d80: 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65  "x" must have be
1d90: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
1da0: 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  .** a prior call
1db0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d   to sqlite3VdbeM
1dc0: 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76  akeLabel()..*/.v
1dd0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
1de0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
1df0: 20 2a 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50   *v, int x){.  P
1e00: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
1e10: 72 73 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d  rse;.  int j = -
1e20: 31 2d 78 3b 0a 20 20 61 73 73 65 72 74 28 20 76  1-x;.  assert( v
1e30: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
1e40: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
1e50: 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65  sert( j<p->nLabe
1e60: 6c 20 29 3b 0a 20 20 69 66 28 20 6a 3e 3d 30 20  l );.  if( j>=0 
1e70: 26 26 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  && p->aLabel ){.
1e80: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d      p->aLabel[j]
1e90: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d   = v->nOp;.  }.}
1ea0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65  ../*.** Mark the
1eb0: 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61   VDBE as one tha
1ec0: 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75  t can only be ru
1ed0: 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76  n one time..*/.v
1ee0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
1ef0: 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20  unOnlyOnce(Vdbe 
1f00: 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c  *p){.  p->runOnl
1f10: 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69  yOnce = 1;.}..#i
1f20: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1f30: 47 20 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65  G /* sqlite3Asse
1f40: 72 74 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67  rtMayAbort() log
1f50: 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ic */../*.** The
1f60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20   following type 
1f70: 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  and function are
1f80: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
1f90: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63   through all opc
1fa0: 6f 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62  odes.** in a Vdb
1fb0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61  e main program a
1fc0: 6e 64 20 65 61 63 68 20 6f 66 20 74 68 65 20 73  nd each of the s
1fd0: 75 62 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69  ub-programs (tri
1fe0: 67 67 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a  ggers) it may .*
1ff0: 2a 20 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c  * invoke directl
2000: 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e  y or indirectly.
2010: 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73   It should be us
2020: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
2030: 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  *.**   Op *pOp;.
2040: 2a 2a 20 20 20 56 64 62 65 4f 70 49 74 65 72 20  **   VdbeOpIter 
2050: 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d  sIter;.**.**   m
2060: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
2070: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
2080: 0a 2a 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20  .**   sIter.v = 
2090: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
20b0: 20 76 20 69 73 20 6f 66 20 74 79 70 65 20 56 64   v is of type Vd
20c0: 62 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28  be* .**   while(
20d0: 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65   (pOp = opIterNe
20e0: 78 74 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a  xt(&sIter)) ){.*
20f0: 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65  *     // Do some
2100: 74 68 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a  thing with pOp.*
2110: 2a 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74  *   }.**   sqlit
2120: 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
2130: 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a  sIter.apSub);.**
2140: 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72   .*/.typedef str
2150: 75 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 56  uct VdbeOpIter V
2160: 64 62 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63  dbeOpIter;.struc
2170: 74 20 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20  t VdbeOpIter {. 
2180: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
2190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
21a0: 64 62 65 20 74 6f 20 69 74 65 72 61 74 65 20 74  dbe to iterate t
21b0: 68 72 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64  hrough the opcod
21c0: 65 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72  es of */.  SubPr
21d0: 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20  ogram **apSub;  
21e0: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
21f0: 66 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f  f subprograms */
2200: 0a 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20  .  int nSub;    
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2220: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
2230: 65 73 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20  es in apSub */. 
2240: 20 69 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20   int iAddr;     
2250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2260: 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69  ddress of next i
2270: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65  nstruction to re
2280: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53  turn */.  int iS
2290: 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ub;             
22a0: 20 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e       /* 0 = main
22b0: 20 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69   program, 1 = fi
22c0: 72 73 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  rst sub-program 
22d0: 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69  etc. */.};.stati
22e0: 63 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74  c Op *opIterNext
22f0: 28 56 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b  (VdbeOpIter *p){
2300: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e  .  Vdbe *v = p->
2310: 76 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20  v;.  Op *pRet = 
2320: 30 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20  0;.  Op *aOp;.  
2330: 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20  int nOp;..  if( 
2340: 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62  p->iSub<=p->nSub
2350: 20 29 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e   ){..    if( p->
2360: 69 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iSub==0 ){.     
2370: 20 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20   aOp = v->aOp;. 
2380: 20 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f       nOp = v->nO
2390: 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
23a0: 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53      aOp = p->apS
23b0: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61  ub[p->iSub-1]->a
23c0: 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20  Op;.      nOp = 
23d0: 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62  p->apSub[p->iSub
23e0: 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  -1]->nOp;.    }.
23f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
2400: 41 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20  Addr<nOp );..   
2410: 20 70 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e   pRet = &aOp[p->
2420: 69 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69  iAddr];.    p->i
2430: 41 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Addr++;.    if( 
2440: 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b  p->iAddr==nOp ){
2450: 0a 20 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b  .      p->iSub++
2460: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72  ;.      p->iAddr
2470: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20   = 0;.    }.  . 
2480: 20 20 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74     if( pRet->p4t
2490: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
24a0: 41 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  AM ){.      int 
24b0: 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62  nByte = (p->nSub
24c0: 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  +1)*sizeof(SubPr
24d0: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69  ogram*);.      i
24e0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
24f0: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20  j=0; j<p->nSub; 
2500: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
2510: 28 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70  ( p->apSub[j]==p
2520: 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  Ret->p4.pProgram
2530: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2540: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70  }.      if( j==p
2550: 2d 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ->nSub ){.      
2560: 20 20 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c    p->apSub = sql
2570: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
2580: 72 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70  ree(v->db, p->ap
2590: 53 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  Sub, nByte);.   
25a0: 20 20 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53       if( !p->apS
25b0: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
25c0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRet = 0;.      
25d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25e0: 20 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e     p->apSub[p->n
25f0: 53 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70  Sub++] = pRet->p
2600: 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20  4.pProgram;.    
2610: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2620: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2630: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
2640: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 70 72   Check if the pr
2650: 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20  ogram stored in 
2660: 74 68 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65  the VM associate
2670: 64 20 77 69 74 68 20 70 50 61 72 73 65 20 6d 61  d with pParse ma
2680: 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42  y.** throw an AB
2690: 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63  ORT exception (c
26a0: 61 75 73 69 6e 67 20 74 68 65 20 73 74 61 74 65  ausing the state
26b0: 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e  ment, but not en
26c0: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
26d0: 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  .** to be rolled
26e0: 20 62 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e   back). This con
26f0: 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69  dition is true i
2700: 66 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  f the main progr
2710: 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62  am or any.** sub
2720: 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69  -programs contai
2730: 6e 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  ns any of the fo
2740: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2750: 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68   *  OP_Halt with
2760: 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54   P1=SQLITE_CONST
2770: 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f  RAINT and P2=OE_
2780: 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f  Abort..**   *  O
2790: 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74  P_HaltIfNull wit
27a0: 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  h P1=SQLITE_CONS
27b0: 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45  TRAINT and P2=OE
27c0: 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20  _Abort..**   *  
27d0: 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20  OP_Destroy.**   
27e0: 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a  *  OP_VUpdate.**
27f0: 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65     *  OP_VRename
2800: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f  .**   *  OP_FkCo
2810: 75 6e 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30  unter with P2==0
2820: 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65   (immediate fore
2830: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
2840: 6e 74 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63  nt).**.** Then c
2850: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
2860: 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d 61 79  lue of Parse.may
2870: 41 62 6f 72 74 20 69 73 20 74 72 75 65 20 69 66  Abort is true if
2880: 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79   an.** ABORT may
2890: 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66   be thrown, or f
28a0: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20  alse otherwise. 
28b0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
28c0: 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c  t does.** match,
28d0: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
28e0: 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ise. This functi
28f0: 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  on is intended t
2900: 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a 20  o be used as.** 
2910: 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65 72  part of an asser
2920: 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74  t statement in t
2930: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d  he compiler. Sim
2940: 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ilar to:.**.**  
2950: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2960: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
2970: 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  rt(pParse->pVdbe
2980: 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f  , pParse->mayAbo
2990: 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71  rt) );.*/.int sq
29a0: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d  lite3VdbeAssertM
29b0: 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a 76 2c  ayAbort(Vdbe *v,
29c0: 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a   int mayAbort){.
29d0: 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74 20 3d    int hasAbort =
29e0: 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20   0;.  Op *pOp;. 
29f0: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
2a00: 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74  r;.  memset(&sIt
2a10: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49  er, 0, sizeof(sI
2a20: 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76  ter));.  sIter.v
2a30: 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = v;..  while( 
2a40: 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78  (pOp = opIterNex
2a50: 74 28 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b  t(&sIter))!=0 ){
2a60: 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20  .    int opcode 
2a70: 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20  = pOp->opcode;. 
2a80: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
2a90: 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63  P_Destroy || opc
2aa0: 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20  ode==OP_VUpdate 
2ab0: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52  || opcode==OP_VR
2ac0: 65 6e 61 6d 65 20 0a 23 69 66 6e 64 65 66 20 53  ename .#ifndef S
2ad0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
2ae0: 47 4e 5f 4b 45 59 0a 20 20 20 20 20 7c 7c 20 28  GN_KEY.     || (
2af0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75  opcode==OP_FkCou
2b00: 6e 74 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d  nter && pOp->p1=
2b10: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31  =0 && pOp->p2==1
2b20: 29 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7c  ) .#endif.     |
2b30: 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48  | ((opcode==OP_H
2b40: 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  alt || opcode==O
2b50: 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20  P_HaltIfNull) . 
2b60: 20 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e 70       && ((pOp->p
2b70: 31 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  1&0xff)==SQLITE_
2b80: 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f  CONSTRAINT && pO
2b90: 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29  p->p2==OE_Abort)
2ba0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68  ).    ){.      h
2bb0: 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20  asAbort = 1;.   
2bc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2bd0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
2be0: 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72  ree(v->db, sIter
2bf0: 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52  .apSub);..  /* R
2c00: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 68 61  eturn true if ha
2c10: 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74  sAbort==mayAbort
2c20: 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63  . Or if a malloc
2c30: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
2c40: 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f  d..  ** If mallo
2c50: 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74  c failed, then t
2c60: 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20  he while() loop 
2c70: 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61  above may not ha
2c80: 76 65 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a  ve iterated.  **
2c90: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63   through all opc
2ca0: 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72  odes and hasAbor
2cb0: 74 20 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63  t may be set inc
2cc0: 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e  orrectly. Return
2cd0: 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74  .  ** true for t
2ce0: 68 69 73 20 63 61 73 65 20 74 6f 20 70 72 65 76  his case to prev
2cf0: 65 6e 74 20 74 68 65 20 61 73 73 65 72 74 28 29  ent the assert()
2d00: 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20   in the callers 
2d10: 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20  frame.  ** from 
2d20: 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72  failing.  */.  r
2d30: 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d  eturn ( v->db->m
2d40: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68  allocFailed || h
2d50: 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72  asAbort==mayAbor
2d60: 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  t );.}.#endif /*
2d70: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2d 20   SQLITE_DEBUG - 
2d80: 74 68 65 20 73 71 6c 69 74 65 33 41 73 73 65 72  the sqlite3Asser
2d90: 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75 6e 63  tMayAbort() func
2da0: 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c  tion */../*.** L
2db0: 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20  oop through the 
2dc0: 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20  program looking 
2dd0: 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20 74 68  for P2 values th
2de0: 61 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 0a  at are negative.
2df0: 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72  ** on jump instr
2e00: 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 73  uctions.  Each s
2e10: 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c  uch value is a l
2e20: 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74  abel.  Resolve t
2e30: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73  he.** label by s
2e40: 65 74 74 69 6e 67 20 74 68 65 20 50 32 20 76 61  etting the P2 va
2e50: 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65  lue to its corre
2e60: 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ct non-zero valu
2e70: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
2e80: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2e90: 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f  once after all o
2ea0: 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e  pcodes have been
2eb0: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
2ec0: 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46   Variable *pMaxF
2ed0: 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 20 74  uncArgs is set t
2ee0: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  o the maximum va
2ef0: 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72  lue of any P2 ar
2f00: 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e  gument .** to an
2f10: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50   OP_Function, OP
2f20: 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56  _AggStep or OP_V
2f30: 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54  Filter opcode. T
2f40: 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 0a  his is used by .
2f50: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  ** sqlite3VdbeMa
2f60: 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a  keReady() to siz
2f70: 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  e the Vdbe.apArg
2f80: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  [] array..**.** 
2f90: 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73 20 66  The Op.opflags f
2fa0: 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e 20 61  ield is set on a
2fb0: 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73  ll opcodes..*/.s
2fc0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c  tatic void resol
2fd0: 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65 20  veP2Values(Vdbe 
2fe0: 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e  *p, int *pMaxFun
2ff0: 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b  cArgs){.  int i;
3000: 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20  .  int nMaxArgs 
3010: 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 3b  = *pMaxFuncArgs;
3020: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61  .  Op *pOp;.  Pa
3030: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
3040: 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a  >pParse;.  int *
3050: 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73 65 2d  aLabel = pParse-
3060: 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65  >aLabel;.  p->re
3070: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d  adOnly = 1;.  p-
3080: 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30 3b 0a  >bIsReader = 0;.
3090: 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70    for(pOp=p->aOp
30a0: 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e  , i=p->nOp-1; i>
30b0: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b  =0; i--, pOp++){
30c0: 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d  .    u8 opcode =
30d0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20   pOp->opcode;.. 
30e0: 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73     /* NOTE: Be s
30f0: 75 72 65 20 74 6f 20 75 70 64 61 74 65 20 6d 6b  ure to update mk
3100: 6f 70 63 6f 64 65 68 2e 61 77 6b 20 77 68 65 6e  opcodeh.awk when
3110: 20 61 64 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76   adding or remov
3120: 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 73 65 73  ing.    ** cases
3130: 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69 74 63   from this switc
3140: 68 21 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68  h! */.    switch
3150: 28 20 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20  ( opcode ){.    
3160: 20 20 63 61 73 65 20 4f 50 5f 46 75 6e 63 74 69    case OP_Functi
3170: 6f 6e 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  on:.      case O
3180: 50 5f 41 67 67 53 74 65 70 3a 20 7b 0a 20 20 20  P_AggStep: {.   
3190: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35       if( pOp->p5
31a0: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
31b0: 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a  Args = pOp->p5;.
31c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
31d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
31e0: 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  e OP_Transaction
31f0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
3200: 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e  pOp->p2!=0 ) p->
3210: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
3220: 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68        /* fall th
3230: 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ru */.      }.  
3240: 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74 6f      case OP_Auto
3250: 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 63 61  Commit:.      ca
3260: 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a  se OP_Savepoint:
3270: 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 49   {.        p->bI
3280: 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  sReader = 1;.   
3290: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
32a0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
32b0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
32c0: 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70    case OP_Checkp
32d0: 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20  oint:.#endif.   
32e0: 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75     case OP_Vacuu
32f0: 6d 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  m:.      case OP
3300: 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a  _JournalMode: {.
3310: 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f          p->readO
3320: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nly = 0;.       
3330: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20   p->bIsReader = 
3340: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
3350: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
3360: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
3370: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
3380: 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65   case OP_VUpdate
3390: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
33a0: 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73  pOp->p2>nMaxArgs
33b0: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f   ) nMaxArgs = pO
33c0: 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 62  p->p2;.        b
33d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
33e0: 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46 69 6c      case OP_VFil
33f0: 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ter: {.        i
3400: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  nt n;.        as
3410: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69  sert( p->nOp - i
3420: 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 20   >= 3 );.       
3430: 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
3440: 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65  .opcode==OP_Inte
3450: 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 6e  ger );.        n
3460: 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20   = pOp[-1].p1;. 
3470: 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61         if( n>nMa
3480: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
3490: 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 62 72   = n;.        br
34a0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  eak;.      }.#en
34b0: 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20 4f  dif.      case O
34c0: 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 63 61  P_Next:.      ca
34d0: 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e  se OP_NextIfOpen
34e0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  :.      case OP_
34f0: 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20  SorterNext: {.  
3500: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41        pOp->p4.xA
3510: 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  dvance = sqlite3
3520: 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20  BtreeNext;.     
3530: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3540: 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20   P4_ADVANCE;.   
3550: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3560: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f    }.      case O
3570: 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20 63 61  P_Prev:.      ca
3580: 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e  se OP_PrevIfOpen
3590: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  : {.        pOp-
35a0: 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73  >p4.xAdvance = s
35b0: 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
35c0: 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ous;.        pOp
35d0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
35e0: 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62  VANCE;.        b
35f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
3600: 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f 70    }..    pOp->op
3610: 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 4f  flags = sqlite3O
3620: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f 70  pcodeProperty[op
3630: 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 20 28  code];.    if( (
3640: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f  pOp->opflags & O
3650: 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26  PFLG_JUMP)!=0 &&
3660: 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20   pOp->p2<0 ){.  
3670: 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70      assert( -1-p
3680: 4f 70 2d 3e 70 32 3c 70 50 61 72 73 65 2d 3e 6e  Op->p2<pParse->n
3690: 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 70  Label );.      p
36a0: 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b  Op->p2 = aLabel[
36b0: 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20  -1-pOp->p2];.   
36c0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
36d0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 50  DbFree(p->db, pP
36e0: 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  arse->aLabel);. 
36f0: 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20   pParse->aLabel 
3700: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
3710: 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d  Label = 0;.  *pM
3720: 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61  axFuncArgs = nMa
3730: 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72 74 28  xArgs;.  assert(
3740: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21 3d 30   p->bIsReader!=0
3750: 20 7c 7c 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   || p->btreeMask
3760: 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
3770: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
3780: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
3790: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
37a0: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e   inserted..*/.in
37b0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
37c0: 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70  rentAddr(Vdbe *p
37d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
37e0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
37f0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75  C_INIT );.  retu
3800: 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a  rn p->nOp;.}../*
3810: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3820: 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
3830: 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79  ter to the array
3840: 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f   of opcodes asso
3850: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
3860: 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61  he Vdbe passed a
3870: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
3880: 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20  ment. It is the 
3890: 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69  callers responsi
38a0: 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72  bility.** to arr
38b0: 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65 74  ange for the ret
38c0: 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62  urned array to b
38d0: 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
38e0: 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a  ed using the .**
38f0: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
3900: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  () function..**.
3910: 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
3920: 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65  ing, *pnOp is se
3930: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
3940: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
3950: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72  e returned.** ar
3960: 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61  ray. Also, *pnMa
3970: 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20 74  xArg is set to t
3980: 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73  he larger of its
3990: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61   current value a
39a0: 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  nd .** the numbe
39b0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
39c0: 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d  the Vdbe.apArg[]
39d0: 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64 20   array required 
39e0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 0a  to execute the .
39f0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67  ** returned prog
3a00: 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ram..*/.VdbeOp *
3a10: 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f  sqlite3VdbeTakeO
3a20: 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20  pArray(Vdbe *p, 
3a30: 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a  int *pnOp, int *
3a40: 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62  pnMaxArg){.  Vdb
3a50: 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f  eOp *aOp = p->aO
3a60: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70  p;.  assert( aOp
3a70: 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   && !p->db->mall
3a80: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f  ocFailed );..  /
3a90: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c  * Check that sql
3aa0: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
3ab0: 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c  e() was not call
3ac0: 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f  ed on this VM */
3ad0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 74  .  assert( p->bt
3ae0: 72 65 65 4d 61 73 6b 3d 3d 30 20 29 3b 0a 0a 20  reeMask==0 );.. 
3af0: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
3b00: 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20  (p, pnMaxArg);. 
3b10: 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b   *pnOp = p->nOp;
3b20: 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20  .  p->aOp = 0;. 
3b30: 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a   return aOp;.}..
3b40: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c  /*.** Add a whol
3b50: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74  e list of operat
3b60: 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72  ions to the oper
3b70: 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65  ation stack.  Re
3b80: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72  turn the.** addr
3b90: 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74  ess of the first
3ba0: 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64   operation added
3bb0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
3bc0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64  VdbeAddOpList(Vd
3bd0: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20  be *p, int nOp, 
3be0: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
3bf0: 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64   *aOp){.  int ad
3c00: 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  dr;.  assert( p-
3c10: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
3c20: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
3c30: 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20   p->nOp + nOp > 
3c40: 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c  p->pParse->nOpAl
3c50: 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72 72  loc && growOpArr
3c60: 61 79 28 70 29 20 29 7b 0a 20 20 20 20 72 65 74  ay(p) ){.    ret
3c70: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64  urn 0;.  }.  add
3c80: 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  r = p->nOp;.  if
3c90: 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29 20  ( ALWAYS(nOp>0) 
3ca0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
3cb0: 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e    VdbeOpList con
3cc0: 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20  st *pIn = aOp;. 
3cd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
3ce0: 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a  p; i++, pIn++){.
3cf0: 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20 70        int p2 = p
3d00: 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56 64  In->p2;.      Vd
3d10: 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d  beOp *pOut = &p-
3d20: 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20  >aOp[i+addr];.  
3d30: 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65      pOut->opcode
3d40: 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a   = pIn->opcode;.
3d50: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d        pOut->p1 =
3d60: 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20   pIn->p1;.      
3d70: 69 66 28 20 70 32 3c 30 20 29 7b 0a 20 20 20 20  if( p2<0 ){.    
3d80: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
3d90: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
3da0: 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 5d 20  y[pOut->opcode] 
3db0: 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 20 29 3b 0a  & OPFLG_JUMP );.
3dc0: 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32          pOut->p2
3dd0: 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28 70   = addr + ADDR(p
3de0: 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  2);.      }else{
3df0: 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  .        pOut->p
3e00: 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a  2 = p2;.      }.
3e10: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d        pOut->p3 =
3e20: 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20   pIn->p3;.      
3e30: 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50  pOut->p4type = P
3e40: 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20  4_NOTUSED;.     
3e50: 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b   pOut->p4.p = 0;
3e60: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20  .      pOut->p5 
3e70: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
3e80: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
3e90: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20  N_COMMENTS.     
3ea0: 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20   pOut->zComment 
3eb0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
3ec0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
3ed0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d        if( p->db-
3ee0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
3ef0: 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
3f00: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3f10: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20  3VdbePrintOp(0, 
3f20: 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b  i+addr, &p->aOp[
3f30: 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20  i+addr]);.      
3f40: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
3f50: 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70     p->nOp += nOp
3f60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
3f70: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ddr;.}../*.** Ch
3f80: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
3f90: 66 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64  f the P1 operand
3fa0: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
3fb0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
3fc0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3fd0: 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61  useful when a la
3fe0: 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  rge program is l
3ff0: 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20  oaded from a.** 
4000: 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69  static array usi
4010: 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ng sqlite3VdbeAd
4020: 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77  dOpList but we w
4030: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a  ant to make a.**
4040: 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67   few minor chang
4050: 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  es to the progra
4060: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
4070: 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 56  e3VdbeChangeP1(V
4080: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
4090: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
40a0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
40b0: 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70  if( ((u32)p->nOp
40c0: 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d  )>addr ){.    p-
40d0: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20  >aOp[addr].p1 = 
40e0: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
40f0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
4100: 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65  ue of the P2 ope
4110: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
4120: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
4130: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4140: 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73   is useful for s
4150: 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65  etting a jump de
4160: 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  stination..*/.vo
4170: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
4180: 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20  angeP2(Vdbe *p, 
4190: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
41a0: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
41b0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33  =0 );.  if( ((u3
41c0: 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29  2)p->nOp)>addr )
41d0: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
41e0: 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p2 = val;.  }
41f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
4200: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
4210: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P3 operand for
4220: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
4230: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
4240: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4250: 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33  geP3(Vdbe *p, u3
4260: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
4270: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
4280: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29   );.  if( ((u32)
4290: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a  p->nOp)>addr ){.
42a0: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
42b0: 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p3 = val;.  }.}
42c0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
42d0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
42e0: 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74  P5 operand for t
42f0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
4300: 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74  .** added operat
4310: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4320: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
4330: 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c  (Vdbe *p, u8 val
4340: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
4350: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  0 );.  if( p->aO
4360: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
4370: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20   p->nOp>0 );.   
4380: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
4390: 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p5 = val;.  }.
43a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
43b0: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  the P2 operand o
43c0: 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  f instruction ad
43d0: 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  dr so that it po
43e0: 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61  ints to.** the a
43f0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
4400: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
4410: 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76  o be coded..*/.v
4420: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a  oid sqlite3VdbeJ
4430: 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c  umpHere(Vdbe *p,
4440: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 69 66   int addr){.  if
4450: 28 20 41 4c 57 41 59 53 28 61 64 64 72 3e 3d 30  ( ALWAYS(addr>=0
4460: 29 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43  ) ) sqlite3VdbeC
4470: 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c  hangeP2(p, addr,
4480: 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a   p->nOp);.}.../*
4490: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
44a0: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75   FuncDef structu
44b0: 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c  re is ephemeral,
44c0: 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20   then free it.  
44d0: 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65  If.** the FuncDe
44e0: 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61  f is not epherma
44f0: 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69  l, then do nothi
4500: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
4510: 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c  id freeEphemeral
4520: 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  Function(sqlite3
4530: 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70   *db, FuncDef *p
4540: 44 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  Def){.  if( ALWA
4550: 59 53 28 70 44 65 66 29 20 26 26 20 28 70 44 65  YS(pDef) && (pDe
4560: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
4570: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d  QLITE_FUNC_EPHEM
4580: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
4590: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
45a0: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ef);.  }.}..stat
45b0: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
45c0: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
45d0: 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a  *, Op *, int);..
45e0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50  /*.** Delete a P
45f0: 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73  4 value if neces
4600: 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sary..*/.static 
4610: 76 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69  void freeP4(sqli
4620: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74  te3 *db, int p4t
4630: 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a  ype, void *p4){.
4640: 20 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20    if( p4 ){.    
4650: 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20  assert( db );.  
4660: 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65    switch( p4type
4670: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50   ){.      case P
4680: 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61  4_REAL:.      ca
4690: 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20  se P4_INT64:.   
46a0: 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d     case P4_DYNAM
46b0: 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  IC:.      case P
46c0: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
46d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
46e0: 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20  ree(db, p4);.   
46f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4700: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4710: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
4720: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
4730: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
4740: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
4750: 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29  ef((KeyInfo*)p4)
4760: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4770: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
4780: 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20  ase P4_MPRINTF: 
4790: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
47a0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
47b0: 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  0 ) sqlite3_free
47c0: 28 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (p4);.        br
47d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
47e0: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
47f0: 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72  EF: {.        fr
4800: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
4810: 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66  ion(db, (FuncDef
4820: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  *)p4);.        b
4830: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4840: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
4850: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   {.        if( d
4860: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
4870: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
4880: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
4890: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
48a0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  )p4);.        }e
48b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d  lse{.          M
48c0: 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34  em *p = (Mem*)p4
48d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
48e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
48f0: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
4900: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4910: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  ee(db, p);.     
4920: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
4930: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4940: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a    case P4_VTAB :
4950: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   {.        if( d
4960: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
4970: 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  =0 ) sqlite3Vtab
4980: 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a  Unlock((VTable *
4990: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
49a0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
49b0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
49c0: 46 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61  Free the space a
49d0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70  llocated for aOp
49e0: 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75   and any p4 valu
49f0: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
4a00: 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20   the.** opcodes 
4a10: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
4a20: 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20  . If aOp is not 
4a30: 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d  NULL it is assum
4a40: 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a  ed to contain .*
4a50: 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a  * nOp entries. .
4a60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
4a70: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
4a80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a  qlite3 *db, Op *
4a90: 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20  aOp, int nOp){. 
4aa0: 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20   if( aOp ){.    
4ab0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72  Op *pOp;.    for
4ac0: 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61  (pOp=aOp; pOp<&a
4ad0: 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b  Op[nOp]; pOp++){
4ae0: 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62  .      freeP4(db
4af0: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
4b00: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65  Op->p4.p);.#ifde
4b10: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4b20: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
4b30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
4b40: 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43  Free(db, pOp->zC
4b50: 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20  omment);.#endif 
4b60: 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20      .    }.  }. 
4b70: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4b80: 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  b, aOp);.}../*.*
4b90: 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72  * Link the SubPr
4ba0: 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73  ogram object pas
4bb0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
4bc0: 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20  d argument into 
4bd0: 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69  the linked.** li
4be0: 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50  st at Vdbe.pSubP
4bf0: 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73  rogram. This lis
4c00: 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c  t is used to del
4c10: 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67  ete all sub-prog
4c20: 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77  ram.** objects w
4c30: 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f  hen the VM is no
4c40: 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
4c50: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4c60: 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67  3VdbeLinkSubProg
4c70: 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c  ram(Vdbe *pVdbe,
4c80: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b   SubProgram *p){
4c90: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56  .  p->pNext = pV
4ca0: 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20  dbe->pProgram;. 
4cb0: 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d   pVdbe->pProgram
4cc0: 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = p;.}../*.** C
4cd0: 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65  hange the opcode
4ce0: 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50   at addr into OP
4cf0: 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71  _Noop.*/.void sq
4d00: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
4d10: 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69  oNoop(Vdbe *p, i
4d20: 6e 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20  nt addr){.  if( 
4d30: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64  p->aOp ){.    Vd
4d40: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e  beOp *pOp = &p->
4d50: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73  aOp[addr];.    s
4d60: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
4d70: 64 62 3b 0a 20 20 20 20 66 72 65 65 50 34 28 64  db;.    freeP4(d
4d80: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
4d90: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20  pOp->p4.p);.    
4da0: 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73  memset(pOp, 0, s
4db0: 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a  izeof(pOp[0]));.
4dc0: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
4dd0: 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69  = OP_Noop;.    i
4de0: 66 28 20 61 64 64 72 3d 3d 70 2d 3e 6e 4f 70 2d  f( addr==p->nOp-
4df0: 31 20 29 20 70 2d 3e 6e 4f 70 2d 2d 3b 0a 20 20  1 ) p->nOp--;.  
4e00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  }.}../*.** Remov
4e10: 65 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64  e the last opcod
4e20: 65 20 69 6e 73 65 72 74 65 64 0a 2a 2f 0a 76 6f  e inserted.*/.vo
4e30: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
4e40: 6c 65 74 65 4c 61 73 74 4f 70 63 6f 64 65 28 56  leteLastOpcode(V
4e50: 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 6e 4f  dbe *p){.  p->nO
4e60: 70 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  p--;.}../*.** Ch
4e70: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
4e80: 66 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  f the P4 operand
4e90: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
4ea0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
4eb0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4ec0: 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61  useful when a la
4ed0: 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  rge program is l
4ee0: 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20  oaded from a.** 
4ef0: 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69  static array usi
4f00: 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ng sqlite3VdbeAd
4f10: 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77  dOpList but we w
4f20: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a  ant to make a.**
4f30: 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67   few minor chang
4f40: 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  es to the progra
4f50: 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30  m..**.** If n>=0
4f60: 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65   then the P4 ope
4f70: 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c  rand is dynamic,
4f80: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20   meaning that a 
4f90: 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73  copy of.** the s
4fa0: 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e  tring is made in
4fb0: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
4fc0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
4fd0: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76  malloc()..** A v
4fe0: 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61  alue of n==0 mea
4ff0: 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66  ns copy bytes of
5000: 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69   zP4 up to and i
5010: 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20  ncluding the.** 
5020: 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e  first null byte.
5030: 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f    If n>0 then co
5040: 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20  py n+1 bytes of 
5050: 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65  zP4..** .** Othe
5060: 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50  r values of n (P
5070: 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c  4_STATIC, P4_COL
5080: 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63  LSEQ etc.) indic
5090: 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69  ate that zP4 poi
50a0: 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69  nts.** to a stri
50b0: 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20  ng or structure 
50c0: 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65  that is guarante
50d0: 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20  ed to exist for 
50e0: 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a  the lifetime of.
50f0: 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20  ** the Vdbe. In 
5100: 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63  these cases we c
5110: 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65  an just copy the
5120: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
5130: 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63  If addr<0 then c
5140: 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20  hange P4 on the 
5150: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
5160: 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69  serted instructi
5170: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
5180: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
5190: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
51a0: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
51b0: 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70  P4, int n){.  Op
51c0: 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33   *pOp;.  sqlite3
51d0: 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20   *db;.  assert( 
51e0: 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  p!=0 );.  db = p
51f0: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
5200: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
5210: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
5220: 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  f( p->aOp==0 || 
5230: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5240: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50   ){.    if( n!=P
5250: 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 20 20  4_VTAB ){.      
5260: 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76  freeP4(db, n, (v
5270: 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a  oid*)*(char**)&z
5280: 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  P4);.    }.    r
5290: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
52a0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
52b0: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c  .  assert( addr<
52c0: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20  p->nOp );.  if( 
52d0: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
52e0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
52f0: 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d  .  }.  pOp = &p-
5300: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73  >aOp[addr];.  as
5310: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
5320: 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20 7c 7c  e==P4_NOTUSED ||
5330: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
5340: 5f 49 4e 54 33 32 20 29 3b 0a 20 20 66 72 65 65  _INT32 );.  free
5350: 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  P4(db, pOp->p4ty
5360: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
5370: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b    pOp->p4.p = 0;
5380: 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54  .  if( n==P4_INT
5390: 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74  32 ){.    /* Not
53a0: 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20  e: this cast is 
53b0: 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68  safe, because th
53c0: 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f  e origin data po
53d0: 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20  int was an int. 
53e0: 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63     ** that was c
53f0: 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20  ast to a (const 
5400: 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20  char *). */.    
5410: 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49  pOp->p4.i = SQLI
5420: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50  TE_PTR_TO_INT(zP
5430: 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  4);.    pOp->p4t
5440: 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a  ype = P4_INT32;.
5450: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d    }else if( zP4=
5460: 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  =0 ){.    pOp->p
5470: 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70  4.p = 0;.    pOp
5480: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
5490: 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  TUSED;.  }else i
54a0: 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  f( n==P4_KEYINFO
54b0: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
54c0: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
54d0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
54e0: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P4_KEYINFO;.  
54f0: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
5500: 56 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d  VTAB ){.    pOp-
5510: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
5520: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
5530: 79 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20  ype = P4_VTAB;. 
5540: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f     sqlite3VtabLo
5550: 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34  ck((VTable *)zP4
5560: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
5570: 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e  (VTable *)zP4)->
5580: 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d  db==p->db );.  }
5590: 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a  else if( n<0 ){.
55a0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
55b0: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
55c0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73  pOp->p4type = (s
55d0: 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20  igned char)n;.  
55e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e  }else{.    if( n
55f0: 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65  ==0 ) n = sqlite
5600: 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a  3Strlen30(zP4);.
5610: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20      pOp->p4.z = 
5620: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
5630: 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b  (p->db, zP4, n);
5640: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
5650: 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20   = P4_DYNAMIC;. 
5660: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
5670: 74 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  the P4 on the mo
5680: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
5690: 64 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20  d opcode to the 
56a0: 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a  KeyInfo for the.
56b0: 2a 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a  ** index given..
56c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
56d0: 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28  dbeSetP4KeyInfo(
56e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
56f0: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56  ndex *pIdx){.  V
5700: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
5710: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
5720: 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( v!=0 );.  asse
5730: 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20  rt( pIdx!=0 );. 
5740: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5750: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
5760: 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
5770: 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
5780: 20 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20   pIdx),.        
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34                P4
57a0: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69  _KEYINFO);.}..#i
57b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
57c0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
57d0: 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  NTS./*.** Change
57e0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
57f0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
5800: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
5810: 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65  ion.  Or.** inse
5820: 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61  rt a No-op and a
5830: 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74  dd the comment t
5840: 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72  o that new instr
5850: 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a  uction.  This.**
5860: 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20   makes the code 
5870: 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64  easier to read d
5880: 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e  uring debugging.
5890: 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68    None of this h
58a0: 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70  appens.** in a p
58b0: 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e  roduction build.
58c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
58d0: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62  vdbeVComment(Vdb
58e0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
58f0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69   *zFormat, va_li
5900: 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74  st ap){.  assert
5910: 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d  ( p->nOp>0 || p-
5920: 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73  >aOp==0 );.  ass
5930: 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  ert( p->aOp==0 |
5940: 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  | p->aOp[p->nOp-
5950: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c  1].zComment==0 |
5960: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
5970: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
5980: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73  ->nOp ){.    ass
5990: 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20  ert( p->aOp );. 
59a0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
59b0: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70  (p->db, p->aOp[p
59c0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
59d0: 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70  t);.    p->aOp[p
59e0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
59f0: 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  t = sqlite3VMPri
5a00: 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d  ntf(p->db, zForm
5a10: 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76  at, ap);.  }.}.v
5a20: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5a30: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
5a40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
5a50: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
5a60: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70  list ap;.  if( p
5a70: 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74   ){.    va_start
5a80: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
5a90: 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28     vdbeVComment(
5aa0: 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  p, zFormat, ap);
5ab0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
5ac0: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
5ad0: 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  te3VdbeNoopComme
5ae0: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
5af0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
5b00: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
5b10: 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   ap;.  if( p ){.
5b20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5b30: 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70  ddOp0(p, OP_Noop
5b40: 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  );.    va_start(
5b50: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
5b60: 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70    vdbeVComment(p
5b70: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
5b80: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
5b90: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a    }.}.#endif  /*
5ba0: 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a   NDEBUG */../*.*
5bb0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63  * Return the opc
5bc0: 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20  ode for a given 
5bd0: 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68 65  address.  If the
5be0: 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20   address is -1, 
5bf0: 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74  then.** return t
5c00: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
5c10: 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65   inserted opcode
5c20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
5c30: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
5c40: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
5c50: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63  d prior to the c
5c60: 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a  alling of this.*
5c70: 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20  * routine, then 
5c80: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64  a pointer to a d
5c90: 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c  ummy VdbeOp will
5ca0: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54   be returned.  T
5cb0: 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73  hat opcode.** is
5cc0: 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f   readable but no
5cd0: 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75  t writable, thou
5ce0: 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74 6f  gh it is cast to
5cf0: 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75   a writable valu
5d00: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  e..** The return
5d10: 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f   of a dummy opco
5d20: 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61  de allows the ca
5d30: 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66  ll to continue f
5d40: 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66  unctioning.** af
5d50: 74 65 72 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20  ter a OOM fault 
5d60: 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
5d70: 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  o check to see i
5d80: 66 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f  f the return fro
5d90: 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  m .** this routi
5da0: 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f  ne is a valid po
5db0: 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63 61  inter.  But beca
5dc0: 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70  use the dummy.op
5dd0: 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75  code is 0,.** du
5de0: 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  mmy will never b
5df0: 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 54  e written to.  T
5e00: 68 69 73 20 69 73 20 76 65 72 69 66 69 65 64 20  his is verified 
5e10: 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74 69  by code inspecti
5e20: 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e  on and.** by run
5e30: 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72 69  ning with Valgri
5e40: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41 62 6f 75 74 20  nd..**.** About 
5e50: 74 68 65 20 23 69 66 64 65 66 20 53 51 4c 49 54  the #ifdef SQLIT
5e60: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 3a 20 20 4e  E_OMIT_TRACE:  N
5e70: 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f  ormally, this ro
5e80: 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
5e90: 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c 65 73 73 20  alled.** unless 
5ea0: 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54 68 69 73 20  p->nOp>0.  This 
5eb0: 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68  is because in th
5ec0: 65 20 61 62 73 65 6e 73 65 20 6f 66 20 53 51 4c  e absense of SQL
5ed0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 2c 0a  ITE_OMIT_TRACE,.
5ee0: 2a 2a 20 61 6e 20 4f 50 5f 54 72 61 63 65 20 69  ** an OP_Trace i
5ef0: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6c  nstruction is al
5f00: 77 61 79 73 20 69 6e 73 65 72 74 65 64 20 62 79  ways inserted by
5f10: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 28   sqlite3VdbeGet(
5f20: 29 20 61 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20  ) as soon as.** 
5f30: 61 20 6e 65 77 20 56 44 42 45 20 69 73 20 63 72  a new VDBE is cr
5f40: 65 61 74 65 64 2e 20 20 53 6f 20 77 65 20 61 72  eated.  So we ar
5f50: 65 20 66 72 65 65 20 74 6f 20 73 65 74 20 61 64  e free to set ad
5f60: 64 72 20 74 6f 20 70 2d 3e 6e 4f 70 2d 31 20 77  dr to p->nOp-1 w
5f70: 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67  ithout.** having
5f80: 20 74 6f 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b   to double-check
5f90: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5fa0: 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  at the result is
5fb0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 20 42   non-negative. B
5fc0: 75 74 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f  ut.** if SQLITE_
5fd0: 4f 4d 49 54 5f 54 52 41 43 45 20 69 73 20 64 65  OMIT_TRACE is de
5fe0: 66 69 6e 65 64 2c 20 74 68 65 20 4f 50 5f 54 72  fined, the OP_Tr
5ff0: 61 63 65 20 69 73 20 6f 6d 69 74 74 65 64 20 61  ace is omitted a
6000: 6e 64 20 77 65 20 64 6f 20 6e 65 65 64 20 74 6f  nd we do need to
6010: 0a 2a 2a 20 63 68 65 63 6b 20 74 68 65 20 76 61  .** check the va
6020: 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f 70 2d 31 20  lue of p->nOp-1 
6030: 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
6040: 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  g..*/.VdbeOp *sq
6050: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
6060: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
6070: 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63  ){.  /* C89 spec
6080: 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63  ifies that the c
6090: 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20  onstant "dummy" 
60a0: 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  will be initiali
60b0: 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20  zed to all.  ** 
60c0: 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20  zeros, which is 
60d0: 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67  correct.  MSVC g
60e0: 65 6e 65 72 61 74 65 73 20 61 20 77 61 72 6e 69  enerates a warni
60f0: 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73  ng, nevertheless
6100: 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64  . */.  static Vd
6110: 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20  beOp dummy;  /* 
6120: 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20  Ignore the MSVC 
6130: 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f  warning about no
6140: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a   initializer */.
6150: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
6160: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
6170: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64  NIT );.  if( add
6180: 72 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  r<0 ){.#ifdef SQ
6190: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
61a0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d      if( p->nOp==
61b0: 30 20 29 20 72 65 74 75 72 6e 20 28 56 64 62 65  0 ) return (Vdbe
61c0: 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 23 65 6e 64  Op*)&dummy;.#end
61d0: 69 66 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  if.    addr = p-
61e0: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  >nOp - 1;.  }.  
61f0: 61 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30  assert( (addr>=0
6200: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29   && addr<p->nOp)
6210: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
6220: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
6230: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
6240: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
6250: 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d  rn (VdbeOp*)&dum
6260: 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  my;.  }else{.   
6270: 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b   return &p->aOp[
6280: 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  addr];.  }.}..#i
6290: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
62a0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
62b0: 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20  COMMENTS)./*.** 
62c0: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
62d0: 72 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20  r value for one 
62e0: 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  of the parameter
62f0: 73 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20  s to the opcode 
6300: 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  pOp.** determine
6310: 64 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63  d by character c
6320: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6330: 74 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20  translateP(char 
6340: 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70  c, const Op *pOp
6350: 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20  ){.  if( c=='1' 
6360: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31  ) return pOp->p1
6370: 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29  ;.  if( c=='2' )
6380: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b   return pOp->p2;
6390: 0a 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20  .  if( c=='3' ) 
63a0: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a  return pOp->p3;.
63b0: 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72    if( c=='4' ) r
63c0: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b  eturn pOp->p4.i;
63d0: 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70  .  return pOp->p
63e0: 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  5;.}../*.** Comp
63f0: 75 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72  ute a string for
6400: 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66   the "comment" f
6410: 69 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f  ield of a VDBE o
6420: 70 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a  pcode listing..*
6430: 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69  *.** The Synopsi
6440: 73 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d  s: field in comm
6450: 65 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65  ents in the vdbe
6460: 2e 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67  .c source file g
6470: 65 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a  ets converted.**
6480: 20 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72   to an extra str
6490: 69 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65  ing that is appe
64a0: 6e 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69  nded to the sqli
64b0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e  te3OpcodeName().
64c0: 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65    In the.** abse
64d0: 6e 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d  nce of other com
64e0: 6d 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f  ments, this syno
64f0: 70 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65  psis becomes the
6500: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
6510: 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20  opcode..** Some 
6520: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75  translation occu
6530: 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  rs:.**.**       
6540: 22 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72  "PX"      ->  "r
6550: 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50  [X]".**       "P
6560: 58 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58  X@PY"   ->  "r[X
6570: 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72  ..X+Y-1]"  or "r
6580: 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f  [x]" if y is 0 o
6590: 72 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  r 1.**       "PX
65a0: 40 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e  @PY+1" ->  "r[X.
65b0: 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b  .X+Y]"    or "r[
65c0: 78 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a  x]" if y is 0.**
65d0: 20 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20         "PY..PY" 
65e0: 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20   ->  "r[X..Y]"  
65f0: 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66      or "r[x]" if
6600: 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20   y<=x.*/.static 
6610: 69 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  int displayComme
6620: 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a  nt(.  const Op *
6630: 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  pOp,     /* The 
6640: 6f 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d  opcode to be com
6650: 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  mented */.  cons
6660: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f  t char *zP4,   /
6670: 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74  * Previously obt
6680: 61 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20  ained value for 
6690: 50 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54  P4 */.  char *zT
66a0: 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72  emp,       /* Wr
66b0: 69 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20  ite result here 
66c0: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20  */.  int nTemp  
66d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
66e0: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54   available in zT
66f0: 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f  emp[] */.){.  co
6700: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  nst char *zOpNam
6710: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
6720: 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e  *zSynopsis;.  in
6730: 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74  t nOpName;.  int
6740: 20 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61   ii, jj;.  zOpNa
6750: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  me = sqlite3Opco
6760: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
6770: 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d  de);.  nOpName =
6780: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6790: 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  (zOpName);.  if(
67a0: 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65   zOpName[nOpName
67b0: 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  +1] ){.    int s
67c0: 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20  eenCom = 0;.    
67d0: 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e  char c;.    zSyn
67e0: 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20  opsis = zOpName 
67f0: 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a  += nOpName + 1;.
6800: 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b      for(ii=jj=0;
6810: 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28   jj<nTemp-1 && (
6820: 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69  c = zSynopsis[ii
6830: 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20  ])!=0; ii++){.  
6840: 20 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29      if( c=='P' )
6850: 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53  {.        c = zS
6860: 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20  ynopsis[++ii];. 
6870: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34         if( c=='4
6880: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
6890: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
68a0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
68b0: 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a  jj, "%s", zP4);.
68c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
68d0: 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20  ( c=='X' ){.    
68e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
68f0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
6900: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
6910: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
6920: 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43  .          seenC
6930: 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  om = 1;.        
6940: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6950: 20 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c   int v1 = transl
6960: 61 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20  ateP(c, pOp);.  
6970: 20 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a          int v2;.
6980: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6990: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
69a0: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
69b0: 25 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20  %d", v1);.      
69c0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
69d0: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
69e0: 22 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20  "@P", 2)==0 ){. 
69f0: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
6a00: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   3;.            
6a10: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
6a20: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
6a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20  .            v2 
6a40: 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79  = translateP(zSy
6a50: 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29  nopsis[ii], pOp)
6a60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
6a70: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
6a80: 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29  sis+ii+1,"+1",2)
6a90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
6aa0: 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20       ii += 2;.  
6ab0: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b              v2++
6ac0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6ae0: 76 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  v2>1 ){.        
6af0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6b00: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
6b10: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64   zTemp+jj, "..%d
6b20: 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20  ", v1+v2-1);.   
6b30: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6b40: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
6b50: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
6b60: 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34  +ii+1, "..P3", 4
6b70: 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d  )==0 && pOp->p3=
6b80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6b90: 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20    ii += 4;.     
6ba0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
6bb0: 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  .        jj += s
6bc0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
6bd0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
6be0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
6bf0: 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a  Temp[jj++] = c;.
6c00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6c10: 20 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26    if( !seenCom &
6c20: 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20  & jj<nTemp-5 && 
6c30: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
6c40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6c50: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
6c60: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25  , zTemp+jj, "; %
6c70: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
6c80: 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20  t);.      jj += 
6c90: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6ca0: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d  zTemp+jj);.    }
6cb0: 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d  .    if( jj<nTem
6cc0: 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20  p ) zTemp[jj] = 
6cd0: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
6ce0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
6cf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6d00: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6d10: 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43  p, "%s", pOp->zC
6d20: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20  omment);.    jj 
6d30: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6d40: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73  0(zTemp);.  }els
6d50: 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20  e{.    zTemp[0] 
6d60: 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b  = 0;.    jj = 0;
6d70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a  .  }.  return jj
6d80: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
6d90: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 0a  LITE_DEBUG */...
6da0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
6db0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
6dc0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44  ) || !defined(ND
6dd0: 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20  EBUG) \.     || 
6de0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
6df0: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
6e00: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
6e10: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
6e20: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
6e30: 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61  ibes the P4 para
6e40: 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63  meter for an opc
6e50: 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d  ode..** Use zTem
6e60: 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72  p for any requir
6e70: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66  ed temporary buf
6e80: 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  fer space..*/.st
6e90: 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c  atic char *displ
6ea0: 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68  ayP4(Op *pOp, ch
6eb0: 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e  ar *zTemp, int n
6ec0: 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Temp){.  char *z
6ed0: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73  P4 = zTemp;.  as
6ee0: 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20  sert( nTemp>=20 
6ef0: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70  );.  switch( pOp
6f00: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
6f10: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
6f20: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20   {.      int i, 
6f30: 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  j;.      KeyInfo
6f40: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70   *pKeyInfo = pOp
6f50: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
6f60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65       assert( pKe
6f70: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
6f80: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  r!=0 );.      sq
6f90: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6fa0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28  Temp, zTemp, "k(
6fb0: 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  %d", pKeyInfo->n
6fc0: 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20  Field);.      i 
6fd0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6fe0: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  0(zTemp);.      
6ff0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49  for(j=0; j<pKeyI
7000: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b  nfo->nField; j++
7010: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
7020: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
7030: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
7040: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
7050: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c  ar *zColl = pCol
7060: 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l ? pColl->zName
7070: 20 3a 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20   : "nil";.      
7080: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
7090: 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
70a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d  ;.        if( n=
70b0: 3d 36 20 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f  =6 && memcmp(zCo
70c0: 6c 6c 2c 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d  ll,"BINARY",6)==
70d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
70e0: 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20  Coll = "B";.    
70f0: 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20        n = 1;.   
7100: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
7110: 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29  f( i+n>nTemp-6 )
7120: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
7130: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e  py(&zTemp[i],",.
7140: 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  ..",4);.        
7150: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
7160: 20 7d 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70   }.        zTemp
7170: 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [i++] = ',';.   
7180: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
7190: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  o->aSortOrder[j]
71a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
71b0: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a  emp[i++] = '-';.
71c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
71d0: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
71e0: 69 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b  i], zColl, n+1);
71f0: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b  .        i += n;
7200: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
7210: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b  Temp[i++] = ')';
7220: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20  .      zTemp[i] 
7230: 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
7240: 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20  t( i<nTemp );.  
7250: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7260: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c  .    case P4_COL
7270: 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f  LSEQ: {.      Co
7280: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
7290: 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20  Op->p4.pColl;.  
72a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
72b0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
72c0: 70 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43  p, "(%.20s)", pC
72d0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
72e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
72f0: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
7300: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  DEF: {.      Fun
7310: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
7320: 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20  ->p4.pFunc;.    
7330: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7340: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7350: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
7360: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
7370: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
7380: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7390: 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20   P4_INT64: {.   
73a0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
73b0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
73c0: 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e  , "%lld", *pOp->
73d0: 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20  p4.pI64);.      
73e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
73f0: 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20   case P4_INT32: 
7400: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7410: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
7420: 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70  zTemp, "%d", pOp
7430: 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62  ->p4.i);.      b
7440: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7450: 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a  case P4_REAL: {.
7460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7470: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
7480: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70  emp, "%.16g", *p
7490: 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20  Op->p4.pReal);. 
74a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
74b0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45  }.    case P4_ME
74c0: 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  M: {.      Mem *
74d0: 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pMem = pOp->p4.p
74e0: 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Mem;.      if( p
74f0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
7500: 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20  _Str ){.        
7510: 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20  zP4 = pMem->z;. 
7520: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
7530: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
7540: 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  _Int ){.        
7550: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7560: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
7570: 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69  %lld", pMem->u.i
7580: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
7590: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
75a0: 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
75b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
75c0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
75d0: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65  mp, "%.16g", pMe
75e0: 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  m->r);.      }el
75f0: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
7600: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs & MEM_Null ){
7610: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7620: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
7630: 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b   zTemp, "NULL");
7640: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7650: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
7660: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
7670: 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20  Blob );.        
7680: 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a  zP4 = "(blob)";.
7690: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
76a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
76b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
76c0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
76d0: 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a  case P4_VTAB: {.
76e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74        sqlite3_vt
76f0: 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d  ab *pVtab = pOp-
7700: 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62  >p4.pVtab->pVtab
7710: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
7720: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
7730: 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a  zTemp, "vtab:%p:
7740: 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61  %p", pVtab, pVta
7750: 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20  b->pModule);.   
7760: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7770: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
7780: 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20  P4_INTARRAY: {. 
7790: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
77a0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
77b0: 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b  mp, "intarray");
77c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
77d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
77e0: 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20  SUBPROGRAM: {.  
77f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7800: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7810: 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20  p, "program");. 
7820: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7830: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41 44  }.    case P4_AD
7840: 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a  VANCE: {.      z
7850: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
7860: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7870: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
7880: 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e       zP4 = pOp->
7890: 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20  p4.z;.      if( 
78a0: 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  zP4==0 ){.      
78b0: 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20    zP4 = zTemp;. 
78c0: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20         zTemp[0] 
78d0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
78e0: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
78f0: 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74   zP4!=0 );.  ret
7900: 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69  urn zP4;.}.#endi
7910: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  f../*.** Declare
7920: 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61   to the Vdbe tha
7930: 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65  t the BTree obje
7940: 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d  ct at db->aDb[i]
7950: 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   is used..**.** 
7960: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
7970: 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20  tements need to 
7980: 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20  know in advance 
7990: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74  the complete set
79a0: 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20   of.** attached 
79b0: 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77  databases that w
79c0: 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d  ill be use.  A m
79d0: 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74  ask of these dat
79e0: 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69  abases.** is mai
79f0: 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74  ntained in p->bt
7a00: 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d  reeMask.  The p-
7a10: 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20  >lockMask value 
7a20: 69 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66  is the subset of
7a30: 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  .** p->btreeMask
7a40: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68   of databases th
7a50: 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  at will require 
7a60: 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  a lock..*/.void 
7a70: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
7a80: 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  tree(Vdbe *p, in
7a90: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
7aa0: 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d  i>=0 && i<p->db-
7ab0: 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73  >nDb && i<(int)s
7ac0: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38  izeof(yDbMask)*8
7ad0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c   );.  assert( i<
7ae0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62  (int)sizeof(p->b
7af0: 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  treeMask)*8 );. 
7b00: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d   p->btreeMask |=
7b10: 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69   ((yDbMask)1)<<i
7b20: 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26 20  ;.  if( i!=1 && 
7b30: 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72  sqlite3BtreeShar
7b40: 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b  able(p->db->aDb[
7b50: 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 70  i].pBt) ){.    p
7b60: 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 7c 3d 20 28 28  ->lockMask |= ((
7b70: 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20  yDbMask)1)<<i;. 
7b80: 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e   }.}..#if !defin
7b90: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
7ba0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
7bb0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
7bc0: 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  E>0./*.** If SQL
7bd0: 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ite is compiled 
7be0: 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  to support share
7bf0: 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64  d-cache mode and
7c00: 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66   to be threadsaf
7c10: 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  e,.** this routi
7c20: 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d  ne obtains the m
7c30: 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  utex associated 
7c40: 77 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72  with each BtShar
7c50: 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ed structure.** 
7c60: 74 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65  that may be acce
7c70: 73 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70  ssed by the VM p
7c80: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
7c90: 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73  ment. In doing s
7ca0: 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74  o it also.** set
7cb0: 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  s the BtShared.d
7cc0: 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68  b member of each
7cd0: 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64   of the BtShared
7ce0: 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73   structures, ens
7cf0: 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68  uring.** that th
7d00: 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68  e correct busy-h
7d10: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
7d20: 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65  is invoked if re
7d30: 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  quired..**.** If
7d40: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74   SQLite is not t
7d50: 68 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f  hreadsafe but do
7d60: 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  es support share
7d70: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
7d80: 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  en.** sqlite3Btr
7d90: 65 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76  eeEnter() is inv
7da0: 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  oked to set the 
7db0: 42 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69  BtShared.db vari
7dc0: 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ables.** of all 
7dd0: 6f 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75  of BtShared stru
7de0: 63 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c  ctures accessibl
7df0: 65 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61  e via the databa
7e00: 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73  se handle .** as
7e10: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
7e20: 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  e VM..**.** If S
7e30: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72  QLite is not thr
7e40: 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73  eadsafe and does
7e50: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61   not support sha
7e60: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20  red-cache mode, 
7e70: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
7e80: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
7e90: 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d  ** The p->btreeM
7ea0: 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62  ask field is a b
7eb0: 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74  itmask of all bt
7ec0: 72 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72  rees that the pr
7ed0: 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65  epared .** state
7ee0: 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72  ment p will ever
7ef0: 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20   use.  Let N be 
7f00: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  the number of bi
7f10: 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61  ts in p->btreeMa
7f20: 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  sk.** correspond
7f30: 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68  ing to btrees th
7f40: 61 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61  at use shared ca
7f50: 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72  che.  Then the r
7f60: 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69  untime of.** thi
7f70: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e  s routine is N*N
7f80: 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72  .  But as N is r
7f90: 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20  arely more than 
7fa0: 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  1, this should n
7fb0: 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c  ot.** be a probl
7fc0: 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  em..*/.void sqli
7fd0: 74 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62  te3VdbeEnter(Vdb
7fe0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
7ff0: 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a    yDbMask mask;.
8000: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
8010: 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20   Db *aDb;.  int 
8020: 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f  nDb;.  if( p->lo
8030: 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75  ckMask==0 ) retu
8040: 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  rn;  /* The comm
8050: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20  on case */.  db 
8060: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d  = p->db;.  aDb =
8070: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20   db->aDb;.  nDb 
8080: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72  = db->nDb;.  for
8090: 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c  (i=0, mask=1; i<
80a0: 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b  nDb; i++, mask +
80b0: 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28  = mask){.    if(
80c0: 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26   i!=1 && (mask &
80d0: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30   p->lockMask)!=0
80e0: 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69   && ALWAYS(aDb[i
80f0: 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20  ].pBt!=0) ){.   
8100: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
8110: 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29  nter(aDb[i].pBt)
8120: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
8130: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
8140: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
8150: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
8160: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
8170: 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  E>0./*.** Unlock
8180: 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65   all of the btre
8190: 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  es previously lo
81a0: 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74  cked by a call t
81b0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  o sqlite3VdbeEnt
81c0: 65 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  er()..*/.void sq
81d0: 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 56  lite3VdbeLeave(V
81e0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
81f0: 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b  ;.  yDbMask mask
8200: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
8210: 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e  .  Db *aDb;.  in
8220: 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e  t nDb;.  if( p->
8230: 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65  lockMask==0 ) re
8240: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
8250: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64  mmon case */.  d
8260: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
8270: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
8280: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
8290: 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20  or(i=0, mask=1; 
82a0: 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b  i<nDb; i++, mask
82b0: 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69   += mask){.    i
82c0: 66 28 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b  f( i!=1 && (mask
82d0: 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21   & p->lockMask)!
82e0: 3d 30 20 26 26 20 41 4c 57 41 59 53 28 61 44 62  =0 && ALWAYS(aDb
82f0: 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20  [i].pBt!=0) ){. 
8300: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
8310: 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42  eLeave(aDb[i].pB
8320: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
8330: 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
8340: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
8350: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
8360: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
8370: 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20   Print a single 
8380: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f  opcode.  This ro
8390: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
83a0: 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  r debugging only
83b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
83c0: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c  3VdbePrintOp(FIL
83d0: 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c  E *pOut, int pc,
83e0: 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61   Op *pOp){.  cha
83f0: 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a  r *zP4;.  char z
8400: 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20  Ptr[50];.  char 
8410: 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61  zCom[100];.  sta
8420: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
8430: 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20  zFormat1 = "%4d 
8440: 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34  %-13s %4d %4d %4
8450: 64 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c  d %-13s %.2X %s\
8460: 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d  n";.  if( pOut==
8470: 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75  0 ) pOut = stdou
8480: 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c  t;.  zP4 = displ
8490: 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20  ayP4(pOp, zPtr, 
84a0: 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23  sizeof(zPtr));.#
84b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
84c0: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
84d0: 45 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f  ENTS.  displayCo
84e0: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
84f0: 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f  zCom, sizeof(zCo
8500: 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f  m));.#else.  zCo
8510: 6d 5b 30 5d 20 3d 20 30 0a 23 65 6e 64 69 66 0a  m[0] = 0.#endif.
8520: 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71    /* NB:  The sq
8530: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
8540: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  ) function is im
8550: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64  plemented by cod
8560: 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62  e created.  ** b
8570: 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  y the mkopcodeh.
8580: 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65  awk and mkopcode
8590: 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68  c.awk scripts wh
85a0: 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a  ich extract the.
85b0: 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
85c0: 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63   from the vdbe.c
85d0: 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a   source text */.
85e0: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
85f0: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
8600: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
8610: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
8620: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
8630: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
8640: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20  zP4, pOp->p5,.  
8650: 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20      zCom.  );.  
8660: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
8670: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
8680: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
8690: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
86a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
86b0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
86c0: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
86d0: 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a    if( p && N ){.
86e0: 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20      Mem *pEnd;. 
86f0: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
8700: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d   p->db;.    u8 m
8710: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64  alloc_failed = d
8720: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
8730: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42  .    if( db->pnB
8740: 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20  ytesFreed ){.   
8750: 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e     for(pEnd=&p[N
8760: 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b  ]; p<pEnd; p++){
8770: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8780: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
8790: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 0a  alloc);.      }.
87a0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
87b0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 45 6e 64    }.    for(pEnd
87c0: 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20  =&p[N]; p<pEnd; 
87d0: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  p++){.      asse
87e0: 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e  rt( (&p[1])==pEn
87f0: 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b  d || p[0].db==p[
8800: 31 5d 2e 64 62 20 29 3b 0a 0a 20 20 20 20 20 20  1].db );..      
8810: 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73  /* This block is
8820: 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e   really an inlin
8830: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
8840: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
8850: 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74  ase().      ** t
8860: 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74  hat takes advant
8870: 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20  age of the fact 
8880: 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  that the memory 
8890: 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20  cell value is . 
88a0: 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65       ** being se
88b0: 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20  t to NULL after 
88c0: 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79  releasing any dy
88d0: 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e  namic resources.
88e0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
88f0: 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61  ** The justifica
8900: 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
8910: 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61  ting code is tha
8920: 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a  t according to .
8930: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69        ** callgri
8940: 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20  nd, this causes 
8950: 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63  a certain test c
8960: 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43  ase to hit the C
8970: 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a  PU 4.7 .      **
8980: 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78   percent less (x
8990: 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65  86 linux, gcc ve
89a0: 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36  rsion 4.1.2, -O6
89b0: 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20  ) than if .     
89c0: 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65   ** sqlite3MemRe
89d0: 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c  lease() were cal
89e0: 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57  led from here. W
89f0: 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75  ith -O2, this ju
8a00: 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  mps.      ** to 
8a10: 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65  6.6 percent. The
8a20: 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e   test case is in
8a30: 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77  serting 1000 row
8a40: 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a  s into a table .
8a50: 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f        ** with no
8a60: 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61   indexes using a
8a70: 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64   single prepared
8a80: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
8a90: 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20  t, bind() .     
8aa0: 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e   ** and reset().
8ab0: 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f   Inserts are gro
8ac0: 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e  uped into a tran
8ad0: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
8ae0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66  /.      if( p->f
8af0: 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45  lags&(MEM_Agg|ME
8b00: 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c  M_Dyn|MEM_Frame|
8b10: 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20  MEM_RowSet) ){. 
8b20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8b30: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b  beMemRelease(p);
8b40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
8b50: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20   p->zMalloc ){. 
8b60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
8b70: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
8b80: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  loc);.        p-
8b90: 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  >zMalloc = 0;.  
8ba0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e      }..      p->
8bb0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 76 61  flags = MEM_Inva
8bc0: 6c 69 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  lid;.    }.    d
8bd0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8be0: 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b  = malloc_failed;
8bf0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
8c00: 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d 65  lete a VdbeFrame
8c10: 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20   object and its 
8c20: 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72  contents. VdbeFr
8c30: 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a  ame objects are.
8c40: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
8c50: 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f  the OP_Program o
8c60: 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33  pcode in sqlite3
8c70: 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76  VdbeExec()..*/.v
8c80: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
8c90: 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46  rameDelete(VdbeF
8ca0: 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rame *p){.  int 
8cb0: 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d  i;.  Mem *aMem =
8cc0: 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29   VdbeFrameMem(p)
8cd0: 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ;.  VdbeCursor *
8ce0: 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75  *apCsr = (VdbeCu
8cf0: 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d  rsor **)&aMem[p-
8d00: 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66  >nChildMem];.  f
8d10: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68  or(i=0; i<p->nCh
8d20: 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20  ildCsr; i++){.  
8d30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
8d40: 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70  eCursor(p->v, ap
8d50: 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  Csr[i]);.  }.  r
8d60: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61  eleaseMemArray(a
8d70: 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65  Mem, p->nChildMe
8d80: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  m);.  sqlite3DbF
8d90: 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29  ree(p->v->db, p)
8da0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
8db0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
8dc0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69  ./*.** Give a li
8dd0: 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f  sting of the pro
8de0: 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74  gram in the virt
8df0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a  ual machine..**.
8e00: 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65  ** The interface
8e10: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
8e20: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
8e30: 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20  ).  But instead 
8e40: 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68  of.** running th
8e50: 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b  e code, it invok
8e60: 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  es the callback 
8e70: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e  once for each in
8e80: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
8e90: 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73  is feature is us
8ea0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
8eb0: 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a  "EXPLAIN"..**.**
8ec0: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
8ed0: 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75  ==1, each instru
8ee0: 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e  ction is listed.
8ef0: 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70    When.** p->exp
8f00: 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50  lain==2, only OP
8f10: 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63  _Explain instruc
8f20: 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64  tions are listed
8f30: 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72   and these.** ar
8f40: 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66  e shown in a dif
8f50: 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20  ferent format.  
8f60: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73  p->explain==2 is
8f70: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
8f80: 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55  nt.** EXPLAIN QU
8f90: 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20  ERY PLAN..**.** 
8fa0: 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  When p->explain=
8fb0: 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61  =1, first the ma
8fc0: 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69  in program is li
8fd0: 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20  sted, then each 
8fe0: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65  of.** the trigge
8ff0: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72  r subprograms ar
9000: 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20  e listed one by 
9010: 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  one..*/.int sqli
9020: 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56  te3VdbeList(.  V
9030: 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20  dbe *p          
9040: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9050: 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  VDBE */.){.  int
9060: 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   nRow;          
9070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9080: 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72    /* Stop when r
9090: 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ow count reaches
90a0: 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e   this */.  int n
90b0: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
90c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62  /* Number of sub
90e0: 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66  -vdbes seen so f
90f0: 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72  ar */.  SubProgr
9100: 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20  am **apSub = 0; 
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9120: 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62  Array of sub-vdb
9130: 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75  es */.  Mem *pSu
9140: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9160: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64  Memory cell hold
9170: 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   array of subpro
9180: 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  gs */.  sqlite3 
9190: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20  *db = p->db;    
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
91b0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
91c0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
91d0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
9200: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
9210: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
9220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
9230: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
9240: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e  Mem *pMem = &p->
9250: 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20  aMem[1];        
9260: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
9270: 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20  m of result set 
9280: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
9290: 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73  >explain );.  as
92a0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
92b0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
92c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
92d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
92e0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
92f0: 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  SY || p->rc==SQL
9300: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20  ITE_NOMEM );..  
9310: 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74  /* Even though t
9320: 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
9330: 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20  not use dynamic 
9340: 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a  strings for.  **
9350: 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73   the result, res
9360: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ult columns may 
9370: 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69  become dynamic i
9380: 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73  f the user calls
9390: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  ** sqlite3_co
93a0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63  lumn_text16(), c
93b0: 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61  ausing a transla
93c0: 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65  tion to UTF-16 e
93d0: 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  ncoding..  */.  
93e0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
93f0: 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70  pMem, 8);.  p->p
9400: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a  ResultSet = 0;..
9410: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
9420: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
9430: 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
9440: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69   if a malloc() i
9450: 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20  nside a call to 
9460: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
9470: 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20  ext() or.    ** 
9480: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
9490: 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20  ext16() failed. 
94a0: 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   */.    db->mall
94b0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
94c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
94d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
94e0: 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   When the number
94f0: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
9500: 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68  reaches nRow, th
9510: 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a  at means the.  *
9520: 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69  * listing has fi
9530: 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74  nished and sqlit
9540: 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64  e3_step() should
9550: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
9560: 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69  ONE..  ** nRow i
9570: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
9580: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
9590: 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  in the main prog
95a0: 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74  ram, plus.  ** t
95b0: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75  he sum of the nu
95c0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
95d0: 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62 70  all trigger subp
95e0: 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65  rograms encounte
95f0: 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e  red.  ** so far.
9600: 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65    The nRow value
9610: 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61   will increase a
9620: 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 75  s new trigger su
9630: 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20  bprograms are.  
9640: 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
9650: 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65  but p->pc will e
9660: 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20  ventually catch 
9670: 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f  up to nRow..  */
9680: 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70  .  nRow = p->nOp
9690: 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61  ;.  if( p->expla
96a0: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20  in==1 ){.    /* 
96b0: 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f  The first 8 memo
96c0: 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65  ry cells are use
96d0: 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  d for the result
96e0: 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c   set.  So we wil
96f0: 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  l.    ** command
9700: 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c  eer the 9th cell
9710: 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61   to use as stora
9720: 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20  ge for an array 
9730: 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20  of pointers.    
9740: 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73 75  ** to trigger su
9750: 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20  bprograms.  The 
9760: 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74 65  VDBE is guarante
9770: 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65  ed to have at le
9780: 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c  ast 9.    ** cel
9790: 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ls.  */.    asse
97a0: 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b  rt( p->nMem>9 );
97b0: 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e  .    pSub = &p->
97c0: 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28  aMem[9];.    if(
97d0: 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d   pSub->flags&MEM
97e0: 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f  _Blob ){.      /
97f0: 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63  * On the first c
9800: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73  all to sqlite3_s
9810: 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c  tep(), pSub will
9820: 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49   hold a NULL.  I
9830: 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  t is.      ** in
9840: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42  itialized to a B
9850: 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53 55  LOB by the P4_SU
9860: 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73  BPROGRAM process
9870: 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20  ing logic below 
9880: 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20  */.      nSub = 
9890: 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56  pSub->n/sizeof(V
98a0: 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53  dbe*);.      apS
98b0: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
98c0: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
98d0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
98e0: 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSub; i++){.  
98f0: 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75      nRow += apSu
9900: 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d  b[i]->nOp;.    }
9910: 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  .  }..  do{.    
9920: 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d  i = p->pc++;.  }
9930: 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26  while( i<nRow &&
9940: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26   p->explain==2 &
9950: 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  & p->aOp[i].opco
9960: 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de!=OP_Explain )
9970: 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20  ;.  if( i>=nRow 
9980: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
9990: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
99a0: 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
99b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
99c0: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
99d0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
99e0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
99f0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
9a00: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
9a10: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
9a20: 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
9a30: 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
9a40: 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65  tr(p->rc));.  }e
9a50: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
9a60: 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b  P4;.    Op *pOp;
9a70: 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f  .    if( i<p->nO
9a80: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  p ){.      /* Th
9a90: 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75  e output line nu
9aa0: 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e  mber is small en
9ab0: 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65  ough that we are
9ac0: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20   still in the.  
9ad0: 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67      ** main prog
9ae0: 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f  ram. */.      pO
9af0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
9b00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9b10: 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65   /* We are curre
9b20: 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62  ntly listing sub
9b30: 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72  programs.  Figur
9b40: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20  e out which one 
9b50: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63  and.      ** pic
9b60: 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72  k up the appropr
9b70: 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a  iate opcode. */.
9b80: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
9b90: 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a     i -= p->nOp;.
9ba0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69        for(j=0; i
9bb0: 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  >=apSub[j]->nOp;
9bc0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
9bd0: 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f   -= apSub[j]->nO
9be0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
9bf0: 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d   pOp = &apSub[j]
9c00: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a  ->aOp[i];.    }.
9c10: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
9c20: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  in==1 ){.      p
9c30: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
9c40: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
9c50: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
9c60: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70  INTEGER;.      p
9c70: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ca0: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
9cb0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
9cc0: 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  .  .      pMem->
9cd0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
9ce0: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
9cf0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
9d00: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
9d10: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
9d20: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f  p->opcode); /* O
9d30: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61  pcode */.      a
9d40: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
9d50: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
9d60: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
9d70: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
9d80: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
9d90: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
9da0: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
9db0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
9dc0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
9dd0: 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50     /* When an OP
9de0: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
9df0: 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68  is encounter (th
9e00: 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68  e only opcode th
9e10: 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20  at has.      ** 
9e20: 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  a P4_SUBPROGRAM 
9e30: 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e  argument), expan
9e40: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
9e50: 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  e array of subpr
9e60: 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20  ograms.      ** 
9e70: 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b  kept in p->aMem[
9e80: 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65  9].z to hold the
9e90: 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61   new program - a
9ea0: 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62  ssuming this sub
9eb0: 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a  program.      **
9ec0: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
9ed0: 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20   been seen..    
9ee0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
9ef0: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  Op->p4type==P4_S
9f00: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
9f10: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
9f20: 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66   (nSub+1)*sizeof
9f30: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
9f40: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
9f50: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
9f60: 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nSub; j++){.   
9f70: 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62         if( apSub
9f80: 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72  [j]==pOp->p4.pPr
9f90: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
9fa0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9fb0: 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20   if( j==nSub && 
9fc0: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74  SQLITE_OK==sqlit
9fd0: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53  e3VdbeMemGrow(pS
9fe0: 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21  ub, nByte, nSub!
9ff0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
a000: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
a010: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
a020: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
a030: 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e  [nSub++] = pOp->
a040: 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20  p4.pProgram;.   
a050: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61         pSub->fla
a060: 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  gs |= MEM_Blob;.
a070: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
a080: 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28  n = nSub*sizeof(
a090: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
a0a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a0b0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d      }..    pMem-
a0c0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
a0d0: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
a0e0: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a100: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
a110: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
a120: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
a130: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
a140: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
a150: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
a160: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20  u.i = pOp->p2;  
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
a190: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
a1a0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
a1b0: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
a1c0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
a1d0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
a1e0: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
a1f0: 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
a200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a210: 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  3 */.    pMem->t
a220: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
a230: 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  EGER;.    pMem++
a240: 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ;..    if( sqlit
a250: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d  e3VdbeMemGrow(pM
a260: 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20  em, 32, 0) ){   
a270: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a           /* P4 *
a280: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
a290: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
a2a0: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
a2b0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
a2c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
a2d0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79  ->flags = MEM_Dy
a2e0: 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  n|MEM_Str|MEM_Te
a2f0: 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64 69  rm;.    zP4 = di
a300: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65  splayP4(pOp, pMe
a310: 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69  m->z, 32);.    i
a320: 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20  f( zP4!=pMem->z 
a330: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a340: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d  VdbeMemSetStr(pM
a350: 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c  em, zP4, -1, SQL
a360: 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20  ITE_UTF8, 0);.  
a370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
a380: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
a390: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
a3a0: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
a3b0: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
a3c0: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
a3d0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
a3e0: 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79    }.    pMem->ty
a3f0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
a400: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
a410: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
a420: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66  n==1 ){.      if
a430: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
a440: 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20 30 29  Grow(pMem, 4, 0)
a450: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
a460: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
a470: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
a480: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a490: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
a4a0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
a4b0: 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f  s = MEM_Dyn|MEM_
a4c0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
a4d0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b      pMem->n = 2;
a4e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
a4f0: 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d  nprintf(3, pMem-
a500: 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d  >z, "%.2x", pOp-
a510: 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f  >p5);   /* P5 */
a520: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  .      pMem->typ
a530: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
a540: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
a550: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
a560: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
a570: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
a580: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
a590: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28  MMENTS.      if(
a5a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
a5b0: 72 6f 77 28 70 4d 65 6d 2c 20 35 30 30 2c 20 30  row(pMem, 500, 0
a5c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
a5d0: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
a5e0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
a5f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a600: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
a610: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
a620: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
a630: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
a640: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64       pMem->n = d
a650: 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f  isplayComment(pO
a660: 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c  p, zP4, pMem->z,
a670: 20 35 30 30 29 3b 0a 20 20 20 20 20 20 70 4d 65   500);.      pMe
a680: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
a690: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65  _TEXT;.      pMe
a6a0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
a6b0: 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20  UTF8;.#else.    
a6c0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
a6d0: 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20  MEM_Null;       
a6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6f0: 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20  /* Comment */.  
a700: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
a710: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 23 65   SQLITE_NULL;.#e
a720: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
a730: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
a740: 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69  8 - 4*(p->explai
a750: 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65  n-1);.    p->pRe
a760: 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d  sultSet = &p->aM
a770: 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63  em[1];.    p->rc
a780: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
a790: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
a7a0: 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  W;.  }.  return 
a7b0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
a7c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
a7d0: 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AIN */..#ifdef S
a7e0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
a7f0: 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20  * Print the SQL 
a800: 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f  that was used to
a810: 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45   generate a VDBE
a820: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
a830: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
a840: 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ntSql(Vdbe *p){.
a850: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
a860: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53  = 0;.  if( p->zS
a870: 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d  ql ){.    z = p-
a880: 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69  >zSql;.  }else i
a890: 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a  f( p->nOp>=1 ){.
a8a0: 20 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70      const VdbeOp
a8b0: 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b   *pOp = &p->aOp[
a8c0: 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  0];.    if( pOp-
a8d0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63  >opcode==OP_Trac
a8e0: 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  e && pOp->p4.z!=
a8f0: 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70  0 ){.      z = p
a900: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20  Op->p4.z;.      
a910: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
a920: 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b  space(*z) ) z++;
a930: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
a940: 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c   z ) printf("SQL
a950: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d  : [%s]\n", z);.}
a960: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
a970: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a980: 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69  T_TRACE) && defi
a990: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
a9a0: 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a  E_IOTRACE)./*.**
a9b0: 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43   Print an IOTRAC
a9c0: 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e  E message showin
a9d0: 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a  g SQL content..*
a9e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
a9f0: 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62  beIOTraceSql(Vdb
aa00: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70  e *p){.  int nOp
aa10: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62   = p->nOp;.  Vdb
aa20: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
aa30: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d  sqlite3IoTrace==
aa40: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
aa50: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
aa60: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
aa70: 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p[0];.  if( pOp-
aa80: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63  >opcode==OP_Trac
aa90: 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  e && pOp->p4.z!=
aaa0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  0 ){.    int i, 
aab0: 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30  j;.    char z[10
aac0: 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  00];.    sqlite3
aad0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
aae0: 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f  (z), z, "%s", pO
aaf0: 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f  p->p4.z);.    fo
ab00: 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73  r(i=0; sqlite3Is
ab10: 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b  space(z[i]); i++
ab20: 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ){}.    for(j=0;
ab30: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
ab40: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
ab50: 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20  space(z[i]) ){. 
ab60: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31         if( z[i-1
ab70: 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20  ]!=' ' ){.      
ab80: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27      z[j++] = ' '
ab90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
aba0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
abb0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
abc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
abd0: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20    z[j] = 0;.    
abe0: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22  sqlite3IoTrace("
abf0: 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  SQL %s\n", z);. 
ac00: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
ac10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
ac20: 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  E && SQLITE_ENAB
ac30: 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f  LE_IOTRACE */../
ac40: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70  *.** Allocate sp
ac50: 61 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64  ace from a fixed
ac60: 20 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e 64   size buffer and
ac70: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
ac80: 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61  r to.** that spa
ac90: 63 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63  ce.  If insuffic
aca0: 69 65 6e 74 20 73 70 61 63 65 20 69 73 20 61 76  ient space is av
acb0: 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20  ailable, return 
acc0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
acd0: 70 42 75 66 20 70 61 72 61 6d 65 74 65 72 20 69  pBuf parameter i
ace0: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
acf0: 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  lue of a pointer
ad00: 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72   which will.** r
ad10: 65 63 65 69 76 65 20 74 68 65 20 6e 65 77 20 6d  eceive the new m
ad20: 65 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73 20  emory.  pBuf is 
ad30: 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20  normally NULL.  
ad40: 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a  If pBuf is not.*
ad50: 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73  * NULL, it means
ad60: 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61   that memory spa
ad70: 63 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ce has already b
ad80: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
ad90: 64 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 72  d that.** this r
ada0: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f  outine should no
adb0: 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e  t allocate any n
adc0: 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e  ew memory.  When
add0: 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20   pBuf is not.** 
ade0: 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 75  NULL simply retu
adf0: 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61  rn pBuf.  Only a
ae00: 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f  llocate new memo
ae10: 72 79 20 73 70 61 63 65 20 77 68 65 6e 20 70 42  ry space when pB
ae20: 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a  uf.** is NULL..*
ae30: 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68  *.** nByte is th
ae40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
ae50: 73 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65  s of space neede
ae60: 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d  d..**.** *ppFrom
ae70: 20 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 69 6c   points to avail
ae80: 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20 70  able space and p
ae90: 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  End points to th
aea0: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
aeb0: 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e  available space.
aec0: 20 20 57 68 65 6e 20 73 70 61 63 65 20 69 73 20    When space is 
aed0: 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46 72  allocated, *ppFr
aee0: 6f 6d 20 69 73 20 61 64 76 61 6e 63 65 64 20 70  om is advanced p
aef0: 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  ast.** the end o
af00: 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  f the allocated 
af10: 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e  space..**.** *pn
af20: 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74 65  Byte is a counte
af30: 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  r of the number 
af40: 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
af50: 65 20 74 68 61 74 20 68 61 76 65 20 66 61 69 6c  e that have fail
af60: 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74  ed.** to allocat
af70: 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
af80: 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  insufficient spa
af90: 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f  ce in *ppFrom to
afa0: 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20   satisfy the.** 
afb0: 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69 6e  request, then in
afc0: 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20  crement *pnByte 
afd0: 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  by the amount of
afe0: 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f   the request..*/
aff0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c  .static void *al
b000: 6c 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69 64  locSpace(.  void
b010: 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
b020: 20 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72 6e   /* Where return
b030: 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62 65   pointer will be
b040: 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74   stored */.  int
b050: 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
b060: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
b070: 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
b080: 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f   */.  u8 **ppFro
b090: 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e  m,         /* IN
b0a0: 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66  /OUT: Allocate f
b0b0: 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20  rom *ppFrom */. 
b0c0: 20 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20   u8 *pEnd,      
b0d0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
b0e0: 20 74 6f 20 31 20 62 79 74 65 20 70 61 73 74 20   to 1 byte past 
b0f0: 74 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 72  the end of *ppFr
b100: 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  om buffer */.  i
b110: 6e 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20  nt *pnByte      
b120: 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61      /* If alloca
b130: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d  tion cannot be m
b140: 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a  ade, increment *
b150: 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61  pnByte */.){.  a
b160: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
b170: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46  E_ALIGNMENT(*ppF
b180: 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70 42  rom) );.  if( pB
b190: 75 66 20 29 20 72 65 74 75 72 6e 20 70 42 75 66  uf ) return pBuf
b1a0: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  ;.  nByte = ROUN
b1b0: 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  D8(nByte);.  if(
b1c0: 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74   &(*ppFrom)[nByt
b1d0: 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20  e] <= pEnd ){.  
b1e0: 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29    pBuf = (void*)
b1f0: 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70  *ppFrom;.    *pp
b200: 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  From += nByte;. 
b210: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42   }else{.    *pnB
b220: 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  yte += nByte;.  
b230: 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b  }.  return pBuf;
b240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64  .}../*.** Rewind
b250: 20 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74   the VDBE back t
b260: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
b270: 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66  in preparation f
b280: 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74  or.** running it
b290: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b2a0: 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65  3VdbeRewind(Vdbe
b2b0: 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65   *p){.#if define
b2c0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
b2d0: 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  || defined(VDBE_
b2e0: 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69  PROFILE).  int i
b2f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
b300: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
b310: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
b320: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
b330: 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68  ;..  /* There sh
b340: 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74  ould be at least
b350: 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a   one opcode..  *
b360: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  /.  assert( p->n
b370: 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  Op>0 );..  /* Se
b380: 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56  t the magic to V
b390: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f  DBE_MAGIC_RUN so
b3a0: 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
b3b0: 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e   later. */.  p->
b3c0: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
b3d0: 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20  IC_RUN;..#ifdef 
b3e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
b3f0: 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65  or(i=1; i<p->nMe
b400: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  m; i++){.    ass
b410: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  ert( p->aMem[i].
b420: 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d  db==p->db );.  }
b430: 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20  .#endif.  p->pc 
b440: 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  = -1;.  p->rc = 
b450: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e  SQLITE_OK;.  p->
b460: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
b470: 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67  _Abort;.  p->mag
b480: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
b490: 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67  RUN;.  p->nChang
b4a0: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  e = 0;.  p->cach
b4b0: 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d  eCtr = 1;.  p->m
b4c0: 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61  inWriteFileForma
b4d0: 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53  t = 255;.  p->iS
b4e0: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
b4f0: 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
b500: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42   = 0;.#ifdef VDB
b510: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28  E_PROFILE.  for(
b520: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
b530: 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  ++){.    p->aOp[
b540: 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  i].cnt = 0;.    
b550: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
b560: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
b570: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
b580: 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68  e a virtual mach
b590: 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ine for executio
b5a0: 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  n for the first 
b5b0: 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72  time after.** cr
b5c0: 65 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75  eating the virtu
b5d0: 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69  al machine.  Thi
b5e0: 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67  s involves thing
b5f0: 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c  s such.** as all
b600: 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73 70  ocating stack sp
b610: 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ace and initiali
b620: 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d  zing the program
b630: 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74   counter..** Aft
b640: 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20  er the VDBE has 
b650: 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63  be prepped, it c
b660: 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62  an be executed b
b670: 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  y one or more.**
b680: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
b690: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a  3VdbeExec().  .*
b6a0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
b6b0: 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
b6c0: 20 65 78 61 63 74 20 6f 6e 63 65 20 6f 6e 20 61   exact once on a
b6d0: 20 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61   each virtual ma
b6e0: 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20  chine..** After 
b6f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
b700: 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61  called the VM ha
b710: 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64  s been "packaged
b720: 22 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a  " and is ready.*
b730: 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72  * to run.  After
b740: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
b750: 20 63 61 6c 6c 65 64 2c 20 66 75 74 68 65 72 20   called, futher 
b760: 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c  calls to .** sql
b770: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 29 20  ite3VdbeAddOp() 
b780: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72  functions are pr
b790: 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69 73 20  ohibited.  This 
b7a0: 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65  routine disconne
b7b0: 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  cts.** the Vdbe 
b7c0: 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f  from the Parse o
b7d0: 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70 65  bject that helpe
b7e0: 64 20 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f  d generate it so
b7f0: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65   that the.** the
b800: 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e   Vdbe becomes an
b810: 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74   independent ent
b820: 69 74 79 20 61 6e 64 20 74 68 65 20 50 61 72 73  ity and the Pars
b830: 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a  e object can be.
b840: 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a  ** destroyed..**
b850: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69  .** Use the sqli
b860: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 29 20  te3VdbeRewind() 
b870: 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73  procedure to res
b880: 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  tore a virtual m
b890: 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74  achine back.** t
b8a0: 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74  o its initial st
b8b0: 61 74 65 20 61 66 74 65 72 20 69 74 20 68 61 73  ate after it has
b8c0: 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f   been run..*/.vo
b8d0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  id sqlite3VdbeMa
b8e0: 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20  keReady(.  Vdbe 
b8f0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
b900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b910: 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65   VDBE */.  Parse
b920: 20 2a 70 50 61 72 73 65 20 20 20 20 20 20 20 20   *pParse        
b930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
b940: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
b950: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
b960: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b970: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
b980: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
b990: 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20  /.  int nVar;   
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b9c0: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
b9d0: 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20  int nMem;       
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b9f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d  * Number of VM m
ba00: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20  emory registers 
ba10: 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72  */.  int nCursor
ba20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ba30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ba40: 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72 65   cursors require
ba50: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b  d */.  int nArg;
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ba80: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20  of arguments in 
ba90: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
baa0: 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20   int nOnce;     
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bac0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f  /* Number of OP_
bad0: 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  Once instruction
bae0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  s */.  int n;   
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb00: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
bb10: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a  unter */.  u8 *z
bb20: 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Csr;            
bb30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
bb40: 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ory available fo
bb50: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
bb60: 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20    u8 *zEnd;     
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
bb90: 61 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  ast allocated me
bba0: 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  mory */.  int nB
bbb0: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
bbc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
bbd0: 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72  much extra memor
bbe0: 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a  y is needed */..
bbf0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
bc00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
bc10: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
bc20: 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
bc30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
bc40: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
bc50: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
bc60: 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73  pParse==p->pPars
bc70: 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e );.  db = p->d
bc80: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  b;.  assert( db-
bc90: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
bca0: 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61   );.  nVar = pPa
bcb0: 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65  rse->nVar;.  nMe
bcc0: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
bcd0: 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50  ;.  nCursor = pP
bce0: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41  arse->nTab;.  nA
bcf0: 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61  rg = pParse->nMa
bd00: 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20  xArg;.  nOnce = 
bd10: 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20  pParse->nOnce;. 
bd20: 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20   if( nOnce==0 ) 
bd30: 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e  nOnce = 1; /* En
bd40: 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  sure at least on
bd50: 65 20 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e  e byte in p->aOn
bd60: 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20  ceFlag[] */.  . 
bd70: 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72   /* For each cur
bd80: 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c  sor required, al
bd90: 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65  so allocate a me
bda0: 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72  mory cell. Memor
bdb0: 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d  y.  ** cells (nM
bdc0: 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e  em+1-nCursor)..n
bdd0: 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20  Mem, inclusive, 
bde0: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
bdf0: 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76  ed by.  ** the v
be00: 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73  dbe program. Ins
be10: 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73  tead they are us
be20: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
be30: 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64  pace for.  ** Vd
be40: 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f  beCursor/BtCurso
be50: 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68  r structures. Th
be60: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
be70: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
be80: 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20   .  ** cursor 0 
be90: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  is stored in mem
bea0: 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d  ory cell nMem. M
beb0: 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d  emory cell (nMem
bec0: 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  -1).  ** stores 
bed0: 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  the blob of memo
bee0: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
bef0: 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63  th cursor 1, etc
bf00: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
bf10: 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75  also: allocateCu
bf20: 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e  rsor()..  */.  n
bf30: 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a  Mem += nCursor;.
bf40: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
bf50: 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
bf60: 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76  registers, SQL v
bf70: 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63  ariables, VDBE c
bf80: 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a  ursors and .  **
bf90: 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72   an array to mar
bfa0: 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f  shal SQL functio
bfb0: 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 0a  n arguments in..
bfc0: 20 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28 75    */.  zCsr = (u
bfd0: 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f  8*)&p->aOp[p->nO
bfe0: 70 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  p];            /
bff0: 2a 20 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61 62  * Memory avaliab
c000: 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f  le for allocatio
c010: 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20 3d 20 28 75  n */.  zEnd = (u
c020: 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 50 61 72 73  8*)&p->aOp[pPars
c030: 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f  e->nOpAlloc];  /
c040: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
c050: 74 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20  t end of zCsr[] 
c060: 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56  */..  resolveP2V
c070: 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b  alues(p, &nArg);
c080: 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  .  p->usesStmtJo
c090: 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61  urnal = (u8)(pPa
c0a0: 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  rse->isMultiWrit
c0b0: 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79  e && pParse->may
c0c0: 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50  Abort);.  if( pP
c0d0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26  arse->explain &&
c0e0: 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20   nMem<10 ){.    
c0f0: 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20  nMem = 10;.  }. 
c100: 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c   memset(zCsr, 0,
c110: 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a   zEnd-zCsr);.  z
c120: 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28  Csr += (zCsr - (
c130: 75 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 65  u8*)0)&7;.  asse
c140: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
c150: 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29  LIGNMENT(zCsr) )
c160: 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  ;.  p->expired =
c170: 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79   0;..  /* Memory
c180: 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20   for registers, 
c190: 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73  parameters, curs
c1a0: 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f  or, etc, is allo
c1b0: 63 61 74 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a  cated in two.  *
c1c0: 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68  * passes.  On th
c1d0: 65 20 66 69 72 73 74 20 70 61 73 73 2c 20 77 65  e first pass, we
c1e0: 20 74 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e   try to reuse un
c1f0: 75 73 65 64 20 73 70 61 63 65 20 61 74 20 74 68  used space at th
c200: 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  e .  ** end of t
c210: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  he opcode array.
c220: 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62    If we are unab
c230: 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c  le to satisfy al
c240: 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65  l memory.  ** re
c250: 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65  quirements by re
c260: 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65  using the opcode
c270: 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65   array tail, the
c280: 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a  n the second.  *
c290: 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c  * pass will fill
c2a0: 20 69 6e 20 74 68 65 20 72 65 73 74 20 75 73 69   in the rest usi
c2b0: 6e 67 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63  ng a fresh alloc
c2c0: 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20  ation.  .  **.  
c2d0: 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73  ** This two-pass
c2e0: 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20 72   approach that r
c2f0: 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65  euses as much me
c300: 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65  mory as possible
c310: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c   from.  ** the l
c320: 65 66 74 6f 76 65 72 20 73 70 61 63 65 20 61 74  eftover space at
c330: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
c340: 6f 70 63 6f 64 65 20 61 72 72 61 79 20 63 61 6e  opcode array can
c350: 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20   significantly. 
c360: 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61   ** reduce the a
c370: 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20  mount of memory 
c380: 68 65 6c 64 20 62 79 20 61 20 70 72 65 70 61 72  held by a prepar
c390: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ed statement..  
c3a0: 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42  */.  do {.    nB
c3b0: 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  yte = 0;.    p->
c3c0: 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aMem = allocSpac
c3d0: 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a  e(p->aMem, nMem*
c3e0: 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43  sizeof(Mem), &zC
c3f0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
c400: 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d  );.    p->aVar =
c410: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
c420: 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66  Var, nVar*sizeof
c430: 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45  (Mem), &zCsr, zE
c440: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
c450: 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f   p->apArg = allo
c460: 63 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67 2c  cSpace(p->apArg,
c470: 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d   nArg*sizeof(Mem
c480: 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  *), &zCsr, zEnd,
c490: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
c4a0: 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70  >azVar = allocSp
c4b0: 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56  ace(p->azVar, nV
c4c0: 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  ar*sizeof(char*)
c4d0: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
c4e0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
c4f0: 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pCsr = allocSpac
c500: 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72  e(p->apCsr, nCur
c510: 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43  sor*sizeof(VdbeC
c520: 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20  ursor*),.       
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c540: 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20     &zCsr, zEnd, 
c550: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
c560: 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f  aOnceFlag = allo
c570: 63 53 70 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46  cSpace(p->aOnceF
c580: 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43 73  lag, nOnce, &zCs
c590: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
c5a0: 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20  ;.    if( nByte 
c5b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 46 72 65  ){.      p->pFre
c5c0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
c5d0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
c5e0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43  e);.    }.    zC
c5f0: 73 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20  sr = p->pFree;. 
c600: 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b     zEnd = &zCsr[
c610: 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 68 69 6c 65  nByte];.  }while
c620: 28 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e  ( nByte && !db->
c630: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
c640: 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  p->nCursor = 
c650: 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f  nCursor;.  p->nO
c660: 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b  nceFlag = nOnce;
c670: 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29  .  if( p->aVar )
c680: 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20  {.    p->nVar = 
c690: 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20  (ynVar)nVar;.   
c6a0: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72   for(n=0; n<nVar
c6b0: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; n++){.      p-
c6c0: 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aVar[n].flags =
c6d0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
c6e0: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d   p->aVar[n].db =
c6f0: 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   db;.    }.  }. 
c700: 20 69 66 28 20 70 2d 3e 61 7a 56 61 72 20 29 7b   if( p->azVar ){
c710: 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20  .    p->nzVar = 
c720: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20  pParse->nzVar;. 
c730: 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 56     memcpy(p->azV
c740: 61 72 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  ar, pParse->azVa
c750: 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65  r, p->nzVar*size
c760: 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30 5d 29 29  of(p->azVar[0]))
c770: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  ;.    memset(pPa
c780: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30 2c 20 70  rse->azVar, 0, p
c790: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a  Parse->nzVar*siz
c7a0: 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 7a 56 61  eof(pParse->azVa
c7b0: 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  r[0]));.  }.  if
c7c0: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
c7d0: 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20   p->aMem--;     
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7f0: 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20   /* aMem[] goes 
c800: 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a  from 1..nMem */.
c810: 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
c820: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
c830: 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74      /*       not
c840: 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20   from 0..nMem-1 
c850: 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20  */.    for(n=1; 
c860: 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20  n<=nMem; n++){. 
c870: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
c880: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 76 61  flags = MEM_Inva
c890: 6c 69 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  lid;.      p->aM
c8a0: 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  em[n].db = db;. 
c8b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78     }.  }.  p->ex
c8c0: 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e  plain = pParse->
c8d0: 65 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74  explain;.  sqlit
c8e0: 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b  e3VdbeRewind(p);
c8f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
c900: 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e  a VDBE cursor an
c910: 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  d release all th
c920: 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74  e resources that
c930: 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70   cursor .** happ
c940: 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a  ens to hold..*/.
c950: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
c960: 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20  FreeCursor(Vdbe 
c970: 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a  *p, VdbeCursor *
c980: 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d  pCx){.  if( pCx=
c990: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
c9a0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
c9b0: 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70  dbeSorterClose(p
c9c0: 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 69 66  ->db, pCx);.  if
c9d0: 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pCx->pBt ){.  
c9e0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
c9f0: 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20  ose(pCx->pBt);. 
ca00: 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70     /* The pCx->p
ca10: 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63  Cursor will be c
ca20: 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  lose automatical
ca30: 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ly, if it exists
ca40: 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20  , by.    ** the 
ca50: 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20  call above. */. 
ca60: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e   }else if( pCx->
ca70: 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  pCursor ){.    s
ca80: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
ca90: 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72  Cursor(pCx->pCur
caa0: 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  sor);.  }.#ifnde
cab0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
cac0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
cad0: 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f   pCx->pVtabCurso
cae0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
caf0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
cb00: 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d  tabCursor = pCx-
cb10: 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  >pVtabCursor;.  
cb20: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
cb30: 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20  module *pModule 
cb40: 3d 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70  = pVtabCursor->p
cb50: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
cb60: 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68     p->inVtabMeth
cb70: 6f 64 20 3d 20 31 3b 0a 20 20 20 20 70 4d 6f 64  od = 1;.    pMod
cb80: 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61  ule->xClose(pVta
cb90: 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 2d  bCursor);.    p-
cba0: 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20  >inVtabMethod = 
cbb0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  0;.  }.#endif.}.
cbc0: 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20  ./*.** Copy the 
cbd0: 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
cbe0: 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 73   the VdbeFrame s
cbf0: 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
cc00: 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73  Vdbe. This.** is
cc10: 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70   used, for examp
cc20: 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67  le, when a trigg
cc30: 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69  er sub-program i
cc40: 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74  s halted to rest
cc50: 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74  ore.** control t
cc60: 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  o the main progr
cc70: 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  am..*/.int sqlit
cc80: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
cc90: 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46  re(VdbeFrame *pF
cca0: 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  rame){.  Vdbe *v
ccb0: 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20   = pFrame->v;.  
ccc0: 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70  v->aOnceFlag = p
ccd0: 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67  Frame->aOnceFlag
cce0: 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67  ;.  v->nOnceFlag
ccf0: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65   = pFrame->nOnce
cd00: 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d  Flag;.  v->aOp =
cd10: 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20   pFrame->aOp;.  
cd20: 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d  v->nOp = pFrame-
cd30: 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20  >nOp;.  v->aMem 
cd40: 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a  = pFrame->aMem;.
cd50: 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61    v->nMem = pFra
cd60: 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61  me->nMem;.  v->a
cd70: 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61  pCsr = pFrame->a
cd80: 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73  pCsr;.  v->nCurs
cd90: 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75  or = pFrame->nCu
cda0: 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c  rsor;.  v->db->l
cdb0: 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d  astRowid = pFram
cdc0: 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20  e->lastRowid;.  
cdd0: 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  v->nChange = pFr
cde0: 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20  ame->nChange;.  
cdf0: 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70  return pFrame->p
ce00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
ce10: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
ce20: 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73  *.** Also releas
ce30: 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65  e any dynamic me
ce40: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65  mory held by the
ce50: 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e   VM in the Vdbe.
ce60: 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20  aMem memory .** 
ce70: 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73  cell array. This
ce80: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73   is necessary as
ce90: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
cea0: 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61   array may conta
ceb0: 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74  in.** pointers t
cec0: 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65  o VdbeFrame obje
ced0: 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69  cts, which may i
cee0: 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70  n turn contain p
cef0: 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70  ointers to.** op
cf00: 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73  en cursors..*/.s
cf10: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
cf20: 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20  AllCursors(Vdbe 
cf30: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46  *p){.  if( p->pF
cf40: 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
cf50: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20  Frame *pFrame;. 
cf60: 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d     for(pFrame=p-
cf70: 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d  >pFrame; pFrame-
cf80: 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65  >pParent; pFrame
cf90: 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74  =pFrame->pParent
cfa0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
cfb0: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70  beFrameRestore(p
cfc0: 46 72 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d  Frame);.  }.  p-
cfd0: 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70  >pFrame = 0;.  p
cfe0: 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20  ->nFrame = 0;.. 
cff0: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b   if( p->apCsr ){
d000: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
d010: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
d020: 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ursor; i++){.   
d030: 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70     VdbeCursor *p
d040: 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b  C = p->apCsr[i];
d050: 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b  .      if( pC ){
d060: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d070: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
d080: 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70  , pC);.        p
d090: 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
d0a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d0b0: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  }.  if( p->aMem 
d0c0: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
d0d0: 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b  mArray(&p->aMem[
d0e0: 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  1], p->nMem);.  
d0f0: 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44  }.  while( p->pD
d100: 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  elFrame ){.    V
d110: 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d  dbeFrame *pDel =
d120: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20   p->pDelFrame;. 
d130: 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20     p->pDelFrame 
d140: 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b  = pDel->pParent;
d150: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d160: 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c  FrameDelete(pDel
d170: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
d180: 65 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20  ete any auxdata 
d190: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65  allocations made
d1a0: 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20   by the VM */.  
d1b0: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
d1c0: 65 41 75 78 44 61 74 61 28 70 2c 20 2d 31 2c 20  eAuxData(p, -1, 
d1d0: 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0);.  assert( p-
d1e0: 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a  >pAuxData==0 );.
d1f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
d200: 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65  p the VM after e
d210: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  xecution..**.** 
d220: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
d230: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
d240: 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72  close any cursor
d250: 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72  s, lists, and/or
d260: 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74  .** sorters that
d270: 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e   were left open.
d280: 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65    It also delete
d290: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a  s the values of.
d2a0: 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  ** variables in 
d2b0: 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79  the aVar[] array
d2c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d2d0: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70   Cleanup(Vdbe *p
d2e0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
d2f0: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65   = p->db;..#ifde
d300: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
d310: 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65   /* Execute asse
d320: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
d330: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
d340: 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20  he Vdbe.apCsr[] 
d350: 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61  and .  ** Vdbe.a
d360: 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76  Mem[] arrays hav
d370: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  e already been c
d380: 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20  leaned up.  */. 
d390: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
d3a0: 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30  >apCsr ) for(i=0
d3b0: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
d3c0: 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
d3d0: 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20  apCsr[i]==0 );. 
d3e0: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
d3f0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
d400: 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73  p->nMem; i++) as
d410: 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d  sert( p->aMem[i]
d420: 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 76 61  .flags==MEM_Inva
d430: 6c 69 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  lid );.  }.#endi
d440: 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  f..  sqlite3DbFr
d450: 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
d460: 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
d470: 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75   = 0;.  p->pResu
d480: 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ltSet = 0;.}../*
d490: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62  .** Set the numb
d4a0: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
d4b0: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
d4c0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
d4d0: 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  is SQL.** statem
d4e0: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ent. This is now
d4f0: 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20   set at compile 
d500: 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61  time, rather tha
d510: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63  n during.** exec
d520: 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62  ution of the vdb
d530: 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61  e program so tha
d540: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
d550: 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20  _count() can.** 
d560: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
d570: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
d580: 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65  fore sqlite3_ste
d590: 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
d5a0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
d5b0: 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ls(Vdbe *p, int 
d5c0: 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d  nResColumn){.  M
d5d0: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
d5e0: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
d5f0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
d600: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
d610: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
d620: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
d630: 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65  AME_N);.  sqlite
d640: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
d650: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20  ColName);.  n = 
d660: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
d670: 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43  ME_N;.  p->nResC
d680: 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65  olumn = (u16)nRe
d690: 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43  sColumn;.  p->aC
d6a0: 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d  olName = pColNam
d6b0: 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65  e = (Mem*)sqlite
d6c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
d6d0: 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20  , sizeof(Mem)*n 
d6e0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c  );.  if( p->aCol
d6f0: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
d700: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
d710: 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61   0 ){.    pColNa
d720: 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  me->flags = MEM_
d730: 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  Null;.    pColNa
d740: 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  me->db = p->db;.
d750: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a      pColName++;.
d760: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
d770: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
d780: 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74   idx'th column t
d790: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
d7a0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
d7b0: 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73  nt..** zName mus
d7c0: 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
d7d0: 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
d7e0: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ed string..**.**
d7f0: 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   This call must 
d800: 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20  be made after a 
d810: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
d820: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e  dbeSetNumCols().
d830: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c  .**.** The final
d840: 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c   parameter, xDel
d850: 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  , must be one of
d860: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
d870: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a   SQLITE_STATIC.*
d880: 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e  * or SQLITE_TRAN
d890: 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20  SIENT. If it is 
d8a0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
d8b0: 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20  then the buffer 
d8c0: 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
d8d0: 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66   zName will be f
d8e0: 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44  reed by sqlite3D
d8f0: 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65  bFree() when the
d900: 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79   vdbe is destroy
d910: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
d920: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
d930: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d950: 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69       /* Vdbe bei
d960: 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f  ng configured */
d970: 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20  .  int idx,     
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d990: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
d9a0: 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70  column zName app
d9b0: 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  lies to */.  int
d9c0: 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20   var,           
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d9e0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e   One of the COLN
d9f0: 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20  AME_* constants 
da00: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
da10: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
da20: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
da30: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
da40: 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20  ining name */.  
da50: 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
da60: 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  d*)             
da70: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67   /* Memory manag
da80: 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66  ement strategy f
da90: 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  or zName */.){. 
daa0: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a   int rc;.  Mem *
dab0: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65  pColName;.  asse
dac0: 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43  rt( idx<p->nResC
dad0: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
dae0: 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e  t( var<COLNAME_N
daf0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
db00: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
db10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e  .    assert( !zN
db20: 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c  ame || xDel!=SQL
db30: 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20  ITE_DYNAMIC );. 
db40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
db50: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73  _NOMEM;.  }.  as
db60: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d  sert( p->aColNam
db70: 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61  e!=0 );.  pColNa
db80: 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61  me = &(p->aColNa
db90: 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52  me[idx+var*p->nR
dba0: 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63  esColumn]);.  rc
dbb0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
dbc0: 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65  mSetStr(pColName
dbd0: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
dbe0: 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b  ITE_UTF8, xDel);
dbf0: 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30  .  assert( rc!=0
dc00: 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70   || !zName || (p
dc10: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d  ColName->flags&M
dc20: 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20  EM_Term)!=0 );. 
dc30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
dc40: 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77  *.** A read or w
dc50: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
dc60: 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
dc70: 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74  be active on dat
dc80: 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
dc90: 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  db. If a transac
dca0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
dcb0: 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68  commit it. If th
dcc0: 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74  ere is a.** writ
dcd0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70  e-transaction sp
dce0: 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  anning more than
dcf0: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
dd00: 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  le, this routine
dd10: 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f  .** takes care o
dd20: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
dd30: 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a  rnal trickery..*
dd40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
dd50: 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  eCommit(sqlite3 
dd60: 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
dd70: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54   int i;.  int nT
dd80: 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75  rans = 0;  /* Nu
dd90: 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65  mber of database
dda0: 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65  s with an active
ddb0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
ddc0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  on */.  int rc =
ddd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
dde0: 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20  t needXcommit = 
ddf0: 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
de00: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
de10: 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68  BLE.  /* With th
de20: 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74  is option, sqlit
de30: 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20  e3VtabSync() is 
de40: 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69  defined to be si
de50: 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54  mply .  ** SQLIT
de60: 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74  E_OK so p is not
de70: 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55   used. .  */.  U
de80: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
de90: 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  p);.#endif..  /*
dea0: 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   Before doing an
deb0: 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c  ything else, cal
dec0: 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61  l the xSync() ca
ded0: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20  llback for any. 
dee0: 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75   ** virtual modu
def0: 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65  le tables writte
df00: 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  n in this transa
df10: 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20  ction. This has 
df20: 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20  to.  ** be done 
df30: 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69  before determini
df40: 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73  ng whether a mas
df50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
df60: 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72   is .  ** requir
df70: 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28  ed, as an xSync(
df80: 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61  ) callback may a
df90: 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  dd an attached d
dfa0: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20  atabase.  ** to 
dfb0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
dfc0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
dfd0: 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c  ite3VtabSync(db,
dfe0: 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20   p);..  /* This 
dff0: 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20  loop determines 
e000: 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69  (a) if the commi
e010: 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65  t hook should be
e020: 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a   invoked and.  *
e030: 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64  * (b) how many d
e040: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61  atabase files ha
e050: 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  ve open write tr
e060: 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20  ansactions, not 
e070: 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  .  ** including 
e080: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
e090: 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74  e. (b) is import
e0a0: 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d  ant because if m
e0b0: 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f  ore than .  ** o
e0c0: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
e0d0: 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69   has an open wri
e0e0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te transaction, 
e0f0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
e100: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65  .  ** file is re
e110: 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74  quired for an at
e120: 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a  omic commit..  *
e130: 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  / .  for(i=0; rc
e140: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
e150: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
e160: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
e170: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
e180: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
e190: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
e1a0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65  pBt) ){.      ne
e1b0: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  edXcommit = 1;. 
e1c0: 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20       if( i!=1 ) 
e1d0: 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20  nTrans++;.      
e1e0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
e1f0: 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  r(pBt);.      rc
e200: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
e210: 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c  xclusiveLock(sql
e220: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
e230: 42 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Bt));.      sqli
e240: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
e250: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
e260: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e270: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
e280: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  rc;.  }..  /* If
e290: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77   there are any w
e2a0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
e2b0: 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65  s at all, invoke
e2c0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
e2d0: 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63   */.  if( needXc
e2e0: 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f  ommit && db->xCo
e2f0: 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  mmitCallback ){.
e300: 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f      rc = db->xCo
e310: 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d  mmitCallback(db-
e320: 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20  >pCommitArg);.  
e330: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
e340: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e350: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49  CONSTRAINT_COMMI
e360: 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  THOOK;.    }.  }
e370: 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c  ..  /* The simpl
e380: 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65  e case - no more
e390: 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
e3a0: 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75  se file (not cou
e3b0: 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54  nting the.  ** T
e3c0: 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61  EMP database) ha
e3d0: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
e3e0: 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20  active.   There 
e3f0: 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74  is no need for t
e400: 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  he.  ** master-j
e410: 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  ournal..  **.  *
e420: 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20  * If the return 
e430: 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33  value of sqlite3
e440: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
e450: 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e  () is a zero len
e460: 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c  gth.  ** string,
e470: 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61   it means the ma
e480: 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a  in database is :
e490: 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d  memory: or a tem
e4a0: 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a  p file.  In .  *
e4b0: 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64  * that case we d
e4c0: 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74  o not support at
e4d0: 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20  omic multi-file 
e4e0: 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20  commits, so use 
e4f0: 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65  the .  ** simple
e500: 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a   case then too..
e510: 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71    */.  if( 0==sq
e520: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71  lite3Strlen30(sq
e530: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
e540: 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
e550: 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72  .pBt)).   || nTr
e560: 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20  ans<=1.  ){.    
e570: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
e580: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
e590: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
e5a0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
e5b0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
e5c0: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
e5d0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
e5e0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
e5f0: 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a  aseOne(pBt, 0);.
e600: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
e610: 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
e620: 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20  mit only if all 
e630: 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73  databases succes
e640: 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20  sfully complete 
e650: 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a  phase 1. .    **
e660: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42   If one of the B
e670: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
e680: 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73  ne() calls fails
e690: 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
e6a0: 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72   an.    ** IO er
e6b0: 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69  ror while deleti
e6c0: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
e6d0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
e6e0: 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c   It is unlikely,
e6f0: 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c  .    ** but coul
e700: 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69  d happen. In thi
e710: 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70  s case abandon p
e720: 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65  rocessing and re
e730: 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a  turn the error..
e740: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
e750: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
e760: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
e770: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
e780: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
e790: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
e7a0: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
e7b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
e7c0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
e7d0: 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  o(pBt, 0);.     
e7e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
e7f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e800: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
e810: 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
e820: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
e830: 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20  he complex case 
e840: 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c  - There is a mul
e850: 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72  ti-file write-tr
e860: 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
e870: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75  ..  ** This requ
e880: 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  ires a master jo
e890: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e  urnal file to en
e8a0: 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  sure the transac
e8b0: 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
e8c0: 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e  mitted atomicly.
e8d0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
e8e0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
e8f0: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c  .  else{.    sql
e900: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
e910: 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69   db->pVfs;.    i
e920: 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
e930: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
e940: 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c  er = 0;   /* Fil
e950: 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d  e-name for the m
e960: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f  aster journal */
e970: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
e980: 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c  *zMainFile = sql
e990: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
e9a0: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
e9b0: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
e9c0: 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20  3_file *pMaster 
e9d0: 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  = 0;.    i64 off
e9e0: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  set = 0;.    int
e9f0: 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65   res;.    int re
ea00: 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  tryCount = 0;.  
ea10: 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b    int nMainFile;
ea20: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
ea30: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
ea40: 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   file name */.  
ea50: 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71    nMainFile = sq
ea60: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
ea70: 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d  ainFile);.    zM
ea80: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
ea90: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d  Printf(db, "%s-m
eaa0: 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d  jXXXXXX9XXz", zM
eab0: 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  ainFile);.    if
eac0: 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72  ( zMaster==0 ) r
ead0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
eae0: 45 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  EM;.    do {.   
eaf0: 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a     u32 iRandom;.
eb00: 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43        if( retryC
eb10: 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ount ){.        
eb20: 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31  if( retryCount>1
eb30: 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  00 ){.          
eb40: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
eb50: 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c  TE_FULL, "MJ del
eb60: 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65  ete: %s", zMaste
eb70: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
eb80: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
eb90: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
eba0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
ebb0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
ebc0: 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d  if( retryCount==
ebd0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  1 ){.          s
ebe0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
ebf0: 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c  E_FULL, "MJ coll
ec00: 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65  ide: %s", zMaste
ec10: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
ec20: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72      }.      retr
ec30: 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  yCount++;.      
ec40: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
ec50: 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f  ss(sizeof(iRando
ec60: 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20  m), &iRandom);. 
ec70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
ec80: 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74  rintf(13, &zMast
ec90: 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22  er[nMainFile], "
eca0: 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20  -mj%06X9%02X",. 
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
ecd0: 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66  Random>>8)&0xfff
ece0: 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66  fff, iRandom&0xf
ecf0: 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  f);.      /* The
ed00: 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65   antipenultimate
ed10: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
ed20: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ed30: 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20   name must.     
ed40: 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76   ** be "9" to av
ed50: 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69  oid name collisi
ed60: 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38  ons when using 8
ed70: 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f  +3 filenames. */
ed80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
ed90: 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74  Master[sqlite3St
eda0: 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d  rlen30(zMaster)-
edb0: 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20  3]=='9' );.     
edc0: 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
edd0: 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a  ix3(zMainFile, z
ede0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
edf0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
ee00: 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
ee10: 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
ee20: 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
ee30: 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
ee40: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73  SQLITE_OK && res
ee50: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
ee60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ee70: 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d     /* Open the m
ee80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a  aster journal. *
ee90: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
eea0: 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63  ite3OsOpenMalloc
eeb0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
eec0: 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20  &pMaster, .     
eed0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
eee0: 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
eef0: 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20  E_OPEN_CREATE|. 
ef00: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
ef10: 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53  OPEN_EXCLUSIVE|S
ef20: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
ef30: 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20  R_JOURNAL, 0.   
ef40: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
ef50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ef60: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
ef70: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
ef80: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
ef90: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a  urn rc;.    }. .
efa0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
efb0: 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61   name of each da
efc0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74  tabase file in t
efd0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
efe0: 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20  nto the new.    
eff0: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
f000: 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72  l file. If an er
f010: 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68  ror occurs at th
f020: 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20  is point close. 
f030: 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65     ** and delete
f040: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f050: 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68  nal file. All th
f060: 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  e individual jou
f070: 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a  rnal files.    *
f080: 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75  * still have 'nu
f090: 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65  ll' as the maste
f0a0: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
f0b0: 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20  r, so they will 
f0c0: 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b  roll.    ** back
f0d0: 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69   independently i
f0e0: 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
f0f0: 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  rs..    */.    f
f100: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
f110: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
f120: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
f130: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
f140: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
f150: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
f160: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
f170: 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20   const *zFile = 
f180: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a  sqlite3BtreeGetJ
f190: 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b  ournalname(pBt);
f1a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69  .        if( zFi
f1b0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
f1c0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
f1d0: 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64   Ignore TEMP and
f1e0: 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61   :memory: databa
f1f0: 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ses */.        }
f200: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f210: 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a   zFile[0]!=0 );.
f220: 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65          if( !nee
f230: 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65  dSync && !sqlite
f240: 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
f250: 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ed(pBt) ){.     
f260: 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
f270: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
f280: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f290: 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72  3OsWrite(pMaster
f2a0: 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33  , zFile, sqlite3
f2b0: 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
f2c0: 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
f2d0: 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71      offset += sq
f2e0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
f2f0: 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20  ile)+1;.        
f300: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f310: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
f320: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
f330: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
f340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
f350: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
f360: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
f370: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
f380: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
f390: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
f3a0: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
f3b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
f3c0: 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
f3d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
f3e0: 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
f3f0: 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
f400: 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
f410: 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
f420: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
f430: 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e  .    if( needSyn
f440: 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73  c .     && 0==(s
f450: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
f460: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d  aracteristics(pM
f470: 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f  aster)&SQLITE_IO
f480: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a  CAP_SEQUENTIAL).
f490: 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f       && SQLITE_O
f4a0: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
f4b0: 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20  OsSync(pMaster, 
f4c0: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
f4d0: 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  AL)).    ){.    
f4e0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
f4f0: 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
f500: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
f510: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
f520: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  er, 0);.      sq
f530: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f540: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
f550: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
f560: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c  ..    /* Sync al
f570: 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69  l the db files i
f580: 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74  nvolved in the t
f590: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
f5a0: 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  same call.    **
f5b0: 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72   sets the master
f5c0: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
f5d0: 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64   in each individ
f5e0: 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ual journal. If.
f5f0: 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20      ** an error 
f600: 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20  occurs here, do 
f610: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
f620: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
f630: 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
f640: 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f  * If the error o
f650: 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
f660: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20   first call to. 
f670: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72     ** sqlite3Btr
f680: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
f690: 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  (), then there i
f6a0: 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20  s a chance that 
f6b0: 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  the.    ** maste
f6c0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  r journal file w
f6d0: 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e  ill be orphaned.
f6e0: 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64   But we cannot d
f6f0: 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a  elete it,.    **
f700: 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73   in case the mas
f710: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
f720: 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65   name was writte
f730: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
f740: 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62  al.    ** file b
f750: 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72  efore the failur
f760: 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20  e occurred..    
f770: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
f780: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
f790: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
f7a0: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
f7b0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
f7c0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
f7d0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
f7e0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
f7f0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
f800: 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
f810: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f820: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
f830: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
f840: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
f850: 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20  ITE_BUSY );.    
f860: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f870: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
f880: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
f890: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
f8a0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
f8b0: 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65     /* Delete the
f8c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f8d0: 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69  file. This commi
f8e0: 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ts the transacti
f8f0: 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a  on. After.    **
f900: 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20   doing this the 
f910: 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e  directory is syn
f920: 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65  ced again before
f930: 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a   any individual.
f940: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
f950: 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c  on files are del
f960: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
f970: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
f980: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
f990: 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ter, 1);.    sql
f9a0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
f9b0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61  Master);.    zMa
f9c0: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66  ster = 0;.    if
f9d0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
f9e0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
f9f0: 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73      /* All files
fa00: 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73   and directories
fa10: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
fa20: 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68  en synced, so th
fa30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
fa40: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
fa50: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
fa60: 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c  aseTwo() are onl
fa70: 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20  y closing files 
fa80: 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74  and.    ** delet
fa90: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
faa0: 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73  g journals. If s
fab0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
fac0: 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a  ong while.    **
fad0: 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
fae0: 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c  ng we don't real
faf0: 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74  ly care. The int
fb00: 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20  egrity of the.  
fb10: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
fb20: 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72   is already guar
fb30: 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65  anteed, but some
fb40: 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f   stray 'cold' jo
fb50: 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61  urnals.    ** ma
fb60: 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e  y be lying aroun
fb70: 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20  d. Returning an 
fb80: 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74  error code won't
fb90: 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20   help matters.. 
fba0: 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c     */.    disabl
fbb0: 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
fbc0: 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c  rrors();.    sql
fbd0: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
fbe0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72  alloc();.    for
fbf0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
fc00: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
fc10: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
fc20: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
fc30: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
fc40: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
fc50: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
fc60: 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 1);.      }.
fc70: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
fc80: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
fc90: 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73  ();.    enable_s
fca0: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
fcb0: 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  rs();..    sqlit
fcc0: 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
fcd0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
fce0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fcf0: 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
fd00: 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68  e checks that th
fd10: 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41  e sqlite3.nVdbeA
fd20: 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69  ctive count vari
fd30: 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20  able.** matches 
fd40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64  the number of vd
fd50: 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74  be's in the list
fd60: 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74   sqlite3.pVdbe t
fd70: 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  hat are.** curre
fd80: 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20  ntly active. An 
fd90: 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
fda0: 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74  if the two count
fdb0: 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  s do not match..
fdc0: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
fdd0: 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63  ternal self-chec
fde0: 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e  k only - it is n
fdf0: 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20  ot an essential 
fe00: 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74  processing.** st
fe10: 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ep..**.** This i
fe20: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45  s a no-op if NDE
fe30: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
fe40: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
fe50: 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  G.static void ch
fe60: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
fe70: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
fe80: 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20   Vdbe *p;.  int 
fe90: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  cnt = 0;.  int n
fea0: 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74  Write = 0;.  int
feb0: 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20   nRead = 0;.  p 
fec0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77  = db->pVdbe;.  w
fed0: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
fee0: 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
fef0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70  E_MAGIC_RUN && p
ff00: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ->pc>=0 ){.     
ff10: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
ff20: 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ( p->readOnly==0
ff30: 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20   ) nWrite++;.   
ff40: 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61     if( p->bIsRea
ff50: 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20  der ) nRead++;. 
ff60: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
ff70: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73  pNext;.  }.  ass
ff80: 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56  ert( cnt==db->nV
ff90: 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61  dbeActive );.  a
ffa0: 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64  ssert( nWrite==d
ffb0: 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b  b->nVdbeWrite );
ffc0: 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 61 64  .  assert( nRead
ffd0: 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20  ==db->nVdbeRead 
ffe0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
fff0: 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  ne checkActiveVd
10000 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a  beCnt(x).#endif.
10010 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64  ./*.** If the Vd
10020 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
10030 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
10040 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65  opened a stateme
10050 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  nt-transaction,.
10060 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e  ** close it now.
10070 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75   Argument eOp mu
10080 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56  st be either SAV
10090 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
100a0 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  or.** SAVEPOINT_
100b0 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69  RELEASE. If it i
100c0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
100d0 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73  BACK, then the s
100e0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
100f0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
10100 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69  d back. If eOp i
10110 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  s SAVEPOINT_RELE
10120 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a  ASE, then the .*
10130 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  * statement tran
10140 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
10150 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tted..**.** If a
10160 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
10170 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  s, an SQLITE_IOE
10180 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
10190 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  e is returned. .
101a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c  ** Otherwise SQL
101b0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
101c0 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
101d0 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70  tatement(Vdbe *p
101e0 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71  , int eOp){.  sq
101f0 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20  lite3 *const db 
10200 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
10210 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
10220 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74    /* If p->iStat
10230 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72  ement is greater
10240 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
10250 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65   this Vdbe opene
10260 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d  d a .  ** statem
10270 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
10280 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63  that should be c
10290 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20  losed here. The 
102a0 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20  only exception. 
102b0 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49   ** is that an I
102c0 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65  O error may have
102d0 20 6f 63 63 75 72 72 65 64 2c 20 63 61 75 73 69   occurred, causi
102e0 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20  ng an emergency 
102f0 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49  rollback..  ** I
10300 6e 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d  n this case (db-
10310 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c  >nStatement==0),
10320 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
10330 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a  thing to do..  *
10340 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61  /.  if( db->nSta
10350 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74  tement && p->iSt
10360 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69  atement ){.    i
10370 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nt i;.    const 
10380 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d  int iSavepoint =
10390 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31   p->iStatement-1
103a0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ;..    assert( e
103b0 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
103c0 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53  LLBACK || eOp==S
103d0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
103e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
103f0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20  b->nStatement>0 
10400 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
10410 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64  ->iStatement==(d
10420 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62  b->nStatement+db
10430 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b  ->nSavepoint) );
10440 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
10450 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
10460 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
10470 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
10480 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
10490 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
104a0 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
104b0 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d          if( eOp=
104c0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
104d0 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ACK ){.         
104e0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
104f0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
10500 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
10510 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
10520 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
10530 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51       if( rc2==SQ
10540 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10550 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
10560 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
10570 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
10580 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f  RELEASE, iSavepo
10590 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  int);.        }.
105a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
105b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
105c0 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
105d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
105e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d   }.    }.    db-
105f0 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20  >nStatement--;. 
10600 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74     p->iStatement
10610 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72   = 0;..    if( r
10620 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10630 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
10640 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
10650 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
10660 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
10670 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
10680 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
10690 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
106a0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
106b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
106c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
106d0 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74  te3VtabSavepoint
106e0 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  (db, SAVEPOINT_R
106f0 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
10700 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
10710 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
10720 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
10730 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  saction is being
10740 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c   rolled back, al
10750 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a  so restore the .
10760 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
10770 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64  handles deferred
10780 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e   constraint coun
10790 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ter to the value
107a0 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20   it had when .  
107b0 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
107c0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
107d0 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20  as opened.  */. 
107e0 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
107f0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
10800 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66  {.      db->nDef
10810 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e  erredCons = p->n
10820 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20  StmtDefCons;.   
10830 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
10840 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74  ImmCons = p->nSt
10850 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20  mtDefImmCons;.  
10860 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
10870 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
10880 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
10890 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61  alled when a tra
108a0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20  nsaction opened 
108b0 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  by the database 
108c0 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63  .** handle assoc
108d0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
108e0 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
108f0 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74  rgument is about
10900 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69   to be .** commi
10910 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61  tted. If there a
10920 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64  re outstanding d
10930 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20  eferred foreign 
10940 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  key constraint.*
10950 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65  * violations, re
10960 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
10970 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  R. Otherwise, SQ
10980 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
10990 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
109a0 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61  tanding FK viola
109b0 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66  tions and this f
109c0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
109d0 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
109e0 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  , set the result
109f0 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51   of the VM to SQ
10a00 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
10a10 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e  FOREIGNKEY.** an
10a20 64 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72  d write an error
10a30 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20   message to it. 
10a40 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49  Then return SQLI
10a50 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66  TE_ERROR..*/.#if
10a60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10a70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74  _FOREIGN_KEY.int
10a80 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
10a90 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  kFk(Vdbe *p, int
10aa0 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71   deferred){.  sq
10ab0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
10ac0 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72  b;.  if( (deferr
10ad0 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65  ed && (db->nDefe
10ae0 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65  rredCons+db->nDe
10af0 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30  ferredImmCons)>0
10b00 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72  ) .   || (!defer
10b10 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e  red && p->nFkCon
10b20 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b  straint>0) .  ){
10b30 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
10b40 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
10b50 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70  OREIGNKEY;.    p
10b60 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
10b70 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71  OE_Abort;.    sq
10b80 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
10b90 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
10ba0 22 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  "FOREIGN KEY con
10bb0 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29  straint failed")
10bc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
10bd0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
10be0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10bf0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
10c00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10c10 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68  is called the wh
10c20 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20  en a VDBE tries 
10c30 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65  to halt.  If the
10c40 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64   VDBE.** has mad
10c50 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73  e changes and is
10c60 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d   in autocommit m
10c70 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74  ode, then commit
10c80 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65   those.** change
10c90 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63  s.  If a rollbac
10ca0 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65  k is needed, the
10cb0 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  n do the rollbac
10cc0 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
10cd0 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c  utine is the onl
10ce0 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68  y way to move th
10cf0 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20  e state of a VM 
10d00 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  from.** SQLITE_M
10d10 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49  AGIC_RUN to SQLI
10d20 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20  TE_MAGIC_HALT.  
10d30 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74  It is harmless t
10d40 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f  o.** call this o
10d50 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69  n a VM that is i
10d60 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47  n the SQLITE_MAG
10d70 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a  IC_HALT state..*
10d80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
10d90 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74  rror code.  If t
10da0 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20  he commit could 
10db0 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  not complete bec
10dc0 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20  ause of.** lock 
10dd0 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75  contention, retu
10de0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
10df0 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   If SQLITE_BUSY 
10e00 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a  is returned, it.
10e10 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f  ** means the clo
10e20 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65  se did not happe
10e30 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  n and needs to b
10e40 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69  e repeated..*/.i
10e50 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  nt sqlite3VdbeHa
10e60 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  lt(Vdbe *p){.  i
10e70 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10e90 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * Used to store 
10ea0 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e  transient return
10eb0 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69   codes */.  sqli
10ec0 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
10ed0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
10ee0 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  tion contains th
10ef0 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74  e logic that det
10f00 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61  ermines if a sta
10f10 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74  tement or.  ** t
10f20 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
10f30 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
10f40 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
10f50 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20   result of the. 
10f60 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66   ** execution of
10f70 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
10f80 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  chine. .  **.  *
10f90 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
10fa0 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73  following errors
10fb0 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a   occur:.  **.  *
10fc0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  *     SQLITE_NOM
10fd0 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  EM.  **     SQLI
10fe0 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20  TE_IOERR.  **   
10ff0 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20    SQLITE_FULL.  
11000 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e  **     SQLITE_IN
11010 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a  TERRUPT.  **.  *
11020 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72  * Then the inter
11030 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20  nal cache might 
11040 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69  have been left i
11050 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
11060 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57  t.  ** state.  W
11070 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e need to rollba
11080 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
11090 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
110a0 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f   there is.  ** o
110b0 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c  ne, or the compl
110c0 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ete transaction 
110d0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
110e0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
110f0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66  tion..  */..  if
11100 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
11110 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
11120 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11130 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  M;.  }.  if( p->
11140 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73  aOnceFlag ) mems
11150 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c  et(p->aOnceFlag,
11160 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67   0, p->nOnceFlag
11170 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72  );.  closeAllCur
11180 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70  sors(p);.  if( p
11190 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
111a0 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72  GIC_RUN ){.    r
111b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
111c0 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69  .  }.  checkActi
111d0 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a  veVdbeCnt(db);..
111e0 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f    /* No commit o
111f0 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65  r rollback neede
11200 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d if the program
11210 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f   never started o
11220 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51  r if the.  ** SQ
11230 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73  L statement does
11240 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69   not read or wri
11250 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69  te a database fi
11260 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  le.  */.  if( p-
11270 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73  >pc>=0 && p->bIs
11280 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e  Reader ){.    in
11290 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
112a0 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
112b0 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20  rom p->rc */.   
112c0 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f   int eStatementO
112d0 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  p = 0;.    int i
112e0 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20  sSpecialError;  
112f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
11300 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73   to true if a 's
11310 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f  pecial' error */
11320 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c  ..    /* Lock al
11330 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79  l btrees used by
11340 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
11350 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
11360 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20  eEnter(p);..    
11370 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65  /* Check for one
11380 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
11390 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72  errors */.    mr
113a0 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66  c = p->rc & 0xff
113b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
113c0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52  >rc!=SQLITE_IOER
113d0 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f 2a  R_BLOCKED );  /*
113e0 20 54 68 69 73 20 65 72 72 6f 72 20 6e 6f 20 6c   This error no l
113f0 6f 6e 67 65 72 20 65 78 69 73 74 73 20 2a 2f 0a  onger exists */.
11400 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72      isSpecialErr
11410 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45  or = mrc==SQLITE
11420 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
11430 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20  QLITE_IOERR.    
11440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11450 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
11460 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63  INTERRUPT || mrc
11470 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  ==SQLITE_FULL;. 
11480 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c     if( isSpecial
11490 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f  Error ){.      /
114a0 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77  * If the query w
114b0 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64  as read-only and
114c0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
114d0 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  is SQLITE_INTERR
114e0 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e  UPT, .      ** n
114f0 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  o rollback is ne
11500 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69  cessary. Otherwi
11510 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73  se, at least a s
11520 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
11530 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ** transaction m
11540 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ust be rolled ba
11550 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ck to restore th
11560 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20  e database to a 
11570 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  .      ** consis
11580 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
11590 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76    **.      ** Ev
115a0 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  en if the statem
115b0 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ent is read-only
115c0 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  , it is importan
115d0 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20  t to perform.   
115e0 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e     ** a statemen
115f0 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
11600 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
11610 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
11620 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  r .      ** occu
11630 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  rred while writi
11640 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
11650 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f  l, sub-journal o
11660 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  r database.     
11670 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74   ** file as part
11680 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   of an effort to
11690 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73   free up cache s
116a0 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69  pace (see functi
116b0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  on.      ** page
116c0 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67  rStress() in pag
116d0 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62  er.c), the rollb
116e0 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20  ack is required 
116f0 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20  to restore .    
11700 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74    ** the pager t
11710 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73  o a consistent s
11720 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tate..      */. 
11730 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61       if( !p->rea
11740 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51  dOnly || mrc!=SQ
11750 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29  LITE_INTERRUPT )
11760 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
11770 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
11780 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
11790 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73  FULL) && p->uses
117a0 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  StmtJournal ){. 
117b0 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d           eStatem
117c0 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
117d0 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
117e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
117f0 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66       /* We are f
11800 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61  orced to roll ba
11810 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72  ck the active tr
11820 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72  ansaction. Befor
11830 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20  e doing.        
11840 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61    ** so, abort a
11850 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  ny other stateme
11860 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20  nts this handle 
11870 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63  currently has ac
11880 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  tive..          
11890 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
118a0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
118b0 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  db, SQLITE_ABORT
118c0 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
118d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
118e0 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
118f0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
11900 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
11910 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11920 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
11930 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
11940 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
11950 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
11960 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
11970 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11980 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
11990 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
119a0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
119b0 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
119c0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
119d0 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
119e0 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
119f0 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
11a00 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
11a10 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
11a20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
11a30 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
11a40 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
11a50 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
11a60 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
11a70 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
11a80 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
11a90 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
11aa0 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
11ab0 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
11ac0 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
11ad0 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
11ae0 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
11af0 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28  b->nVdbeWrite==(
11b00 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20  p->readOnly==0) 
11b10 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
11b20 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
11b30 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41  OK || (p->errorA
11b40 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26  ction==OE_Fail &
11b50 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f  & !isSpecialErro
11b60 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  r) ){.        rc
11b70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
11b80 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20  eckFk(p, 1);.   
11b90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11ba0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11bb0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d      if( NEVER(p-
11bc0 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20  >readOnly) ){.  
11bd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11be0 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
11bf0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
11c00 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
11c10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11c20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
11c30 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
11c40 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20  EIGNKEY;.       
11c50 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20   }else{ .       
11c60 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
11c70 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
11c80 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
11c90 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
11ca0 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ful .          *
11cb0 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
11cc0 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
11cd0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
11ce0 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
11cf0 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gn.          ** 
11d00 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
11d10 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74  to hold up the t
11d20 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
11d30 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
11d40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
11d50 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
11d60 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
11d70 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
11d80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11d90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11da0 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64  _BUSY && p->read
11db0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
11dc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
11dd0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
11de0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
11df0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
11e00 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
11e10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11e20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
11e30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
11e40 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
11e50 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
11e60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11e70 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
11e80 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
11e90 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
11ea0 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
11eb0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
11ec0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65  gs &= ~SQLITE_De
11ed0 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20  ferFKs;.        
11ee0 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
11ef0 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
11f00 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  b);.        }.  
11f10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11f20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
11f30 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
11f40 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _OK);.      }.  
11f50 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
11f60 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  nt = 0;.    }els
11f70 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74  e if( eStatement
11f80 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  Op==0 ){.      i
11f90 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
11fa0 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41  _OK || p->errorA
11fb0 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29  ction==OE_Fail )
11fc0 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  {.        eState
11fd0 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
11fe0 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20  NT_RELEASE;.    
11ff0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
12000 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41  rrorAction==OE_A
12010 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  bort ){.        
12020 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
12030 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12040 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
12050 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
12060 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
12070 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
12080 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73  BACK);.        s
12090 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
120a0 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
120b0 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
120c0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
120d0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
120e0 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69  f eStatementOp i
120f0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
12100 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
12110 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
12120 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d  o.    ** be comm
12130 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
12140 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74  back. Call sqlit
12150 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
12160 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a  ment() to.    **
12170 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20   do so. If this 
12180 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e  operation return
12190 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  s an error, and 
121a0 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
121b0 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72  ement.    ** err
121c0 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
121d0 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43  E_OK or SQLITE_C
121e0 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20  ONSTRAINT, then 
121f0 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20  promote the.    
12200 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  ** current state
12210 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e  ment error code.
12220 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12230 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a  eStatementOp ){.
12240 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12250 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
12260 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65  ment(p, eStateme
12270 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ntOp);.      if(
12280 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69   rc ){.        i
12290 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
122a0 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78  _OK || (p->rc&0x
122b0 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
122c0 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20  TRAINT ){.      
122d0 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
122e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
122f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
12300 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
12310 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
12320 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
12330 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
12340 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
12350 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
12360 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
12370 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
12380 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
12390 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
123a0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
123b0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
123c0 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52  his was an INSER
123d0 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
123e0 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65  ETE and no state
123f0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
12400 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  .    ** has been
12410 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70   rolled back, up
12420 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
12430 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61  e connection cha
12440 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20  nge-counter. .  
12450 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
12460 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20  changeCntOn ){. 
12470 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d       if( eStatem
12480 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54  entOp!=SAVEPOINT
12490 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
124a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
124b0 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70  SetChanges(db, p
124c0 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  ->nChange);.    
124d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
124e0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
124f0 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20  hanges(db, 0);. 
12500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
12510 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
12520 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
12530 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a  se the locks */.
12540 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
12550 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20  eave(p);.  }..  
12560 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65  /* We have succe
12570 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61  ssfully halted a
12580 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d  nd closed the VM
12590 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66  .  Record this f
125a0 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  act. */.  if( p-
125b0 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62  >pc>=0 ){.    db
125c0 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b  ->nVdbeActive--;
125d0 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61  .    if( !p->rea
125e0 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62  dOnly ) db->nVdb
125f0 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66  eWrite--;.    if
12600 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  ( p->bIsReader )
12610 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d   db->nVdbeRead--
12620 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
12630 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64  ->nVdbeActive>=d
12640 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a  b->nVdbeRead );.
12650 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
12660 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e  nVdbeRead>=db->n
12670 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20  VdbeWrite );.   
12680 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
12690 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20  beWrite>=0 );.  
126a0 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
126b0 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a  DBE_MAGIC_HALT;.
126c0 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
126d0 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20  eCnt(db);.  if( 
126e0 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
126f0 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
12700 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
12710 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
12720 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
12730 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ag is set to tru
12740 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b  e, then any lock
12750 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64  s that were held
12760 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74  .  ** by connect
12770 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20  ion db have now 
12780 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43  been released. C
12790 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  all sqlite3Conne
127a0 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20  ctionUnlocked() 
127b0 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20  .  ** to invoke 
127c0 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c  any required unl
127d0 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62  ock-notify callb
127e0 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  acks..  */.  if(
127f0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
12800 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
12810 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
12820 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  (db);.  }..  ass
12830 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63  ert( db->nVdbeAc
12840 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75  tive>0 || db->au
12850 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64  toCommit==0 || d
12860 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
12870 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d   );.  return (p-
12880 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
12890 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a   ? SQLITE_BUSY :
128a0 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a   SQLITE_OK);.}..
128b0 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45  ./*.** Each VDBE
128c0 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c   holds the resul
128d0 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
128e0 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65  cent sqlite3_ste
128f0 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70  p() call.** in p
12900 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74  ->rc.  This rout
12910 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65  ine sets that re
12920 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c  sult back to SQL
12930 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20  ITE_OK..*/.void 
12940 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
12950 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20  StepResult(Vdbe 
12960 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  *p){.  p->rc = S
12970 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12980 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f  ** Copy the erro
12990 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72  r code and error
129a0 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69   message belongi
129b0 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70  ng to the VDBE p
129c0 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
129d0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
129e0 6f 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68  o its database h
129f0 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74  andle (so that t
12a00 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20  hey will be .** 
12a10 72 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c  returned by call
12a20 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72  s to sqlite3_err
12a30 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74  code() and sqlit
12a40 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a  e3_errmsg())..**
12a50 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12a60 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72  n does not clear
12a70 20 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20   the VDBE error 
12a80 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c  code or message,
12a90 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20   just.** copies 
12aa0 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61  them to the data
12ab0 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
12ac0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54  int sqlite3VdbeT
12ad0 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62  ransferError(Vdb
12ae0 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
12af0 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
12b00 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  int rc = p->rc;.
12b10 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67    if( p->zErrMsg
12b20 20 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f   ){.    u8 mallo
12b30 63 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61  cFailed = db->ma
12b40 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20  llocFailed;.    
12b50 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
12b60 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
12b70 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20  if( db->pErr==0 
12b80 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c  ) db->pErr = sql
12b90 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29  ite3ValueNew(db)
12ba0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
12bb0 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
12bc0 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
12bd0 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
12be0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
12bf0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
12c00 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
12c10 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
12c20 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61  ailed = mallocFa
12c30 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72  iled;.    db->er
12c40 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65  rCode = rc;.  }e
12c50 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
12c60 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
12c70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
12c80 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
12c90 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
12ca0 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51  G./*.** If an SQ
12cb0 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
12cc0 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73  OG hook is regis
12cd0 74 65 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d  tered and the VM
12ce0 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a   has been run, .
12cf0 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f  ** invoke it..*/
12d00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
12d10 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64  eInvokeSqllog(Vd
12d20 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71  be *v){.  if( sq
12d30 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
12d40 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e  g.xSqllog && v->
12d50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
12d60 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70   v->zSql && v->p
12d70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  c>=0 ){.    char
12d80 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71   *zExpanded = sq
12d90 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53  lite3VdbeExpandS
12da0 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a  ql(v, v->zSql);.
12db0 20 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64      assert( v->d
12dc0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
12dd0 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61  );.    if( zExpa
12de0 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71  nded ){.      sq
12df0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
12e00 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20  g.xSqllog(.     
12e10 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
12e20 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
12e30 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70  Arg, v->db, zExp
12e40 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29  anded, 1.      )
12e50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
12e60 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78  bFree(v->db, zEx
12e70 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20  panded);.    }. 
12e80 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
12e90 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71  ine vdbeInvokeSq
12ea0 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a  llog(x).#endif..
12eb0 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
12ec0 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
12ed0 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74  ution but do not
12ee0 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45   delete the VDBE
12ef0 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72   just yet..** Wr
12f00 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
12f10 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45  ssages into *pzE
12f20 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74  rrMsg.  Return t
12f30 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  he result code..
12f40 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  **.** After this
12f50 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c   routine is run,
12f60 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64   the VDBE should
12f70 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20   be ready to be 
12f80 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69  executed.** agai
12f90 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b  n..**.** To look
12fa0 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77   at it another w
12fb0 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ay, this routine
12fc0 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74   resets the stat
12fd0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74  e of the.** virt
12fe0 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d  ual machine from
12ff0 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
13000 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  or VDBE_MAGIC_HA
13010 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44  LT back to.** VD
13020 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a  BE_MAGIC_INIT..*
13030 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
13040 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b  eReset(Vdbe *p){
13050 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
13060 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20    db = p->db;.. 
13070 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69   /* If the VM di
13080 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d  d not run to com
13090 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74  pletion or if it
130a0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a   encountered an.
130b0 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e    ** error, then
130c0 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61   it might not ha
130d0 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70  ve been halted p
130e0 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c  roperly.  So hal
130f0 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20  t.  ** it now.. 
13100 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
13110 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20  eHalt(p);..  /* 
13120 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  If the VDBE has 
13130 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74  be run even part
13140 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e  ially, then tran
13150 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63  sfer the error c
13160 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72  ode.  ** and err
13170 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
13180 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68  the VDBE into th
13190 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
131a0 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a  structure.  But.
131b0 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45    ** if the VDBE
131c0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
131d0 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61  et to run but ha
131e0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65  s not actually e
131f0 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a  xecuted any.  **
13200 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65   instructions ye
13210 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69  t, leave the mai
13220 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  n database error
13230 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63   information unc
13240 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
13250 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
13260 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c     vdbeInvokeSql
13270 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  log(p);.    sqli
13280 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45  te3VdbeTransferE
13290 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c  rror(p);.    sql
132a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
132b0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
132c0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
132d0 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e      if( p->runOn
132e0 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69  lyOnce ) p->expi
132f0 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  red = 1;.  }else
13300 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
13310 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
13320 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
13330 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
13340 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
13350 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
13360 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
13370 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
13380 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
13390 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
133a0 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
133b0 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
133c0 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
133d0 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
133e0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
133f0 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63  3Error(db, p->rc
13400 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22  , p->zErrMsg ? "
13410 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72  %s" : 0, p->zErr
13420 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
13430 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
13440 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
13450 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d  zErrMsg = 0;.  }
13460 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61  ..  /* Reclaim a
13470 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ll memory used b
13480 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a  y the VDBE.  */.
13490 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20    Cleanup(p);.. 
134a0 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69   /* Save profili
134b0 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
134c0 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75  rom this VDBE ru
134d0 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56  n..  */.#ifdef V
134e0 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
134f0 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
13500 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66  fopen("vdbe_prof
13510 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a  ile.out", "a");.
13520 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
13530 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
13540 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
13550 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66  ---- ");.      f
13560 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
13570 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13580 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30  fprintf(out, "%0
13590 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2x", p->aOp[i].o
135a0 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pcode);.      }.
135b0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
135c0 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
135d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
135e0 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
135f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
13600 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20  6d %10lld %8lld 
13610 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
13620 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20  >aOp[i].cnt,.   
13630 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
13640 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20  ].cycles,.      
13650 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
13660 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d  nt>0 ? p->aOp[i]
13670 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69  .cycles/p->aOp[i
13680 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20  ].cnt : 0.      
13690 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c    );.        sql
136a0 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
136b0 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
136c0 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
136d0 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
136e0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
136f0 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69  .  p->iCurrentTi
13700 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67  me = 0;.  p->mag
13710 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
13720 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70  INIT;.  return p
13730 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61  ->rc & db->errMa
13740 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c  sk;.}. ./*.** Cl
13750 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74  ean up and delet
13760 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  e a VDBE after e
13770 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72  xecution.  Retur
13780 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
13790 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73  ch is.** the res
137a0 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65  ult code.  Write
137b0 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
137c0 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a  ge text into *pz
137d0 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
137e0 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69  qlite3VdbeFinali
137f0 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ze(Vdbe *p){.  i
13800 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13810 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  K;.  if( p->magi
13820 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
13830 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  N || p->magic==V
13840 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29  DBE_MAGIC_HALT )
13850 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
13860 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a  e3VdbeReset(p);.
13870 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20      assert( (rc 
13880 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b  & p->db->errMask
13890 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73  )==rc );.  }.  s
138a0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
138b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
138c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61  ;.}../*.** If pa
138d0 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c  rameter iOp is l
138e0 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
138f0 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64  hen invoke the d
13900 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a  estructor for.**
13910 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64   all auxiliary d
13920 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72  ata pointers cur
13930 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79  rently cached by
13940 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
13950 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61  s.** the first a
13960 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  rgument..**.** O
13970 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72 65  r, if iOp is gre
13980 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
13990 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  al to zero, then
139a0 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
139b0 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b  is.** only invok
139c0 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78  ed for those aux
139d0 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e  iliary data poin
139e0 74 65 72 73 20 63 72 65 61 74 65 64 20 62 79 20  ters created by 
139f0 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e  the user .** fun
13a00 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79  ction invoked by
13a10 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e   the OP_Function
13a20 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72   opcode at instr
13a30 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a  uction iOp of .*
13a40 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20  * VM pVdbe, and 
13a50 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a  only then if:.**
13a60 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73  .**    * the ass
13a70 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e  ociated function
13a80 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
13a90 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20  e 32nd or later 
13aa0 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20  (counting.**    
13ab0 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72    from left to r
13ac0 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20  ight), or.**.** 
13ad0 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70     * the corresp
13ae0 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72  onding bit in ar
13af0 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63  gument mask is c
13b00 6c 65 61 72 20 28 77 68 65 72 65 20 74 68 65 20  lear (where the 
13b10 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75  first.**      fu
13b20 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
13b30 20 63 6f 72 72 73 70 6f 6e 64 73 20 74 6f 20 62   corrsponds to b
13b40 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76  it 0 etc.)..*/.v
13b50 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
13b60 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62  eleteAuxData(Vdb
13b70 65 20 2a 70 56 64 62 65 2c 20 69 6e 74 20 69 4f  e *pVdbe, int iO
13b80 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20  p, int mask){.  
13b90 41 75 78 44 61 74 61 20 2a 2a 70 70 20 3d 20 26  AuxData **pp = &
13ba0 70 56 64 62 65 2d 3e 70 41 75 78 44 61 74 61 3b  pVdbe->pAuxData;
13bb0 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b  .  while( *pp ){
13bc0 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a 70 41  .    AuxData *pA
13bd0 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66  ux = *pp;.    if
13be0 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c  ( (iOp<0).     |
13bf0 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f  | (pAux->iOp==iO
13c00 70 20 26 26 20 28 70 41 75 78 2d 3e 69 41 72 67  p && (pAux->iArg
13c10 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20  >31 || !(mask & 
13c20 28 28 75 33 32 29 31 3c 3c 70 41 75 78 2d 3e 69  ((u32)1<<pAux->i
13c30 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20  Arg)))).    ){. 
13c40 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78       if( pAux->x
13c50 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
13c60 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28    pAux->xDelete(
13c70 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pAux->pAux);.   
13c80 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d     }.      *pp =
13c90 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20   pAux->pNext;.  
13ca0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
13cb0 65 28 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75  e(pVdbe->db, pAu
13cc0 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
13cd0 20 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e       pp= &pAux->
13ce0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
13cf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
13d00 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
13d10 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
13d20 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
13d30 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
13d40 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20  ,.** except for 
13d50 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77  object itself, w
13d60 68 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65  hich is preserve
13d70 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  d..**.** The dif
13d80 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
13d90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
13da0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
13db0 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a  ete() is that.**
13dc0 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c   VdbeDelete() al
13dd0 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56  so unlinks the V
13de0 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  dbe from the lis
13df0 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61  t of VMs associa
13e00 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
13e10 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
13e20 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68  ion and frees th
13e30 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e  e object itself.
13e40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13e50 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
13e60 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
13e70 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67  e *p){.  SubProg
13e80 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78  ram *pSub, *pNex
13e90 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  t;.  int i;.  as
13ea0 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c  sert( p->db==0 |
13eb0 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20  | p->db==db );. 
13ec0 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
13ed0 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61  (p->aVar, p->nVa
13ee0 72 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  r);.  releaseMem
13ef0 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
13f00 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
13f10 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66  *COLNAME_N);.  f
13f20 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67  or(pSub=p->pProg
13f30 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ram; pSub; pSub=
13f40 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
13f50 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b  t = pSub->pNext;
13f60 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41  .    vdbeFreeOpA
13f70 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61  rray(db, pSub->a
13f80 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a  Op, pSub->nOp);.
13f90 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
13fa0 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d  e(db, pSub);.  }
13fb0 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61  .  for(i=p->nzVa
13fc0 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20  r-1; i>=0; i--) 
13fd0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
13fe0 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a  , p->azVar[i]);.
13ff0 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
14000 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d  y(db, p->aOp, p-
14010 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  >nOp);.  sqlite3
14020 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
14030 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  olName);.  sqlit
14040 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
14050 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
14060 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46  DbFree(db, p->pF
14070 72 65 65 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  ree);.#if define
14080 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
14090 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20  TREE_EXPLAIN).  
140a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
140b0 2c 20 70 2d 3e 7a 45 78 70 6c 61 69 6e 29 3b 0a  , p->zExplain);.
140c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
140d0 64 62 2c 20 70 2d 3e 70 45 78 70 6c 61 69 6e 29  db, p->pExplain)
140e0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
140f0 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
14100 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64  re VDBE..*/.void
14110 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
14120 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  te(Vdbe *p){.  s
14130 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
14140 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
14150 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
14160 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
14170 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
14180 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
14190 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
141a0 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70  learObject(db, p
141b0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
141c0 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
141d0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
141e0 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
141f0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56    assert( db->pV
14200 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62  dbe==p );.    db
14210 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65  ->pVdbe = p->pNe
14220 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
14230 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
14240 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
14250 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
14260 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
14270 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d  MAGIC_DEAD;.  p-
14280 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >db = 0;.  sqlit
14290 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
142a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
142b0 75 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70  ure the cursor p
142c0 20 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61   is ready to rea
142d0 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72  d or write the r
142e0 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a  ow to which it.*
142f0 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74  * was last posit
14300 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61  ioned.  Return a
14310 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
14320 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20  an OOM fault or 
14330 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65  I/O error.** pre
14340 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f  vents us from po
14350 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75  sitioning the cu
14360 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72  rsor to its corr
14370 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a  ect position..**
14380 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20  .** If a MoveTo 
14390 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e  operation is pen
143a0 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65  ding on the give
143b0 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64  n cursor, then d
143c0 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f  o that.** MoveTo
143d0 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76   now.  If no mov
143e0 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68  e is pending, ch
143f0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
14400 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a  e row has been.*
14410 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  * deleted out fr
14420 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
14430 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61  sor and if it ha
14440 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20  s, mark the row 
14450 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77  as.** a NULL row
14460 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
14470 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
14480 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
14490 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64   correct row and
144a0 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a   that row has.**
144b0 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65   not been delete
144c0 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
144d0 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65   the cursor, the
144e0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
144f0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e  s a no-op..*/.in
14500 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
14510 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75  sorMoveto(VdbeCu
14520 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  rsor *p){.  if( 
14530 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
14540 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  o ){.    int res
14550 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c  , rc;.#ifdef SQL
14560 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74  ITE_TEST.    ext
14570 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
14580 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65  search_count;.#e
14590 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
145a0 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20   p->isTable );. 
145b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
145c0 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
145d0 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30  ed(p->pCursor, 0
145e0 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  , p->movetoTarge
145f0 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20  t, 0, &res);.   
14600 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
14610 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74   rc;.    p->last
14620 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74  Rowid = p->movet
14630 6f 54 61 72 67 65 74 3b 0a 20 20 20 20 69 66 28  oTarget;.    if(
14640 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e   res!=0 ) return
14650 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
14660 42 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77  BKPT;.    p->row
14670 69 64 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23  idIsValid = 1;.#
14680 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
14690 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65  T.    sqlite3_se
146a0 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  arch_count++;.#e
146b0 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65  ndif.    p->defe
146c0 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a  rredMoveto = 0;.
146d0 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74      p->cacheStat
146e0 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
146f0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
14700 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
14710 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20  int hasMoved;.  
14720 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
14730 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
14740 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  Moved(p->pCursor
14750 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20  , &hasMoved);.  
14760 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
14770 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61  n rc;.    if( ha
14780 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20  sMoved ){.      
14790 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
147a0 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
147b0 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d      p->nullRow =
147c0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
147d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
147e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
147f0 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
14800 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ns:.**.** sqlite
14810 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
14820 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
14830 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a  SerialTypeLen().
14840 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
14850 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  rialLen().** sql
14860 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
14870 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  t().** sqlite3Vd
14880 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a  beSerialGet().**
14890 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
148a0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
148b0 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
148c0 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
148d0 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
148e0 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
148f0 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
14900 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
14910 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
14920 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
14930 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
14940 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
14950 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
14960 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
14970 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
14980 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
14990 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
149a0 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
149b0 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
149c0 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
149d0 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
149e0 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
149f0 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
14a00 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
14a10 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
14a20 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
14a30 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
14a40 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
14a50 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
14a60 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
14a70 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
14a80 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
14a90 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
14aa0 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
14ab0 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61  d data blob sepa
14ac0 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
14ad0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
14ae0 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
14af0 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
14b00 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
14b10 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
14b20 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
14b30 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
14b40 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
14b50 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
14b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
14b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
14b80 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
14ba0 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
14bb0 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
14bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
14bd0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
14be0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
14bf0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
14c00 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
14c10 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
14c20 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
14c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c40 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
14c50 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
14c60 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
14c70 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
14c80 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
14c90 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
14ca0 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
14cb0 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
14cc0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
14cd0 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cf0 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
14d00 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
14d10 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
14d20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
14d30 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
14d40 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
14d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d60 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
14d70 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
14d80 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
14d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
14da0 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
14db0 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
14dc0 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14de0 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
14df0 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
14e00 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
14e10 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
14e20 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
14e30 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
14e40 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
14e50 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
14e60 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
14e70 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
14e80 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
14e90 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
14ea0 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
14eb0 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
14ec0 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
14ed0 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
14ee0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
14ef0 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
14f00 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
14f10 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
14f20 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
14f30 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
14f40 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
14f50 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20  _format){.  int 
14f60 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c  flags = pMem->fl
14f70 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20  ags;.  int n;.. 
14f80 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
14f90 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
14fa0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 0;.  }.  if( f
14fb0 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a  lags&MEM_Int ){.
14fc0 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
14fd0 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65  t whether to use
14fe0 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38   1, 2, 4, 6 or 8
14ff0 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64   bytes. */.#   d
15000 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20  efine MAX_6BYTE 
15010 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30  ((((i64)0x000080
15020 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20  00)<<32)-1).    
15030 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e  i64 i = pMem->u.
15040 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20  i;.    u64 u;.  
15050 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
15060 20 20 20 69 66 28 20 69 3c 28 2d 4d 41 58 5f 36     if( i<(-MAX_6
15070 42 59 54 45 29 20 29 20 72 65 74 75 72 6e 20 36  BYTE) ) return 6
15080 3b 0a 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69  ;.      /* Previ
15090 6f 75 73 20 74 65 73 74 20 70 72 65 76 65 6e 74  ous test prevent
150a0 73 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32 33 33  s:  u = -(-92233
150b0 37 32 30 33 36 38 35 34 37 37 35 38 30 38 29 20  72036854775808) 
150c0 2a 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d 69 3b  */.      u = -i;
150d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
150e0 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20    u = i;.    }. 
150f0 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b     if( u<=127 ){
15100 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28  .      return ((
15110 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f  i&1)==i && file_
15120 66 6f 72 6d 61 74 3e 3d 34 29 20 3f 20 38 2b 28  format>=4) ? 8+(
15130 75 33 32 29 75 20 3a 20 31 3b 0a 20 20 20 20 7d  u32)u : 1;.    }
15140 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36  .    if( u<=3276
15150 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  7 ) return 2;.  
15160 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37    if( u<=8388607
15170 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20   ) return 3;.   
15180 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36   if( u<=21474836
15190 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20  47 ) return 4;. 
151a0 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42     if( u<=MAX_6B
151b0 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a  YTE ) return 5;.
151c0 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
151d0 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
151e0 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65  M_Real ){.    re
151f0 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73  turn 7;.  }.  as
15200 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e  sert( pMem->db->
15210 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
15220 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d  flags&(MEM_Str|M
15230 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20  EM_Blob) );.  n 
15240 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  = pMem->n;.  if(
15250 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
15260 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
15270 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  em->u.nZero;.  }
15280 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20  .  assert( n>=0 
15290 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  );.  return ((n*
152a0 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
152b0 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
152c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
152d0 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
152e0 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f  he data correspo
152f0 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  nding to the sup
15300 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70  plied serial-typ
15310 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  e..*/.u32 sqlite
15320 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
15330 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  en(u32 serial_ty
15340 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61  pe){.  if( seria
15350 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
15360 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
15370 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d  _type-12)/2;.  }
15380 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
15390 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b   const u8 aSize[
153a0 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33  ] = { 0, 1, 2, 3
153b0 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c  , 4, 6, 8, 8, 0,
153c0 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20   0, 0, 0 };.    
153d0 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72  return aSize[ser
153e0 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d  ial_type];.  }.}
153f0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
15400 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63  e on an architec
15410 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d  ture with mixed-
15420 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20  endian floating 
15430 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20  .** points (ex: 
15440 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20  ARM7) then swap 
15450 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65  the lower 4 byte
15460 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75  s with the .** u
15470 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52  pper 4 bytes.  R
15480 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
15490 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74  ..**.** For most
154a0 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20   architectures, 
154b0 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
154c0 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20  .**.** (later): 
154d0 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
154e0 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d  to me that the m
154f0 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62  ixed-endian prob
15500 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69  lem.** on ARM7 i
15510 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20  s an issue with 
15520 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68  GCC, not with th
15530 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74  e ARM7 chip.  It
15540 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65   seems.** that e
15550 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66  arly versions of
15560 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20   GCC stored the 
15570 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36  two words of a 6
15580 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69  4-bit.** float i
15590 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65  n the wrong orde
155a0 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72  r.  And that err
155b0 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70  or has been prop
155c0 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73  agated.** ever s
155d0 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65  ince.  The blame
155e0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
155f0 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68  ily with GCC, th
15600 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67  ough..** GCC mig
15610 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70  ht have just cop
15620 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ying the problem
15630 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f   from a prior co
15640 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20  mpiler..** I am 
15650 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e  also told that n
15660 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
15670 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77   GCC that follow
15680 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
15690 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65  ABI get the byte
156a0 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a   order right..**
156b0 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75  .** Developers u
156c0 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61  sing SQLite on a
156d0 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f  n ARM7 should co
156e0 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68  mpile and run th
156f0 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69  eir.** applicati
15700 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  on using -DSQLIT
15710 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61  E_DEBUG=1 at lea
15720 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44  st once.  With D
15730 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  EBUG.** enabled,
15740 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65   some asserts be
15750 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20  low will ensure 
15760 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72  that the byte or
15770 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69  der of.** floati
15780 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
15790 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a  is correct..**.*
157a0 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20  * (2007-08-30)  
157b0 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68  Frank van Vugt h
157c0 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20  as studied this 
157d0 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a  problem closely.
157e0 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20  ** and has send 
157f0 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20  his findings to 
15800 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c  the SQLite devel
15810 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a  opers.  Frank.**
15820 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d   writes that som
15830 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  e Linux kernels 
15840 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70  offer floating p
15850 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a  oint hardware.**
15860 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20   emulation that 
15870 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74  uses only 32-bit
15880 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65   mantissas inste
15890 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a  ad of a full .**
158a0 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75   48-bits as requ
158b0 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45  ired by the IEEE
158c0 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69   standard.  (Thi
158d0 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46  s is the.** CONF
158e0 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f  IG_FPE_FASTFPE o
158f0 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68  ption.)  On such
15900 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69   systems, floati
15910 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65  ng point.** byte
15920 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65   swapping become
15930 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74  s very complicat
15940 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72  ed.  To avoid pr
15950 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e  oblems,.** the n
15960 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77  ecessary byte sw
15970 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65  apping is carrie
15980 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34  d out using a 64
15990 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20  -bit integer.** 
159a0 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34  rather than a 64
159b0 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61  -bit float.  Fra
159c0 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68  nk assures us th
159d0 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  at the code here
159e0 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69  .** works for hi
159f0 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65  m.  We, the deve
15a00 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20  lopers, have no 
15a10 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65  way to independe
15a20 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74  ntly.** verify t
15a30 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73  his, but Frank s
15a40 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61  eems to know wha
15a50 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20  t he is talking 
15a60 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74  about.** so we t
15a70 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66  rust him..*/.#if
15a80 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44  def SQLITE_MIXED
15a90 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
15aa0 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66  OAT.static u64 f
15ab0 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29  loatSwap(u64 in)
15ac0 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  {.  union {.    
15ad0 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69  u64 r;.    u32 i
15ae0 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33  [2];.  } u;.  u3
15af0 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e  2 t;..  u.r = in
15b00 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a  ;.  t = u.i[0];.
15b10 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31    u.i[0] = u.i[1
15b20 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b  ];.  u.i[1] = t;
15b30 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d  .  return u.r;.}
15b40 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
15b50 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
15b60 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70  )  X = floatSwap
15b70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
15b80 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
15b90 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69  anFloat(X).#endi
15ba0 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  f../*.** Write t
15bb0 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61  he serialized da
15bc0 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20  ta blob for the 
15bd0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
15be0 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75  pMem into .** bu
15bf0 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  f. It is assumed
15c00 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
15c10 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73   has allocated s
15c20 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e  ufficient space.
15c30 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
15c40 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
15c50 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42  ritten..**.** nB
15c60 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  uf is the amount
15c70 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69   of space left i
15c80 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61  n buf[].  The ca
15c90 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
15ca0 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63  ble.** for alloc
15cb0 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61  ating enough spa
15cc0 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68  ce to buf[] to h
15cd0 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66  old the entire f
15ce0 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a  ield, exclusive.
15cf0 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e  ** of the pMem->
15d00 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f  u.nZero bytes fo
15d10 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c  r a MEM_Zero val
15d20 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ue..**.** Return
15d30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
15d40 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72  ytes actually wr
15d50 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d  itten into buf[]
15d60 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  .  The number.**
15d70 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
15d80 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
15d90 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e  l is included in
15da0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
15db0 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f  e only.** if tho
15dc0 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65  se bytes were ze
15dd0 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a  roed in buf[]..*
15de0 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  / .u32 sqlite3Vd
15df0 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a  beSerialPut(u8 *
15e00 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20  buf, Mem *pMem, 
15e10 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
15e20 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20  {.  u32 len;..  
15e30 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52  /* Integer and R
15e40 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  eal */.  if( ser
15e50 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73  ial_type<=7 && s
15e60 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a  erial_type>0 ){.
15e70 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75      u64 v;.    u
15e80 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65  32 i;.    if( se
15e90 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
15ea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
15eb0 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28  zeof(v)==sizeof(
15ec0 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20  pMem->r) );.    
15ed0 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d    memcpy(&v, &pM
15ee0 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29  em->r, sizeof(v)
15ef0 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  );.      swapMix
15f00 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29  edEndianFloat(v)
15f10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15f20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69     v = pMem->u.i
15f30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
15f40 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62  = i = sqlite3Vdb
15f50 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
15f60 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
15f70 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20   while( i-- ){. 
15f80 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 75       buf[i] = (u
15f90 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20  8)(v&0xFF);.    
15fa0 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d    v >>= 8;.    }
15fb0 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
15fc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e  .  }..  /* Strin
15fd0 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69  g or blob */.  i
15fe0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
15ff0 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  12 ){.    assert
16000 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d  ( pMem->n + ((pM
16010 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
16020 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a  Zero)?pMem->u.nZ
16030 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20  ero:0).         
16040 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69      == (int)sqli
16050 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
16060 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
16070 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  ) );.    len = p
16080 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63  Mem->n;.    memc
16090 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
160a0 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72   len);.    retur
160b0 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
160c0 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e   NULL or constan
160d0 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72  ts 0 or 1 */.  r
160e0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
160f0 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68  * Deserialize th
16100 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e  e data blob poin
16110 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73  ted to by buf as
16120 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72   serial type ser
16130 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20  ial_type.** and 
16140 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
16150 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72   in pMem.  Retur
16160 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
16170 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a  bytes read..*/ .
16180 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
16190 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
161a0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
161b0 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
161c0 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
161d0 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
161e0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
161f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
16200 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
16210 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
16220 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
16230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
16240 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
16250 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
16260 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73  /.){.  switch( s
16270 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
16280 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20    case 10:   /* 
16290 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
162a0 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
162b0 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73  ase 11:   /* Res
162c0 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
162d0 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
162e0 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a   0: {  /* NULL *
162f0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  /.      pMem->fl
16300 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
16310 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16320 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b   }.    case 1: {
16330 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65   /* 1-byte signe
16340 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
16350 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
16360 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
16370 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0];.      pMem->
16380 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
16390 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
163a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
163b0 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
163c0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
163d0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
163e0 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
163f0 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20  r)buf[0])<<8) | 
16400 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[1];.      pM
16410 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
16420 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
16430 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 2;.    }.    c
16440 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
16450 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
16460 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
16470 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  >u.i = (((signed
16480 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31   char)buf[0])<<1
16490 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29  6) | (buf[1]<<8)
164a0 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20   | buf[2];.     
164b0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
164c0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
164d0 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20  turn 3;.    }.  
164e0 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
164f0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
16500 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
16510 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30  em->u.i = (buf[0
16520 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d  ]<<24) | (buf[1]
16530 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c  <<16) | (buf[2]<
16540 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20  <8) | buf[3];.  
16550 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
16560 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
16570 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d   return 4;.    }
16580 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f  .    case 5: { /
16590 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 6-byte signed 
165a0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
165b0 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e   u64 x = (((sign
165c0 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
165d0 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
165e0 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66      u32 y = (buf
165f0 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [2]<<24) | (buf[
16600 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34  3]<<16) | (buf[4
16610 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a  ]<<8) | buf[5];.
16620 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
16630 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65  ) | y;.      pMe
16640 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
16650 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  &x;.      pMem->
16660 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
16670 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b  .      return 6;
16680 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16690 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73  6:   /* 8-byte s
166a0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
166b0 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f  .    case 7: { /
166c0 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20  * IEEE floating 
166d0 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75  point */.      u
166e0 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20  64 x;.      u32 
166f0 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  y;.#if !defined(
16700 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  NDEBUG) && !defi
16710 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
16720 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
16730 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
16740 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e  that integers an
16750 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  d floating point
16760 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20   values use the 
16770 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  same.      ** by
16780 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
16790 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
167a0 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
167b0 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20  _FLOAT is.      
167c0 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
167d0 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
167e0 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
167f0 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
16800 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20      ** endian.. 
16810 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
16820 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
16830 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
16840 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20  0000)<<32;.     
16850 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f   static const do
16860 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20  uble r1 = 1.0;. 
16870 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31       u64 t2 = t1
16880 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
16890 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29  dEndianFloat(t2)
168a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
168b0 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
168c0 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
168d0 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
168e0 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
168f0 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28  dif..      x = (
16900 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[0]<<24) | (b
16910 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[1]<<16) | (bu
16920 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33  f[2]<<8) | buf[3
16930 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75  ];.      y = (bu
16940 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[4]<<24) | (buf
16950 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [5]<<16) | (buf[
16960 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b  6]<<8) | buf[7];
16970 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
16980 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66  2) | y;.      if
16990 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36  ( serial_type==6
169a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
169b0 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
169c0 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  x;.        pMem-
169d0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
169e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
169f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
16a00 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73  izeof(x)==8 && s
16a10 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d  izeof(pMem->r)==
16a20 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61  8 );.        swa
16a30 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
16a40 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  t(x);.        me
16a50 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26  mcpy(&pMem->r, &
16a60 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
16a70 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
16a80 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61  gs = sqlite3IsNa
16a90 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d  N(pMem->r) ? MEM
16aa0 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c  _Null : MEM_Real
16ab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16ac0 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a  return 8;.    }.
16ad0 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
16ae0 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
16af0 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
16b00 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
16b10 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
16b20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20  serial_type-8;. 
16b30 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
16b40 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
16b50 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
16b60 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
16b70 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
16b80 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20  nst u16 aFlag[] 
16b90 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d  = { MEM_Blob|MEM
16ba0 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c  _Ephem, MEM_Str|
16bb0 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20  MEM_Ephem };.   
16bc0 20 20 20 75 33 32 20 6c 65 6e 20 3d 20 28 73 65     u32 len = (se
16bd0 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
16be0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
16bf0 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20   (char *)buf;.  
16c00 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65      pMem->n = le
16c10 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78  n;.      pMem->x
16c20 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Del = 0;.      p
16c30 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c  Mem->flags = aFl
16c40 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31  ag[serial_type&1
16c50 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ];.      return 
16c60 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  len;.    }.  }. 
16c70 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
16c80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16c90 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
16ca0 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20  cate sufficient 
16cb0 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70  space for an Unp
16cc0 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73  ackedRecord.** s
16cd0 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65  tructure large e
16ce0 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64  nough to be used
16cf0 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62   with sqlite3Vdb
16d00 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
16d10 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  if.** the first 
16d20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
16d30 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f  inter to KeyInfo
16d40 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49   structure pKeyI
16d50 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  nfo..**.** The s
16d60 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61  pace is either a
16d70 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73  llocated using s
16d80 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
16d90 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68  w() or from with
16da0 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67  in.** the unalig
16db0 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65  ned buffer passe
16dc0 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64  d via the second
16dd0 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d   and third argum
16de0 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79  ents (presumably
16df0 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29  .** stack space)
16e00 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c  . If the former,
16e10 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73   then *ppFree is
16e20 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65   set to a pointe
16e30 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  r that should.**
16e40 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
16e50 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
16e60 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
16e70 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66  DbFree(). Or, if
16e80 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74   the .** allocat
16e90 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74  ion comes from t
16ea0 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63  he pSpace/szSpac
16eb0 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65  e buffer, *ppFre
16ec0 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
16ed0 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72  .** before retur
16ee0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
16ef0 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
16f00 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
16f10 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65  rned..*/.Unpacke
16f20 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33  dRecord *sqlite3
16f30 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
16f40 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e  dRecord(.  KeyIn
16f50 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
16f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
16f70 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
16f80 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61   record */.  cha
16f90 72 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20  r *pSpace,      
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16fb0 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20  Unaligned space 
16fc0 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69  available */.  i
16fd0 6e 74 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20  nt szSpace,     
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16ff0 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65  * Size of pSpace
17000 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  [] in bytes */. 
17010 20 63 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20   char **ppFree  
17020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17030 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20   /* OUT: Caller 
17040 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73  should free this
17050 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20   pointer */.){. 
17060 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
17070 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
17080 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63   /* Unpacked rec
17090 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ord to return */
170a0 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20  .  int nOff;    
170b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170c0 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
170d0 70 53 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74  pSpace by nOff t
170e0 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20  o align it */.  
170f0 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
17100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17110 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
17120 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  es required for 
17130 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77  *p */..  /* We w
17140 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68 65  ant to shift the
17150 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20   pointer pSpace 
17160 75 70 20 73 75 63 68 20 74 68 61 74 20 69 74 20  up such that it 
17170 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  is 8-byte aligne
17180 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65  d..  ** Thus, we
17190 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61   need to calcula
171a0 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66  te a value, nOff
171b0 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  , between 0 and 
171c0 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a  7, to shift .  *
171d0 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70 53 70  * it by.  If pSp
171e0 61 63 65 20 69 73 20 61 6c 72 65 61 64 79 20 38  ace is already 8
171f0 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e  -byte aligned, n
17200 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65  Off should be ze
17210 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20  ro..  */.  nOff 
17220 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50  = (8 - (SQLITE_P
17230 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65  TR_TO_INT(pSpace
17240 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e  ) & 7)) & 7;.  n
17250 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
17260 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63  zeof(UnpackedRec
17270 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d  ord)) + sizeof(M
17280 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e  em)*(pKeyInfo->n
17290 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20  Field+1);.  if( 
172a0 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f  nByte>szSpace+nO
172b0 66 66 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55  ff ){.    p = (U
172c0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29  npackedRecord *)
172d0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
172e0 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  aw(pKeyInfo->db,
172f0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70   nByte);.    *pp
17300 46 72 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70  Free = (char *)p
17310 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 20 72  ;.    if( !p ) r
17320 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
17330 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63  {.    p = (Unpac
17340 6b 65 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61  kedRecord*)&pSpa
17350 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70  ce[nOff];.    *p
17360 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pFree = 0;.  }..
17370 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d    p->aMem = (Mem
17380 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f  *)&((char*)p)[RO
17390 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
173a0 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20  ckedRecord))];. 
173b0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
173c0 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  o->aSortOrder!=0
173d0 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66   );.  p->pKeyInf
173e0 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
173f0 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  p->nField = pKey
17400 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31  Info->nField + 1
17410 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
17420 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
17430 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64   nKey-byte encod
17440 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20  ing of a record 
17450 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c  in pKey[], popul
17460 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61  ate the .** Unpa
17470 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63  ckedRecord struc
17480 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62  ture indicated b
17490 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  y the fourth arg
174a0 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a  ument with the.*
174b0 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
174c0 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64  e decoded record
174d0 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
174e0 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
174f0 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ck(.  KeyInfo *p
17500 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20  KeyInfo,     /* 
17510 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
17520 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72  t the record for
17530 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  mat */.  int nKe
17540 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
17550 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62  /* Size of the b
17560 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
17570 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
17580 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ey,      /* The 
17590 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
175a0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
175b0 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70  d *p      /* Pop
175c0 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75 63  ulate this struc
175d0 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74 75  ture before retu
175e0 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63  rning. */.){.  c
175f0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
17600 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73  ar *aKey = (cons
17610 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
17620 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b  *)pKey;.  int d;
17630 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20 20   .  u32 idx;    
17640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17650 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
17660 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20   aKey[] to read 
17670 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b  from */.  u16 u;
17680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
176a0 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
176b0 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  er */.  u32 szHd
176c0 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  r;.  Mem *pMem =
176d0 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e   p->aMem;..  p->
176e0 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 61 73 73  flags = 0;.  ass
176f0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
17700 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20  ALIGNMENT(pMem) 
17710 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61  );.  idx = getVa
17720 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48  rint32(aKey, szH
17730 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72  dr);.  d = szHdr
17740 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69  ;.  u = 0;.  whi
17750 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26  le( idx<szHdr &&
17760 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26 20   u<p->nField && 
17770 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75  d<=nKey ){.    u
17780 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
17790 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56  .    idx += getV
177a0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64  arint32(&aKey[id
177b0 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  x], serial_type)
177c0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
177d0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
177e0 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20  .    pMem->db = 
177f0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
17800 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73    /* pMem->flags
17810 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33   = 0; // sqlite3
17820 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
17830 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f  will set this fo
17840 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  r us */.    pMem
17850 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  ->zMalloc = 0;. 
17860 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56     d += sqlite3V
17870 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
17880 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79  ey[d], serial_ty
17890 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70  pe, pMem);.    p
178a0 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a  Mem++;.    u++;.
178b0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c    }.  assert( u<
178c0 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  =pKeyInfo->nFiel
178d0 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46  d + 1 );.  p->nF
178e0 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 2f 2a 0a  ield = u;.}../*.
178f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17900 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77   compares the tw
17910 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20  o table rows or 
17920 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a  index records.**
17930 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e   specified by {n
17940 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64  Key1, pKey1} and
17950 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74   pPKey2.  It ret
17960 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c  urns a negative,
17970 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
17980 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20  tive integer if 
17990 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
179a0 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a  n, equal to or .
179b0 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
179c0 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79  key2.  The {nKey
179d0 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75  1, pKey1} key mu
179e0 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20  st be a blob.** 
179f0 63 72 65 61 74 65 64 20 62 79 20 74 68 20 4f 50  created by th OP
17a00 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
17a10 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20  de of the VDBE. 
17a20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b   The pPKey2.** k
17a30 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72  ey must be a par
17a40 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20  sed key such as 
17a50 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
17a60 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73   sqlite3VdbePars
17a70 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b  eRecord..**.** K
17a80 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20  ey1 and Key2 do 
17a90 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74  not have to cont
17aa0 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ain the same num
17ab0 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a  ber of fields..*
17ac0 2a 20 54 68 65 20 6b 65 79 20 77 69 74 68 20 66  * The key with f
17ad0 65 77 65 72 20 66 69 65 6c 64 73 20 69 73 20 75  ewer fields is u
17ae0 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20  sually compares 
17af0 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a 2a  less than the .*
17b00 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48  * longer key.  H
17b10 6f 77 65 76 65 72 20 69 66 20 74 68 65 20 55 4e  owever if the UN
17b20 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66  PACKED_INCRKEY f
17b30 6c 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20 69  lags in pPKey2 i
17b40 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65  s set.** and the
17b50 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73   common prefixes
17b60 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e   are equal, then
17b70 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
17b80 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69  an key2..** Or i
17b90 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d  f the UNPACKED_M
17ba0 41 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61 67  ATCH_PREFIX flag
17bb0 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20   is set and the 
17bc0 70 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a 20  prefixes are.** 
17bd0 65 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20  equal, then the 
17be0 6b 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64 65  keys are conside
17bf0 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 20  red to be equal 
17c00 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74 73  and.** the parts
17c10 20 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d   beyond the comm
17c20 6f 6e 20 70 72 65 66 69 78 20 61 72 65 20 69 67  on prefix are ig
17c30 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nored..*/.int sq
17c40 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
17c50 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b  ompare(.  int nK
17c60 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
17c70 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
17c80 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
17c90 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
17ca0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
17cb0 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  key */.){.  u32 
17cc0 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  d1;            /
17cd0 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
17ce0 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
17cf0 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
17d00 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
17d10 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
17d20 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
17d30 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a  header element *
17d40 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
17d50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17d60 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61   of bytes in hea
17d70 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  der */.  int i =
17d80 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   0;.  int rc = 0
17d90 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
17da0 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
17db0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
17dc0 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
17dd0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
17de0 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  fo;.  Mem mem1;.
17df0 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  .  pKeyInfo = pP
17e00 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
17e10 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
17e20 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
17e30 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
17e40 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e  ->db;.  /* mem1.
17e50 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57  flags = 0;  // W
17e60 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ill be initializ
17e70 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62  ed by sqlite3Vdb
17e80 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a  eSerialGet() */.
17e90 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
17ea0 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20  .zMalloc = 0; ) 
17eb0 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62  /* Only needed b
17ec0 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  y assert() state
17ed0 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ments */..  /* C
17ee0 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d  ompilers may com
17ef0 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e  plain that mem1.
17f00 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c  u.i is potential
17f10 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ly uninitialized
17f20 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20  ..  ** We could 
17f30 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61  initialize it, a
17f40 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f  s shown here, to
17f50 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63   silence those c
17f60 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20  omplaints..  ** 
17f70 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d  But in fact, mem
17f80 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72  1.u.i will never
17f90 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65   actually be use
17fa0 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c  d uninitialized,
17fb0 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a   and doing .  **
17fc0 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79   the unnecessary
17fd0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
17fe0 68 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65  has a measurable
17ff0 20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72   negative perfor
18000 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63  mance.  ** impac
18010 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f  t, since this ro
18020 75 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20  utine is a very 
18030 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e  high runner.  An
18040 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a  d so, we choose.
18050 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74    ** to ignore t
18060 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  he compiler warn
18070 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74  ings and leave t
18080 68 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69  his variable uni
18090 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
180a0 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20  .  /*  mem1.u.i 
180b0 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65  = 0;  // not nee
180c0 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c  ded, here to sil
180d0 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61  ence compiler wa
180e0 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64  rning */.  .  id
180f0 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x1 = getVarint32
18100 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
18110 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a  .  d1 = szHdr1;.
18120 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
18130 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49  fo->nField+pKeyI
18140 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50  nfo->nXField>=pP
18150 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20  Key2->nField || 
18160 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
18170 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
18180 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
18190 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
181a0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20  yInfo->nField>0 
181b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  );.  assert( idx
181c0 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52  1<=szHdr1 || COR
181d0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b  RUPT_DB );.  do{
181e0 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
181f0 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52  type1;..    /* R
18200 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74  ead the serial t
18210 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78  ypes for the nex
18220 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63  t element in eac
18230 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64  h key. */.    id
18240 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  x1 += getVarint3
18250 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73  2( aKey1+idx1, s
18260 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a  erial_type1 );..
18270 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
18280 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  at there is enou
18290 67 68 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d  gh key space rem
182a0 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a  aining to avoid.
182b0 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20      ** a buffer 
182c0 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65 20 22  overread.  The "
182d0 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  d1+serial_type1+
182e0 32 22 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  2" subexpression
182f0 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77   will.    ** alw
18300 61 79 73 20 62 65 20 67 72 65 61 74 65 72 20 74  ays be greater t
18310 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
18320 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65  the amount of re
18330 71 75 69 72 65 64 20 6b 65 79 20 73 70 61 63 65  quired key space
18340 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61  ..    ** Use tha
18350 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20  t approximation 
18360 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72  to avoid the mor
18370 65 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c  e expensive call
18380 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
18390 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
183a0 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d  Len() in the com
183b0 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  mon case..    */
183c0 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65 72 69  .    if( d1+seri
183d0 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29  al_type1+2>(u32)
183e0 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31  nKey1.     && d1
183f0 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69  +sqlite3VdbeSeri
18400 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
18410 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65  _type1)>(u32)nKe
18420 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  y1 .    ){.     
18430 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
18440 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
18450 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63  e values to be c
18460 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ompared..    */.
18470 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65      d1 += sqlite
18480 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
18490 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
184a0 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b  l_type1, &mem1);
184b0 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
184c0 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a  comparison.    *
184d0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
184e0 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65  e3MemCompare(&me
184f0 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65  m1, &pPKey2->aMe
18500 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  m[i], pKeyInfo->
18510 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69  aColl[i]);.    i
18520 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
18530 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a    assert( mem1.z
18540 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
18550 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
18560 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ow */.      if( 
18570 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
18580 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
18590 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a     rc = -rc;  /*
185a0 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75   Invert the resu
185b0 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74  lt for DESC sort
185c0 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20   order. */.     
185d0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
185e0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b  rc;.    }.    i+
185f0 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  +;.  }while( idx
18600 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  1<szHdr1 && i<pP
18610 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a  Key2->nField );.
18620 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20  .  /* No memory 
18630 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76  allocation is ev
18640 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e  er used on mem1.
18650 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69    Prove this usi
18660 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  ng.  ** the foll
18670 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
18680 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29   If the assert()
18690 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63   fails, it indic
186a0 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f  ates a.  ** memo
186b0 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65  ry leak and a ne
186c0 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ed to call sqlit
186d0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
186e0 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20  (&mem1)..  */.  
186f0 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61  assert( mem1.zMa
18700 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lloc==0 );..  /*
18710 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
18720 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
18730 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
18740 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a  f fields and.  *
18750 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  * all the fields
18760 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
18770 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66  t were equal. If
18780 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e   the UNPACKED_IN
18790 43 52 4b 45 59 0a 20 20 2a 2a 20 66 6c 61 67 20  CRKEY.  ** flag 
187a0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 62 72 65  is set, then bre
187b0 61 6b 20 74 68 65 20 74 69 65 20 62 79 20 74 72  ak the tie by tr
187c0 65 61 74 69 6e 67 20 6b 65 79 32 20 61 73 20 6c  eating key2 as l
187d0 61 72 67 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74  arger..  ** If t
187e0 68 65 20 55 50 41 43 4b 45 44 5f 50 52 45 46 49  he UPACKED_PREFI
187f0 58 5f 4d 41 54 43 48 20 66 6c 61 67 20 69 73 20  X_MATCH flag is 
18800 73 65 74 2c 20 74 68 65 6e 20 6b 65 79 73 20 77  set, then keys w
18810 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  ith common prefi
18820 78 65 73 0a 20 20 2a 2a 20 61 72 65 20 63 6f 6e  xes.  ** are con
18830 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65 71  sidered to be eq
18840 75 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ual.  Otherwise,
18850 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20   the longer key 
18860 69 73 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61 72  is the .  ** lar
18870 67 65 72 2e 20 20 41 73 20 69 74 20 68 61 70 70  ger.  As it happ
18880 65 6e 73 2c 20 74 68 65 20 70 50 4b 65 79 32 20  ens, the pPKey2 
18890 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74  will always be t
188a0 68 65 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 69  he longer.  ** i
188b0 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69 66  f there is a dif
188c0 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  ference..  */.  
188d0 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b  assert( rc==0 );
188e0 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66  .  if( pPKey2->f
188f0 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
18900 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20 20 72  INCRKEY ){.    r
18910 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 20  c = -1;.  }else 
18920 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67  if( pPKey2->flag
18930 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45  s & UNPACKED_PRE
18940 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20  FIX_MATCH ){.   
18950 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d 3d 30 20   /* Leave rc==0 
18960 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  */.  }else if( i
18970 64 78 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20  dx1<szHdr1 ){.  
18980 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20    rc = 1;.  }.  
18990 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a  return rc;.}. ..
189a0 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74  /*.** pCur point
189b0 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e  s at an index en
189c0 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e  try created usin
189d0 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  g the OP_MakeRec
189e0 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52  ord opcode..** R
189f0 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74  ead the rowid (t
18a00 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e  he last field in
18a10 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64   the record) and
18a20 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f   store it in *ro
18a30 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53  wid..** Return S
18a40 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
18a50 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72  ything works, or
18a60 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f   an error code o
18a70 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
18a80 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f  pCur might be po
18a90 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f  inting to text o
18aa0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63  btained from a c
18ab0 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
18ac0 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20  file..** So the 
18ad0 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62  content cannot b
18ae0 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61  e trusted.  Do a
18af0 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b  ppropriate check
18b00 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  s on the content
18b10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18b20 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c  VdbeIdxRowid(sql
18b30 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73  ite3 *db, BtCurs
18b40 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72  or *pCur, i64 *r
18b50 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65  owid){.  i64 nCe
18b60 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  llKey = 0;.  int
18b70 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72   rc;.  u32 szHdr
18b80 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ;        /* Size
18b90 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a   of the header *
18ba0 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69  /.  u32 typeRowi
18bb0 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20  d;    /* Serial 
18bc0 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69  type of the rowi
18bd0 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f  d */.  u32 lenRo
18be0 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65  wid;     /* Size
18bf0 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
18c00 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20  .  Mem m, v;..  
18c10 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
18c20 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  (db);..  /* Get 
18c30 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
18c40 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e  index entry.  On
18c50 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69  ly indices entri
18c60 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20  es of less.  ** 
18c70 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75  than 2GiB are su
18c80 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67  pport - anything
18c90 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64   large must be d
18ca0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
18cb0 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72  on..  ** Any cor
18cc0 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
18cd0 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74  ted in sqlite3Bt
18ce0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
18cf0 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20  ), though, so.  
18d00 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e  ** this code can
18d10 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74   safely assume t
18d20 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20  hat nCellKey is 
18d30 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20  32-bits  .  */. 
18d40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18d50 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
18d60 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56  id(pCur) );.  VV
18d70 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c  A_ONLY(rc =) sql
18d80 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
18d90 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
18da0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
18db0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
18dc0 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
18dd0 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
18de0 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
18df0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e   */.  assert( (n
18e00 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45  CellKey & SQLITE
18e10 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29  _MAX_U32)==(u64)
18e20 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f  nCellKey );..  /
18e30 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f  * Read in the co
18e40 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
18e50 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
18e60 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d  y */.  memset(&m
18e70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b  , 0, sizeof(m));
18e80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
18e90 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
18ea0 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43  pCur, 0, (u32)nC
18eb0 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
18ec0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
18ed0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
18ee0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65    /* The index e
18ef0 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20  ntry must begin 
18f00 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69  with a header si
18f10 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  ze */.  (void)ge
18f20 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
18f30 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65  .z, szHdr);.  te
18f40 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33  stcase( szHdr==3
18f50 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
18f60 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20  szHdr==m.n );.  
18f70 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48  if( unlikely(szH
18f80 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48  dr<3 || (int)szH
18f90 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67  dr>m.n) ){.    g
18fa0 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
18fb0 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
18fc0 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65   /* The last fie
18fd0 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ld of the index 
18fe0 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74  should be an int
18ff0 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44  eger - the ROWID
19000 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68  ..  ** Verify th
19010 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  at the last entr
19020 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69  y really is an i
19030 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f  nteger. */.  (vo
19040 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
19050 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31  u8*)&m.z[szHdr-1
19060 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  ], typeRowid);. 
19070 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
19080 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73  owid==1 );.  tes
19090 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
190a0 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==2 );.  testcas
190b0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20  e( typeRowid==3 
190c0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
190d0 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20  ypeRowid==4 );. 
190e0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
190f0 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73  owid==5 );.  tes
19100 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
19110 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==6 );.  testcas
19120 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20  e( typeRowid==8 
19130 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
19140 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20  ypeRowid==9 );. 
19150 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79   if( unlikely(ty
19160 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70  peRowid<1 || typ
19170 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65  eRowid>9 || type
19180 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20  Rowid==7) ){.   
19190 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
191a0 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
191b0 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c    lenRowid = sql
191c0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
191d0 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29  peLen(typeRowid)
191e0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75  ;.  testcase( (u
191f0 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65  32)m.n==szHdr+le
19200 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20  nRowid );.  if( 
19210 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e  unlikely((u32)m.
19220 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  n<szHdr+lenRowid
19230 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
19240 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
19250 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65  on;.  }..  /* Fe
19260 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20  tch the integer 
19270 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
19280 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  he index record 
19290 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
192a0 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
192b0 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
192c0 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
192d0 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
192e0 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
192f0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
19300 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
19310 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
19320 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73   here if databas
19330 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
19340 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d  detected after m
19350 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61   has been.  ** a
19360 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20  llocated.  Free 
19370 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64  the m object and
19380 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
19390 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72  ORRUPT. */.idx_r
193a0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a  owid_corruption:
193b0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a  .  testcase( m.z
193c0 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73  Malloc!=0 );.  s
193d0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
193e0 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
193f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
19400 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  T_BKPT;.}../*.**
19410 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
19420 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
19430 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
19440 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  pC is pointing t
19450 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65  o against.** the
19460 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70   key string in p
19470 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65  Unpacked.  Write
19480 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75   into *pRes a nu
19490 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  mber.** that is 
194a0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
194b0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
194c0 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  C is less than, 
194d0 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20  equal to,.** or 
194e0 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e  greater than pUn
194f0 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20  packed.  Return 
19500 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
19510 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70  cess..**.** pUnp
19520 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20  acked is either 
19530 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20  created without 
19540 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72  a rowid or is tr
19550 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  uncated so that 
19560 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20  it.** omits the 
19570 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
19580 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20  .  The rowid at 
19590 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
195a0 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73  ndex entry.** is
195b0 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c   ignored as well
195c0 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72  .  Hence, this r
195d0 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70  outine only comp
195e0 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65  ares the prefixe
195f0 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79  s .** of the key
19600 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66  s prior to the f
19610 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20  inal rowid, not 
19620 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a  the entire key..
19630 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
19640 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28  beIdxKeyCompare(
19650 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
19660 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  C,             /
19670 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
19680 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
19690 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
196a0 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20  ord *pUnpacked, 
196b0 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72   /* Unpacked ver
196c0 73 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63  sion of key to c
196d0 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
196e0 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20  /.  int *res    
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19700 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
19710 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
19720 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
19730 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
19740 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
19750 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70  or *pCur = pC->p
19760 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b  Cursor;.  Mem m;
19770 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
19780 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
19790 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
197a0 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20   VVA_ONLY(rc =) 
197b0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
197c0 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
197d0 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
197e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
197f0 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
19800 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
19810 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
19820 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c  il */.  /* nCell
19830 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  Key will always 
19840 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
19850 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61   0xffffffff beca
19860 75 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a 20  use of the say. 
19870 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61   ** that btreePa
19880 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
19890 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
198a0 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d  t32() are implem
198b0 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e  ented */.  if( n
198c0 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43  CellKey<=0 || nC
198d0 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ellKey>0x7ffffff
198e0 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  f ){.    *res = 
198f0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
19900 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
19910 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  T;.  }.  memset(
19920 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29  &m, 0, sizeof(m)
19930 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
19940 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
19950 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30  e(pC->pCursor, 0
19960 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
19970 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
19980 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
19990 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
199a0 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61  ( pUnpacked->fla
199b0 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs & UNPACKED_PR
199c0 45 46 49 58 5f 4d 41 54 43 48 20 29 3b 0a 20 20  EFIX_MATCH );.  
199d0 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64  *res = sqlite3Vd
199e0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
199f0 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63  m.n, m.z, pUnpac
19a00 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ked);.  sqlite3V
19a10 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
19a20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
19a30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19a40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
19a50 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62  s the value to b
19a60 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75  e returned by su
19a70 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
19a80 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61  o.** sqlite3_cha
19a90 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61  nges() on the da
19aa0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64  tabase handle 'd
19ab0 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  b'. .*/.void sql
19ac0 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
19ad0 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
19ae0 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20  int nChange){.  
19af0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
19b00 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
19b10 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e  utex) );.  db->n
19b20 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65  Change = nChange
19b30 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  ;.  db->nTotalCh
19b40 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  ange += nChange;
19b50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20  .}../*.** Set a 
19b60 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65  flag in the vdbe
19b70 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
19b80 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68  hange counter wh
19b90 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73  en it is finalis
19ba0 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a  ed.** or reset..
19bb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
19bc0 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28  dbeCountChanges(
19bd0 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63  Vdbe *v){.  v->c
19be0 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a  hangeCntOn = 1;.
19bf0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76  }../*.** Mark ev
19c00 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61  ery prepared sta
19c10 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65  tement associate
19c20 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
19c30 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
19c40 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a  as expired..**.*
19c50 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61  * An expired sta
19c60 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61  tement means tha
19c70 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  t recompilation 
19c80 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
19c90 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64   is.** recommend
19ca0 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78  .  Statements ex
19cb0 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73  pire when things
19cc0 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b   happen that mak
19cd0 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72  e their.** progr
19ce0 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52  ams obsolete.  R
19cf0 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66  emoving user-def
19d00 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f  ined functions o
19d10 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  r collating.** s
19d20 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61  equences, or cha
19d30 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69  nging an authori
19d40 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  zation function 
19d50 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66  are the types of
19d60 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20  .** things that 
19d70 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74  make prepared st
19d80 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74  atements obsolet
19d90 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
19da0 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
19db0 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74  Statements(sqlit
19dc0 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
19dd0 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62  *p;.  for(p = db
19de0 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d  ->pVdbe; p; p=p-
19df0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e  >pNext){.    p->
19e00 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
19e10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
19e20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
19e30 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
19e40 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74  e Vdbe..*/.sqlit
19e50 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44  e3 *sqlite3VdbeD
19e60 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65  b(Vdbe *v){.  re
19e70 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f  turn v->db;.}../
19e80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
19e90 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
19ea0 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
19eb0 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
19ec0 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a  he value bound.*
19ed0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72  * parameter iVar
19ee0 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74   of VM v. Except
19ef0 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  , if the value i
19f00 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72  s an SQL NULL, r
19f10 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74  eturn .** 0 inst
19f20 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69  ead. Unless it i
19f30 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66  s NULL, apply af
19f40 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20  finity aff (one 
19f50 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  of the SQLITE_AF
19f60 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  F_*.** constants
19f70 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62  ) to the value b
19f80 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
19f90 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  it..**.** The re
19fa0 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73  turned value mus
19fb0 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
19fc0 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
19fd0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
19fe0 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61  )..*/.sqlite3_va
19ff0 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65  lue *sqlite3Vdbe
1a000 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64  GetBoundValue(Vd
1a010 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
1a020 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
1a030 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
1a040 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
1a050 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
1a060 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69  r[iVar-1];.    i
1a070 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61  f( 0==(pMem->fla
1a080 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29  gs & MEM_Null) )
1a090 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1a0a0 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71  value *pRet = sq
1a0b0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d  lite3ValueNew(v-
1a0c0 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
1a0d0 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  pRet ){.        
1a0e0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f  sqlite3VdbeMemCo
1a0f0 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20  py((Mem *)pRet, 
1a100 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  pMem);.        s
1a110 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
1a120 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61  Affinity(pRet, a
1a130 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  ff, SQLITE_UTF8)
1a140 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1a150 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70  3VdbeMemStoreTyp
1a160 65 28 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b 0a  e((Mem *)pRet);.
1a170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1a180 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d  turn pRet;.    }
1a190 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1a1a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
1a1b0 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65  ure SQL variable
1a1c0 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69   iVar so that bi
1a1d0 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75  nding a new valu
1a1e0 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a  e to it signals.
1a1f0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65  ** to sqlite3_re
1a200 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20  optimize() that 
1a210 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65  re-preparing the
1a220 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72   statement may r
1a230 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65  esult.** in a be
1a240 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e  tter query plan.
1a250 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1a260 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56  VdbeSetVarmask(V
1a270 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
1a280 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
1a290 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61  r>0 );.  if( iVa
1a2a0 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65  r>32 ){.    v->e
1a2b0 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66  xpmask = 0xfffff
1a2c0 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fff;.  }else{.  
1a2d0 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20    v->expmask |= 
1a2e0 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72  ((u32)1 << (iVar
1a2f0 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  -1));.  }.}..#if
1a300 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a310 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
1a320 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72  .** Transfer err
1a330 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
1a340 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f  from an sqlite3_
1a350 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65  vtab.zErrMsg (te
1a360 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
1a370 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
1a380 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
1a390 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65  loc) into a Vdbe
1a3a0 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
1a3b0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
1a3c0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
1a3d0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1a3e0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
1a3f0 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d  e3VtabImportErrm
1a400 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69  sg(Vdbe *p, sqli
1a410 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29  te3_vtab *pVtab)
1a420 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
1a430 3d 20 70 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74  = p->db;.  sqlit
1a440 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
1a450 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
1a460 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
1a470 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 56 74  DbStrDup(db, pVt
1a480 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
1a490 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
1a4a0 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
1a4b0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
1a4c0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
1a4d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1a4e0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a              UALTABLE */.