/ Hex Artifact Content
Login

Artifact f587cb9d1a20ddbd678723f0e386d4b18d6e22af:


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 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1200: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
1210: 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69  GE.  pOp->iSrcLi
1220: 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ne = 0;.#endif. 
1230: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74   return i;.}.int
1240: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1250: 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p0(Vdbe *p, int 
1260: 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  op){.  return sq
1270: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1280: 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b  p, op, 0, 0, 0);
1290: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
12a0: 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70  beAddOp1(Vdbe *p
12b0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
12c0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
12d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
12e0: 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a   op, p1, 0, 0);.
12f0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1300: 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c  eAddOp2(Vdbe *p,
1310: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
1320: 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75   int p2){.  retu
1330: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1340: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
1350: 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  p2, 0);.}.../*.*
1360: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
1370: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
1380: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
1390: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
13a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13b0: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
13c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
13d0: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
13e0: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
13f0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1400: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
1410: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
1420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1430: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1440: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1450: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1460: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1470: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1480: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1490: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
14a0: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
14b0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
14c0: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
14d0: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
14e0: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
14f0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1500: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1510: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1520: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1530: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1540: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
1550: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1560: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50  ./*.** Add an OP
1570: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63  _ParseSchema opc
1580: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
1590: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74  ne is broken out
15a0: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
15b0: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e  VdbeAddOp4() sin
15c0: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61  ce it needs to a
15d0: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72  lso needs to mar
15e0: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20  k all btrees.** 
15f0: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75  as having been u
1600: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  sed..**.** The z
1610: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73  Where string mus
1620: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
1630: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
1640: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54  3_malloc()..** T
1650: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1660: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
1670: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
1680: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64   memory..*/.void
1690: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
16a0: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62  arseSchemaOp(Vdb
16b0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63  e *p, int iDb, c
16c0: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20  har *zWhere){.  
16d0: 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64  int j;.  int add
16e0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
16f0: 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73  ddOp3(p, OP_Pars
1700: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
1710: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
1720: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1730: 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44  dr, zWhere, P4_D
1740: 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a  YNAMIC);.  for(j
1750: 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62  =0; j<p->db->nDb
1760: 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64  ; j++) sqlite3Vd
1770: 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a  beUsesBtree(p, j
1780: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
1790: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
17a0: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
17b0: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
17c0: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
17d0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
17e0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
17f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1800: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1810: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1830: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1840: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1850: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1860: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
1870: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
1880: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1890: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
18a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
18b0: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
18c0: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
18d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18e0: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
18f0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
1900: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1910: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1920: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1930: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1940: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1950: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
1960: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32  TR(p4), P4_INT32
1970: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
1980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1990: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
19a0: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
19b0: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
19c0: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
19d0: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
19e0: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
19f0: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
1a00: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
1a10: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
1a20: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
1a30: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
1a40: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
1a50: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
1a60: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
1a70: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
1a80: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
1a90: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
1aa0: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
1ab0: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
1ac0: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
1ad0: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
1ae0: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
1af0: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
1b00: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
1b10: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
1b20: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
1b30: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
1b40: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
1b50: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
1b60: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
1b70: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
1b80: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
1b90: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
1ba0: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
1bb0: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
1bc0: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
1bd0: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
1be0: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
1bf0: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
1c00: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
1c10: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29  keLabel(Vdbe *v)
1c20: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76  {.  Parse *p = v
1c30: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
1c40: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b  i = p->nLabel++;
1c50: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
1c60: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1c70: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69  INIT );.  if( (i
1c80: 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (i-1))==0 ){.
1c90: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1ca0: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1cb0: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1cc0: 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20  >aLabel, .      
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28   (i*2+1)*sizeof(
1d00: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
1d10: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61    }.  if( p->aLa
1d20: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
1d30: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
1d40: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b  }.  return -1-i;
1d50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
1d60: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62  e label "x" to b
1d70: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  e the address of
1d80: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
1d90: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69  ction to.** be i
1da0: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61  nserted.  The pa
1db0: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74  rameter "x" must
1dc0: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
1dd0: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
1de0: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
1df0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1e00: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
1e10: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1e20: 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  bel(Vdbe *v, int
1e30: 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20   x){.  Parse *p 
1e40: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
1e50: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
1e60: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
1e70: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1e80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   );.  assert( j<
1e90: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69  p->nLabel );.  i
1ea0: 66 28 20 41 4c 57 41 59 53 28 6a 3e 3d 30 29 20  f( ALWAYS(j>=0) 
1eb0: 26 26 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  && p->aLabel ){.
1ec0: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d      p->aLabel[j]
1ed0: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20   = v->nOp;.  }. 
1ee0: 20 70 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 76   p->iFixedOp = v
1ef0: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a  ->nOp - 1;.}../*
1f00: 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42  .** Mark the VDB
1f10: 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61  E as one that ca
1f20: 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e  n only be run on
1f30: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e time..*/.void 
1f40: 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e  sqlite3VdbeRunOn
1f50: 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b  lyOnce(Vdbe *p){
1f60: 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  .  p->runOnlyOnc
1f70: 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66  e = 1;.}..#ifdef
1f80: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a   SQLITE_DEBUG /*
1f90: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
1fa0: 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a  yAbort() logic *
1fb0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
1fc0: 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20  lowing type and 
1fd0: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65  function are use
1fe0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
1ff0: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
2000: 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61  .** in a Vdbe ma
2010: 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65  in program and e
2020: 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70  ach of the sub-p
2030: 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72  rograms (trigger
2040: 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e  s) it may .** in
2050: 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72  voke directly or
2060: 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20   indirectly. It 
2070: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61  should be used a
2080: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2090: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20     Op *pOp;.**  
20a0: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
20b0: 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65  r;.**.**   memse
20c0: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
20d0: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20  eof(sIter));.** 
20e0: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20    sIter.v = v;  
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69            // v i
2110: 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20  s of type Vdbe* 
2120: 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f  .**   while( (pO
2130: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
2140: 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20  sIter)) ){.**   
2150: 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e    // Do somethin
2160: 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20  g with pOp.**   
2170: 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62  }.**   sqlite3Db
2180: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65  Free(v->db, sIte
2190: 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f  r.apSub);.** .*/
21a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
21b0: 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f  VdbeOpIter VdbeO
21c0: 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64  pIter;.struct Vd
21d0: 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62  beOpIter {.  Vdb
21e0: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
21f0: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
2200: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
2210: 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f  gh the opcodes o
2220: 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  f */.  SubProgra
2230: 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20  m **apSub;      
2240: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
2250: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
2260: 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20  nt nSub;        
2270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2280: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
2290: 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74  n apSub */.  int
22a0: 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20   iAddr;         
22b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
22c0: 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72  ss of next instr
22d0: 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e  uction to return
22e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20   */.  int iSub; 
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f   /* 0 = main pro
2310: 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20  gram, 1 = first 
2320: 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e  sub-program etc.
2330: 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70   */.};.static Op
2340: 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62   *opIterNext(Vdb
2350: 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56  eOpIter *p){.  V
2360: 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20  dbe *v = p->v;. 
2370: 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20   Op *pRet = 0;. 
2380: 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20   Op *aOp;.  int 
2390: 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  nOp;..  if( p->i
23a0: 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a  Sub<=p->nSub ){.
23b0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62  .    if( p->iSub
23c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70  ==0 ){.      aOp
23d0: 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20   = v->aOp;.     
23e0: 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20   nOp = v->nOp;. 
23f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2400: 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  aOp = p->apSub[p
2410: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a  ->iSub-1]->aOp;.
2420: 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61        nOp = p->a
2430: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d  pSub[p->iSub-1]-
2440: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >nOp;.    }.    
2450: 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72  assert( p->iAddr
2460: 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65  <nOp );..    pRe
2470: 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64  t = &aOp[p->iAdd
2480: 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72  r];.    p->iAddr
2490: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ++;.    if( p->i
24a0: 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20  Addr==nOp ){.   
24b0: 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20     p->iSub++;.  
24c0: 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30      p->iAddr = 0
24d0: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  ;.    }.  .    i
24e0: 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d  f( pRet->p4type=
24f0: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
2500: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
2510: 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a  e = (p->nSub+1)*
2520: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
2530: 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  m*);.      int j
2540: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
2550: 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29   j<p->nSub; j++)
2560: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
2570: 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d  >apSub[j]==pRet-
2580: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
2590: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
25a0: 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53      if( j==p->nS
25b0: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ub ){.        p-
25c0: 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33  >apSub = sqlite3
25d0: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
25e0: 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c  v->db, p->apSub,
25f0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
2600: 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29   if( !p->apSub )
2610: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74  {.          pRet
2620: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
2630: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
2640: 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b  ->apSub[p->nSub+
2650: 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50  +] = pRet->p4.pP
2660: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
2670: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2680: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
2690: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  et;.}../*.** Che
26a0: 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ck if the progra
26b0: 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  m stored in the 
26c0: 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  VM associated wi
26d0: 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a  th pParse may.**
26e0: 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20   throw an ABORT 
26f0: 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69  exception (causi
2700: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
2710: 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65  , but not entire
2720: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2730: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
2740: 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69  k). This conditi
2750: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
2760: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f  e main program o
2770: 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f  r any.** sub-pro
2780: 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61  grams contains a
2790: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
27a0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ing:.**.**   *  
27b0: 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d  OP_Halt with P1=
27c0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
27d0: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
27e0: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  t..**   *  OP_Ha
27f0: 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31  ltIfNull with P1
2800: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
2810: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f  NT and P2=OE_Abo
2820: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44  rt..**   *  OP_D
2830: 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f  estroy.**   *  O
2840: 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a  P_VUpdate.**   *
2850: 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20    OP_VRename.** 
2860: 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65    *  OP_FkCounte
2870: 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d  r with P2==0 (im
2880: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
2890: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a  key constraint).
28a0: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b  **.** Then check
28b0: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
28c0: 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72  of Parse.mayAbor
28d0: 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a  t is true if an.
28e0: 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20  ** ABORT may be 
28f0: 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65  thrown, or false
2900: 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75   otherwise. Retu
2910: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  rn true if it do
2920: 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20  es.** match, or 
2930: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
2940: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2950: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
2960: 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74   used as.** part
2970: 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74   of an assert st
2980: 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63  atement in the c
2990: 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72  ompiler. Similar
29a0: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73   to:.**.**   ass
29b0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
29c0: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70  AssertMayAbort(p
29d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
29e0: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20  arse->mayAbort) 
29f0: 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  );.*/.int sqlite
2a00: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
2a10: 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ort(Vdbe *v, int
2a20: 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e   mayAbort){.  in
2a30: 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a  t hasAbort = 0;.
2a40: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62    Op *pOp;.  Vdb
2a50: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20  eOpIter sIter;. 
2a60: 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20   memset(&sIter, 
2a70: 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29  0, sizeof(sIter)
2a80: 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76  );.  sIter.v = v
2a90: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70  ;..  while( (pOp
2aa0: 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73   = opIterNext(&s
2ab0: 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20  Iter))!=0 ){.   
2ac0: 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f   int opcode = pO
2ad0: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69  p->opcode;.    i
2ae0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65  f( opcode==OP_De
2af0: 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d  stroy || opcode=
2b00: 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f  =OP_VUpdate || o
2b10: 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d  pcode==OP_VRenam
2b20: 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e .#ifndef SQLIT
2b30: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
2b40: 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f  EY.     || (opco
2b50: 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  de==OP_FkCounter
2b60: 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26   && pOp->p1==0 &
2b70: 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23  & pOp->p2==1) .#
2b80: 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28  endif.     || ((
2b90: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20  opcode==OP_Halt 
2ba0: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61  || opcode==OP_Ha
2bb0: 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20  ltIfNull) .     
2bc0: 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30 78   && ((pOp->p1&0x
2bd0: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
2be0: 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70  TRAINT && pOp->p
2bf0: 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20  2==OE_Abort)).  
2c00: 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62    ){.      hasAb
2c10: 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  ort = 1;.      b
2c20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2c30: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2c40: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
2c50: 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  ub);..  /* Retur
2c60: 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 62 6f  n true if hasAbo
2c70: 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72  rt==mayAbort. Or
2c80: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
2c90: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
2ca0: 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61   ** If malloc fa
2cb0: 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77  iled, then the w
2cc0: 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76  hile() loop abov
2cd0: 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69  e may not have i
2ce0: 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72  terated.  ** thr
2cf0: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
2d00: 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61   and hasAbort ma
2d10: 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65  y be set incorre
2d20: 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a  ctly. Return.  *
2d30: 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 20  * true for this 
2d40: 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20  case to prevent 
2d50: 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e 20  the assert() in 
2d60: 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d  the callers fram
2d70: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c  e.  ** from fail
2d80: 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  ing.  */.  retur
2d90: 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  n ( v->db->mallo
2da0: 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62  cFailed || hasAb
2db0: 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 29 3b  ort==mayAbort );
2dc0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2dd0: 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20  ITE_DEBUG - the 
2de0: 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
2df0: 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e  Abort() function
2e00: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20   */../*.** Loop 
2e10: 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67  through the prog
2e20: 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ram looking for 
2e30: 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61  P2 values that a
2e40: 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6f  re negative.** o
2e50: 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  n jump instructi
2e60: 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68 20  ons.  Each such 
2e70: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
2e80: 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a 2a  .  Resolve the.*
2e90: 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69  * label by setti
2ea0: 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  ng the P2 value 
2eb0: 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 6e  to its correct n
2ec0: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a  on-zero value..*
2ed0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2ee0: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
2ef0: 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64   after all opcod
2f00: 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73  es have been ins
2f10: 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72  erted..**.** Var
2f20: 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41  iable *pMaxFuncA
2f30: 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  rgs is set to th
2f40: 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20  e maximum value 
2f50: 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d 65  of any P2 argume
2f60: 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f  nt .** to an OP_
2f70: 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67 67  Function, OP_Agg
2f80: 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c 74  Step or OP_VFilt
2f90: 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73 20  er opcode. This 
2fa0: 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 73  is used by .** s
2fb0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
2fc0: 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74 68  ady() to size th
2fd0: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
2fe0: 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rray..**.** The 
2ff0: 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c 64  Op.opflags field
3000: 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20 6f   is set on all o
3010: 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  pcodes..*/.stati
3020: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32  c void resolveP2
3030: 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20  Values(Vdbe *p, 
3040: 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  int *pMaxFuncArg
3050: 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  s){.  int i;.  i
3060: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70  nt nMaxArgs = *p
3070: 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f  MaxFuncArgs;.  O
3080: 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20  p *pOp;.  Parse 
3090: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
30a0: 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  rse;.  int *aLab
30b0: 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61  el = pParse->aLa
30c0: 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e  bel;.  p->readOn
30d0: 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73  ly = 1;.  p->bIs
30e0: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66 6f  Reader = 0;.  fo
30f0: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
3100: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
3110: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
3120: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
3130: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 2f  ->opcode;..    /
3140: 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20  * NOTE: Be sure 
3150: 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f  to update mkopco
3160: 64 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64 64  deh.awk when add
3170: 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a  ing or removing.
3180: 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f      ** cases fro
3190: 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a  m this switch! *
31a0: 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  /.    switch( op
31b0: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61  code ){.      ca
31c0: 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 3a 0a  se OP_Function:.
31d0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 67        case OP_Ag
31e0: 67 53 74 65 70 3a 20 7b 0a 20 20 20 20 20 20 20  gStep: {.       
31f0: 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61   if( pOp->p5>nMa
3200: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
3210: 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 20   = pOp->p5;.    
3220: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3230: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50   }.      case OP
3240: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a  _Transaction: {.
3250: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
3260: 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64  >p2!=0 ) p->read
3270: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  Only = 0;.      
3280: 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a    /* fall thru *
3290: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
32a0: 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  case OP_AutoComm
32b0: 69 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  it:.      case O
32c0: 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20  P_Savepoint: {. 
32d0: 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61         p->bIsRea
32e0: 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  der = 1;.       
32f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3300: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3310: 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 63 61  MIT_WAL.      ca
3320: 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74  se OP_Checkpoint
3330: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  :.#endif.      c
3340: 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a 20  ase OP_Vacuum:. 
3350: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75       case OP_Jou
3360: 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20  rnalMode: {.    
3370: 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20      p->readOnly 
3380: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
3390: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20  bIsReader = 1;. 
33a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
33b0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
33c0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
33d0: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 63 61 73  LTABLE.      cas
33e0: 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a  e OP_VUpdate: {.
33f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
3400: 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p2>nMaxArgs ) n
3410: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
3420: 32 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  2;.        break
3430: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3440: 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a  case OP_VFilter:
3450: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e   {.        int n
3460: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
3470: 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20  ( p->nOp - i >= 
3480: 33 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  3 );.        ass
3490: 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
34a0: 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20  ode==OP_Integer 
34b0: 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 70  );.        n = p
34c0: 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20  Op[-1].p1;.     
34d0: 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67     if( n>nMaxArg
34e0: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e  s ) nMaxArgs = n
34f0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3500: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
3510: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65        case OP_Ne
3520: 78 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  xt:.      case O
3530: 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 0a 20 20  P_NextIfOpen:.  
3540: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74      case OP_Sort
3550: 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20  erNext: {.      
3560: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e    pOp->p4.xAdvan
3570: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ce = sqlite3Btre
3580: 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70  eNext;.        p
3590: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
35a0: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
35b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
35c0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72        case OP_Pr
35d0: 65 76 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ev:.      case O
35e0: 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 7b 0a  P_PrevIfOpen: {.
35f0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
3600: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
3610: 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b  e3BtreePrevious;
3620: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  .        pOp->p4
3630: 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43  type = P4_ADVANC
3640: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
3650: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3660: 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67  .    pOp->opflag
3670: 73 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  s = sqlite3Opcod
3680: 65 50 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65  eProperty[opcode
3690: 5d 3b 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d  ];.    if( (pOp-
36a0: 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47  >opflags & OPFLG
36b0: 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f 70  _JUMP)!=0 && pOp
36c0: 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20  ->p2<0 ){.      
36d0: 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e  assert( -1-pOp->
36e0: 70 32 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65  p2<pParse->nLabe
36f0: 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  l );.      pOp->
3700: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70  p2 = aLabel[-1-p
3710: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20  Op->p2];.    }. 
3720: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
3730: 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65  ee(p->db, pParse
3740: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61  ->aLabel);.  pPa
3750: 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b  rse->aLabel = 0;
3760: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65  .  pParse->nLabe
3770: 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75  l = 0;.  *pMaxFu
3780: 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67  ncArgs = nMaxArg
3790: 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  s;.  assert( p->
37a0: 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20  bIsReader!=0 || 
37b0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20  p->btreeMask==0 
37c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
37d0: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
37e0: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
37f0: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73  uction to be ins
3800: 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erted..*/.int sq
3810: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
3820: 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  Addr(Vdbe *p){. 
3830: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
3840: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
3850: 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  IT );.  return p
3860: 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ->nOp;.}../*.** 
3870: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
3880: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
3890: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
38a0: 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74  opcodes associat
38b0: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56  ed with.** the V
38c0: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
38d0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
38e0: 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  . It is the call
38f0: 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
3900: 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65  ty.** to arrange
3910: 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65   for the returne
3920: 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76  d array to be ev
3930: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75  entually freed u
3940: 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62  sing the .** vdb
3950: 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66  eFreeOpArray() f
3960: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42  unction..**.** B
3970: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
3980: 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f   *pnOp is set to
3990: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
39a0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65  ntries in the re
39b0: 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e  turned.** array.
39c0: 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67   Also, *pnMaxArg
39d0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c   is set to the l
39e0: 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72  arger of its cur
39f0: 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a  rent value and .
3a00: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
3a10: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
3a20: 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72  Vdbe.apArg[] arr
3a30: 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  ay required to e
3a40: 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72  xecute the .** r
3a50: 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e  eturned program.
3a60: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
3a70: 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72  te3VdbeTakeOpArr
3a80: 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ay(Vdbe *p, int 
3a90: 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61  *pnOp, int *pnMa
3aa0: 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20  xArg){.  VdbeOp 
3ab0: 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20  *aOp = p->aOp;. 
3ac0: 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20   assert( aOp && 
3ad0: 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  !p->db->mallocFa
3ae0: 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  iled );..  /* Ch
3af0: 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33  eck that sqlite3
3b00: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20  VdbeUsesBtree() 
3b10: 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f  was not called o
3b20: 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61  n this VM */.  a
3b30: 73 73 65 72 74 28 20 70 2d 3e 62 74 72 65 65 4d  ssert( p->btreeM
3b40: 61 73 6b 3d 3d 30 20 29 3b 0a 0a 20 20 72 65 73  ask==0 );..  res
3b50: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
3b60: 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e  pnMaxArg);.  *pn
3b70: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70  Op = p->nOp;.  p
3b80: 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74  ->aOp = 0;.  ret
3b90: 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aOp;.}../*.*
3ba0: 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69  * Add a whole li
3bb0: 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  st of operations
3bc0: 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
3bd0: 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e  n stack.  Return
3be0: 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20   the.** address 
3bf0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  of the first ope
3c00: 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f  ration added..*/
3c10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
3c20: 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a  AddOpList(Vdbe *
3c30: 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65  p, int nOp, Vdbe
3c40: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f  OpList const *aO
3c50: 70 2c 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 29 7b  p, int iLineno){
3c60: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61  .  int addr;.  a
3c70: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
3c80: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
3c90: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
3ca0: 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72   + nOp > p->pPar
3cb0: 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20  se->nOpAlloc && 
3cc0: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29  growOpArray(p) )
3cd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
3ce0: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e    }.  addr = p->
3cf0: 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  nOp;.  if( ALWAY
3d00: 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20 20  S(nOp>0) ){.    
3d10: 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f  int i;.    VdbeO
3d20: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e  pList const *pIn
3d30: 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28   = aOp;.    for(
3d40: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c  i=0; i<nOp; i++,
3d50: 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69   pIn++){.      i
3d60: 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b  nt p2 = pIn->p2;
3d70: 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70  .      VdbeOp *p
3d80: 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b  Out = &p->aOp[i+
3d90: 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75  addr];.      pOu
3da0: 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d  t->opcode = pIn-
3db0: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70  >opcode;.      p
3dc0: 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70  Out->p1 = pIn->p
3dd0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c  1;.      if( p2<
3de0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
3df0: 65 72 74 28 20 73 71 6c 69 74 65 33 4f 70 63 6f  ert( sqlite3Opco
3e00: 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d  deProperty[pOut-
3e10: 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47  >opcode] & OPFLG
3e20: 5f 4a 55 4d 50 20 29 3b 0a 20 20 20 20 20 20 20  _JUMP );.       
3e30: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72   pOut->p2 = addr
3e40: 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20   + ADDR(p2);.   
3e50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3e60: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b    pOut->p2 = p2;
3e70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
3e80: 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70  Out->p3 = pIn->p
3e90: 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  3;.      pOut->p
3ea0: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
3eb0: 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  ED;.      pOut->
3ec0: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  p4.p = 0;.      
3ed0: 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69  pOut->p5 = 0;.#i
3ee0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3ef0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
3f00: 4e 54 53 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  NTS.      pOut->
3f10: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65  zComment = 0;.#e
3f20: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
3f30: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
3f40: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 69 53 72  .      pOut->iSr
3f50: 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b  cLine = iLineno+
3f60: 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 28  i;.#else.      (
3f70: 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65  void)iLineno;.#e
3f80: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
3f90: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69  TE_DEBUG.      i
3fa0: 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  f( p->db->flags 
3fb0: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
3fc0: 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  opTrace ){.     
3fd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
3fe0: 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c  intOp(0, i+addr,
3ff0: 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d   &p->aOp[i+addr]
4000: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
4010: 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  f.    }.    p->n
4020: 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20  Op += nOp;.  }. 
4030: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
4040: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
4050: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
4060: 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  1 operand for a 
4070: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
4080: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
4090: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
40a0: 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f  when a large pro
40b0: 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66  gram is loaded f
40c0: 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20  rom a.** static 
40d0: 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69  array using sqli
40e0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
40f0: 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   but we want to 
4100: 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69  make a.** few mi
4110: 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74  nor changes to t
4120: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  he program..*/.v
4130: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
4140: 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c  hangeP1(Vdbe *p,
4150: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
4160: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
4170: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75  !=0 );.  if( ((u
4180: 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20  32)p->nOp)>addr 
4190: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
41a0: 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20  dr].p1 = val;.  
41b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
41c0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
41d0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f  he P2 operand fo
41e0: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
41f0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
4200: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4210: 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ful for setting 
4220: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
4230: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
4240: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
4250: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
4260: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
4270: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
4280: 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f   if( ((u32)p->nO
4290: 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70  p)>addr ){.    p
42a0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d  ->aOp[addr].p2 =
42b0: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
42c0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
42d0: 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70  lue of the P3 op
42e0: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
42f0: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
4300: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4310: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64  3VdbeChangeP3(Vd
4320: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
4330: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73   int val){.  ass
4340: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69  ert( p!=0 );.  i
4350: 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29  f( ((u32)p->nOp)
4360: 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e  >addr ){.    p->
4370: 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76  aOp[addr].p3 = v
4380: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
4390: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
43a0: 65 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72  e of the P5 oper
43b0: 61 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  and for the most
43c0: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64   recently.** add
43d0: 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  ed operation..*/
43e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
43f0: 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a  eChangeP5(Vdbe *
4400: 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73  p, u8 val){.  as
4410: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
4420: 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20  if( p->aOp ){.  
4430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
4440: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70  >0 );.    p->aOp
4450: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20  [p->nOp-1].p5 = 
4460: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
4470: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20  * Change the P2 
4480: 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72  operand of instr
4490: 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74  uction addr so t
44a0: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
44b0: 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20  .** the address 
44c0: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
44d0: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f  ruction to be co
44e0: 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ded..*/.void sql
44f0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4500: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
4510: 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr){.  sqlite3Vd
4520: 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64  beChangeP2(p, ad
4530: 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 70  dr, p->nOp);.  p
4540: 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65 64  ->pParse->iFixed
4550: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  Op = p->nOp - 1;
4560: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
4570: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
4580: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
4590: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
45a0: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
45b0: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
45c0: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
45d0: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
45e0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
45f0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
4600: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
4610: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
4620: 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20  f( ALWAYS(pDef) 
4630: 26 26 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  && (pDef->funcFl
4640: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
4650: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20  C_EPHEM)!=0 ){. 
4660: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4670: 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a  (db, pDef);.  }.
4680: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  }..static void v
4690: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
46a0: 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20  qlite3 *, Op *, 
46b0: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  int);../*.** Del
46c0: 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69  ete a P4 value i
46d0: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
46e0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
46f0: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
4700: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
4710: 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20   *p4){.  if( p4 
4720: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
4730: 62 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28  b );.    switch(
4740: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20   p4type ){.     
4750: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20   case P4_REAL:. 
4760: 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54       case P4_INT
4770: 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  64:.      case P
4780: 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20  4_DYNAMIC:.     
4790: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
47a0: 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  Y: {.        sql
47b0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
47c0: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
47d0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
47e0: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
47f0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
4800: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
4810: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79  ==0 ) sqlite3Key
4820: 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e  InfoUnref((KeyIn
4830: 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  fo*)p4);.       
4840: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4850: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50        case P4_MP
4860: 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 20  RINTF: {.       
4870: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4880: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
4890: 65 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20 20  e3_free(p4);.   
48a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
48b0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
48c0: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
48d0: 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72       freeEphemer
48e0: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28  alFunction(db, (
48f0: 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20  FuncDef*)p4);.  
4900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4910: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
4920: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
4930: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
4940: 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20  sFreed==0 ){.   
4950: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
4960: 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33  lueFree((sqlite3
4970: 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20  _value*)p4);.   
4980: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4990: 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28        Mem *p = (
49a0: 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  Mem*)p4;.       
49b0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
49c0: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
49d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
49e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
49f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4a00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4a10: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
4a20: 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20  _VTAB : {.      
4a30: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
4a40: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
4a50: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56  te3VtabUnlock((V
4a60: 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20  Table *)p4);.   
4a70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4a80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
4a90: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
4aa0: 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
4ab0: 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20  for aOp and any 
4ac0: 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61  p4 values alloca
4ad0: 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f  ted for the.** o
4ae0: 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64  pcodes contained
4af0: 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20   within. If aOp 
4b00: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69  is not NULL it i
4b10: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
4b20: 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74  tain .** nOp ent
4b30: 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ries. .*/.static
4b40: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
4b50: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
4b60: 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20  b, Op *aOp, int 
4b70: 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20  nOp){.  if( aOp 
4b80: 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  ){.    Op *pOp;.
4b90: 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b      for(pOp=aOp;
4ba0: 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20   pOp<&aOp[nOp]; 
4bb0: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72  pOp++){.      fr
4bc0: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
4bd0: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
4be0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
4bf0: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
4c00: 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71  OMMENTS.      sq
4c10: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4c20: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
4c30: 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20  #endif     .    
4c40: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  }.  }.  sqlite3D
4c50: 62 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a  bFree(db, aOp);.
4c60: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68  }../*.** Link th
4c70: 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a  e SubProgram obj
4c80: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
4c90: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
4ca0: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  t into the linke
4cb0: 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62  d.** list at Vdb
4cc0: 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54  e.pSubProgram. T
4cd0: 68 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64  his list is used
4ce0: 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73   to delete all s
4cf0: 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62  ub-program.** ob
4d00: 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56  jects when the V
4d10: 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72  M is no longer r
4d20: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64  equired..*/.void
4d30: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b   sqlite3VdbeLink
4d40: 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20  SubProgram(Vdbe 
4d50: 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72  *pVdbe, SubProgr
4d60: 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65  am *p){.  p->pNe
4d70: 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f  xt = pVdbe->pPro
4d80: 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70  gram;.  pVdbe->p
4d90: 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a  Program = p;.}..
4da0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
4db0: 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20   opcode at addr 
4dc0: 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a  into OP_Noop.*/.
4dd0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4de0: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62  ChangeToNoop(Vdb
4df0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
4e00: 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b  .  if( p->aOp ){
4e10: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
4e20: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
4e30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
4e40: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66  b = p->db;.    f
4e50: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
4e60: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
4e70: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f  );.    memset(pO
4e80: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70  p, 0, sizeof(pOp
4e90: 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  [0]));.    pOp->
4ea0: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
4eb0: 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 3d 3d  ;.    if( addr==
4ec0: 70 2d 3e 6e 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f  p->nOp-1 ) p->nO
4ed0: 70 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p--;.  }.}../*.*
4ee0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6c 61 73  * Remove the las
4ef0: 74 20 6f 70 63 6f 64 65 20 69 6e 73 65 72 74 65  t opcode inserte
4f00: 64 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  d.*/.int sqlite3
4f10: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
4f20: 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75  pcode(Vdbe *p, u
4f30: 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d  8 op){.  if( (p-
4f40: 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72  >nOp-1)>(p->pPar
4f50: 73 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26  se->iFixedOp) &&
4f60: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
4f70: 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a  ].opcode==op ){.
4f80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
4f90: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70  hangeToNoop(p, p
4fa0: 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 20 20 72 65  ->nOp-1);.    re
4fb0: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
4fc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4fd0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
4fe0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
4ff0: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66  the P4 operand f
5000: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
5010: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
5020: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
5030: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
5040: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
5050: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
5060: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
5070: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5080: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
5090: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
50a0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
50b0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
50c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74  .**.** If n>=0 t
50d0: 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61  hen the P4 opera
50e0: 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d  nd is dynamic, m
50f0: 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f  eaning that a co
5100: 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72  py of.** the str
5110: 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f  ing is made into
5120: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
5130: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
5140: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c  lloc()..** A val
5150: 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73  ue of n==0 means
5160: 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a   copy bytes of z
5170: 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63  P4 up to and inc
5180: 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  luding the.** fi
5190: 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20  rst null byte.  
51a0: 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79  If n>0 then copy
51b0: 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50   n+1 bytes of zP
51c0: 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20  4..** .** Other 
51d0: 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f  values of n (P4_
51e0: 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53  STATIC, P4_COLLS
51f0: 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74  EQ etc.) indicat
5200: 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74  e that zP4 point
5210: 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67  s.** to a string
5220: 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68   or structure th
5230: 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  at is guaranteed
5240: 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68   to exist for th
5250: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a  e lifetime of.**
5260: 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68   the Vdbe. In th
5270: 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e  ese cases we can
5280: 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70   just copy the p
5290: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ointer..**.** If
52a0: 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61   addr<0 then cha
52b0: 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  nge P4 on the mo
52c0: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
52d0: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
52e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
52f0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64  3VdbeChangeP4(Vd
5300: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
5310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
5320: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
5330: 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pOp;.  sqlite3 *
5340: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  db;.  assert( p!
5350: 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  =0 );.  db = p->
5360: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  db;.  assert( p-
5370: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
5380: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
5390: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62   p->aOp==0 || db
53a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
53b0: 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f  {.    if( n!=P4_
53c0: 56 54 41 42 20 29 7b 0a 20 20 20 20 20 20 66 72  VTAB ){.      fr
53d0: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
53e0: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
53f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
5400: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
5410: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
5420: 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d   assert( addr<p-
5430: 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64  >nOp );.  if( ad
5440: 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72  dr<0 ){.    addr
5450: 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20   = p->nOp - 1;. 
5460: 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61   }.  pOp = &p->a
5470: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73 65  Op[addr];.  asse
5480: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
5490: 3d 50 34 5f 4e 4f 54 55 53 45 44 0a 20 20 20 20  =P4_NOTUSED.    
54a0: 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70     || pOp->p4typ
54b0: 65 3d 3d 50 34 5f 49 4e 54 33 32 0a 20 20 20 20  e==P4_INT32.    
54c0: 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70     || pOp->p4typ
54d0: 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b  e==P4_KEYINFO );
54e0: 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f  .  freeP4(db, pO
54f0: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
5500: 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34  p4.p);.  pOp->p4
5510: 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d  .p = 0;.  if( n=
5520: 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20  =P4_INT32 ){.   
5530: 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63   /* Note: this c
5540: 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63  ast is safe, bec
5550: 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20  ause the origin 
5560: 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61  data point was a
5570: 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  n int.    ** tha
5580: 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20  t was cast to a 
5590: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20  (const char *). 
55a0: 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69  */.    pOp->p4.i
55b0: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
55c0: 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70  _INT(zP4);.    p
55d0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
55e0: 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69  INT32;.  }else i
55f0: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
5600: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
5610: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5620: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
5630: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
5640: 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70  KEYINFO ){.    p
5650: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
5660: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
5670: 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49  p4type = P4_KEYI
5680: 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NFO;.  }else if(
5690: 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20   n==P4_VTAB ){. 
56a0: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
56b0: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
56c0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
56d0: 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65  VTAB;.    sqlite
56e0: 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c  3VtabLock((VTabl
56f0: 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73  e *)zP4);.    as
5700: 73 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a  sert( ((VTable *
5710: 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62  )zP4)->db==p->db
5720: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
5730: 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  n<0 ){.    pOp->
5740: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
5750: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
5760: 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  pe = (signed cha
5770: 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r)n;.  }else{.  
5780: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d    if( n==0 ) n =
5790: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
57a0: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
57b0: 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62  p4.z = sqlite3Db
57c0: 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a  StrNDup(p->db, z
57d0: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d  P4, n);.    pOp-
57e0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
57f0: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  AMIC;.  }.}../*.
5800: 2a 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e  ** Set the P4 on
5810: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
5820: 6c 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20  ly added opcode 
5830: 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66  to the KeyInfo f
5840: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  or the.** index 
5850: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
5860: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
5870: 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyInfo(Parse *pP
5880: 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
5890: 78 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  x){.  Vdbe *v = 
58a0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
58b0: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
58c0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21  .  assert( pIdx!
58d0: 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
58e0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
58f0: 31 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  1, (char*)sqlite
5900: 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
5910: 70 50 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20  pParse, pIdx),. 
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5930: 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
5940: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
5950: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
5960: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a  N_COMMENTS./*.**
5970: 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d   Change the comm
5980: 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  ent on the most 
5990: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
59a0: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a  nstruction.  Or.
59b0: 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f  ** insert a No-o
59c0: 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f  p and add the co
59d0: 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65  mment to that ne
59e0: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  w instruction.  
59f0: 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68  This.** makes th
5a00: 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f  e code easier to
5a10: 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62   read during deb
5a20: 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66  ugging.  None of
5a30: 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a   this happens.**
5a40: 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e   in a production
5a50: 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   build..*/.stati
5a60: 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d  c void vdbeVComm
5a70: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
5a80: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
5a90: 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20  , va_list ap){. 
5aa0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
5ab0: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29  0 || p->aOp==0 )
5ac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
5ad0: 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b  Op==0 || p->aOp[
5ae0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
5af0: 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e  nt==0 || p->db->
5b00: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
5b10: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a    if( p->nOp ){.
5b20: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
5b30: 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Op );.    sqlite
5b40: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
5b50: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
5b60: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70  zComment);.    p
5b70: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
5b80: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74  zComment = sqlit
5b90: 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62  e3VMPrintf(p->db
5ba0: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
5bb0: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
5bc0: 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64  e3VdbeComment(Vd
5bd0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
5be0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
5bf0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
5c00: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76    if( p ){.    v
5c10: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
5c20: 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43  mat);.    vdbeVC
5c30: 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61  omment(p, zForma
5c40: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
5c50: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  nd(ap);.  }.}.vo
5c60: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f  id sqlite3VdbeNo
5c70: 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  opComment(Vdbe *
5c80: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
5c90: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
5ca0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
5cb0: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
5cc0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20  e3VdbeAddOp0(p, 
5cd0: 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61  OP_Noop);.    va
5ce0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
5cf0: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
5d00: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
5d10: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
5d20: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  d(ap);.  }.}.#en
5d30: 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a  dif  /* NDEBUG *
5d40: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
5d50: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f  _VDBE_COVERAGE./
5d60: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
5d70: 75 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69  ue if the iSrcLi
5d80: 6e 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65  ne field for the
5d90: 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65   previously code
5da0: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  d instruction..*
5db0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5dc0: 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28  beSetLineNumber(
5dd0: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69  Vdbe *v, int iLi
5de0: 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  ne){.  sqlite3Vd
5df0: 62 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69  beGetOp(v,-1)->i
5e00: 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b  SrcLine = iLine;
5e10: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
5e20: 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  ITE_VDBE_COVERAG
5e30: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  E */../*.** Retu
5e40: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
5e50: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
5e60: 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65  s.  If the addre
5e70: 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a  ss is -1, then.*
5e80: 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * return the mos
5e90: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
5ea0: 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  ted opcode..**.*
5eb0: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
5ec0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
5ed0: 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f  as occurred prio
5ee0: 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67  r to the calling
5ef0: 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74   of this.** rout
5f00: 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e  ine, then a poin
5f10: 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56  ter to a dummy V
5f20: 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65  dbeOp will be re
5f30: 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70  turned.  That op
5f40: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61  code.** is reada
5f50: 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74  ble but not writ
5f60: 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20  able, though it 
5f70: 69 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69  is cast to a wri
5f80: 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20  table value..** 
5f90: 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20  The return of a 
5fa0: 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c  dummy opcode all
5fb0: 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ows the call to 
5fc0: 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f  continue functio
5fd0: 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 20  ning.** after a 
5fe0: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
5ff0: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
6000: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
6010: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
6020: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6030: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
6040: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
6050: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
6060: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
6070: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
6080: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
6090: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
60a0: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
60b0: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
60c0: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f  ith Valgrind..*/
60d0: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
60e0: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
60f0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
6100: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
6110: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
6120: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
6130: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
6140: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
6150: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
6160: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
6170: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
6180: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
6190: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
61a0: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
61b0: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
61c0: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
61d0: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
61e0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
61f0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
6200: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
6210: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
6220: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
6230: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
6240: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
6250: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
6260: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
6270: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
6280: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
6290: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
62a0: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
62b0: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
62c0: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
62d0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
62e0: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
62f0: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52  OMMENTS)./*.** R
6300: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
6310: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f   value for one o
6320: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
6330: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70   to the opcode p
6340: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  Op.** determined
6350: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e   by character c.
6360: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
6370: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63  ranslateP(char c
6380: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29  , const Op *pOp)
6390: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29  {.  if( c=='1' )
63a0: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b   return pOp->p1;
63b0: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20  .  if( c=='2' ) 
63c0: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a  return pOp->p2;.
63d0: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72    if( c=='3' ) r
63e0: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20  eturn pOp->p3;. 
63f0: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65   if( c=='4' ) re
6400: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  turn pOp->p4.i;.
6410: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35    return pOp->p5
6420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
6430: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20  te a string for 
6440: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69  the "comment" fi
6450: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70  eld of a VDBE op
6460: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a  code listing..**
6470: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73  .** The Synopsis
6480: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65  : field in comme
6490: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e  nts in the vdbe.
64a0: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65  c source file ge
64b0: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ts converted.** 
64c0: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69  to an extra stri
64d0: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e  ng that is appen
64e0: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ded to the sqlit
64f0: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20  e3OpcodeName(). 
6500: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e   In the.** absen
6510: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d  ce of other comm
6520: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70  ents, this synop
6530: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  sis becomes the 
6540: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f  comment on the o
6550: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74  pcode..** Some t
6560: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72  ranslation occur
6570: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22  s:.**.**       "
6580: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b  PX"      ->  "r[
6590: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  X]".**       "PX
65a0: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e  @PY"   ->  "r[X.
65b0: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b  .X+Y-1]"  or "r[
65c0: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72  x]" if y is 0 or
65d0: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40   1.**       "PX@
65e0: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY+1" ->  "r[X..
65f0: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78  X+Y]"    or "r[x
6600: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20  ]" if y is 0.** 
6610: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20        "PY..PY"  
6620: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20  ->  "r[X..Y]"   
6630: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
6640: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y<=x.*/.static i
6650: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  nt displayCommen
6660: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70  t(.  const Op *p
6670: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  Op,     /* The o
6680: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d  pcode to be comm
6690: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ented */.  const
66a0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a   char *zP4,   /*
66b0: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61   Previously obta
66c0: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50  ined value for P
66d0: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  4 */.  char *zTe
66e0: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  mp,       /* Wri
66f0: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  te result here *
6700: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20  /.  int nTemp   
6710: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
6720: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65  available in zTe
6730: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  mp[] */.){.  con
6740: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
6750: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
6760: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74  zSynopsis;.  int
6770: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nOpName;.  int 
6780: 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d  ii, jj;.  zOpNam
6790: 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  e = sqlite3Opcod
67a0: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
67b0: 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20  e);.  nOpName = 
67c0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
67d0: 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zOpName);.  if( 
67e0: 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b  zOpName[nOpName+
67f0: 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65  1] ){.    int se
6800: 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63  enCom = 0;.    c
6810: 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f  har c;.    zSyno
6820: 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b  psis = zOpName +
6830: 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20  = nOpName + 1;. 
6840: 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20     for(ii=jj=0; 
6850: 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63  jj<nTemp-1 && (c
6860: 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d   = zSynopsis[ii]
6870: 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  )!=0; ii++){.   
6880: 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b     if( c=='P' ){
6890: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79  .        c = zSy
68a0: 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20  nopsis[++ii];.  
68b0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27        if( c=='4'
68c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
68d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
68e0: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
68f0: 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20  j, "%s", zP4);. 
6900: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
6910: 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20   c=='X' ){.     
6920: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6930: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
6940: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20  zTemp+jj, "%s", 
6950: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
6960: 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f            seenCo
6970: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  m = 1;.        }
6980: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6990: 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61  int v1 = transla
69a0: 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20  teP(c, pOp);.   
69b0: 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20         int v2;. 
69c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
69d0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
69e0: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
69f0: 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20  d", v1);.       
6a00: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
6a10: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22  Synopsis+ii+1, "
6a20: 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20  @P", 2)==0 ){.  
6a30: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20            ii += 
6a40: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  3;.            j
6a50: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  j += sqlite3Strl
6a60: 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a  en30(zTemp+jj);.
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d              v2 =
6a80: 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e   translateP(zSyn
6a90: 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b  opsis[ii], pOp);
6aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
6ab0: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
6ac0: 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d  is+ii+1,"+1",2)=
6ad0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6ae0: 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20      ii += 2;.   
6af0: 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b             v2++;
6b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
6b10: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76             if( v
6b20: 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  2>1 ){.         
6b30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6b40: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
6b50: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22  zTemp+jj, "..%d"
6b60: 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20  , v1+v2-1);.    
6b70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6b80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
6b90: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b  rncmp(zSynopsis+
6ba0: 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29  ii+1, "..P3", 4)
6bb0: 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d  ==0 && pOp->p3==
6bc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6bd0: 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20   ii += 4;.      
6be0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
6bf0: 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71          jj += sq
6c00: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
6c10: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d  emp+jj);.      }
6c20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54  else{.        zT
6c30: 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20  emp[jj++] = c;. 
6c40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6c50: 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26   if( !seenCom &&
6c60: 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70   jj<nTemp-5 && p
6c70: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
6c80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6c90: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
6ca0: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73   zTemp+jj, "; %s
6cb0: 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  ", pOp->zComment
6cc0: 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  );.      jj += s
6cd0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
6ce0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a  Temp+jj);.    }.
6cf0: 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70      if( jj<nTemp
6d00: 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30   ) zTemp[jj] = 0
6d10: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f  ;.  }else if( pO
6d20: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
6d30: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6d40: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6d50: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
6d60: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d  mment);.    jj =
6d70: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6d80: 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65  (zTemp);.  }else
6d90: 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d  {.    zTemp[0] =
6da0: 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a   0;.    jj = 0;.
6db0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b    }.  return jj;
6dc0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
6dd0: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 0a 23  ITE_DEBUG */...#
6de0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
6df0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29  TE_OMIT_EXPLAIN)
6e00: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45   || !defined(NDE
6e10: 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64  BUG) \.     || d
6e20: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
6e30: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
6e40: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
6e50: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74  .** Compute a st
6e60: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
6e70: 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d  bes the P4 param
6e80: 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f  eter for an opco
6e90: 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70  de..** Use zTemp
6ea0: 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65   for any require
6eb0: 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  d temporary buff
6ec0: 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  er space..*/.sta
6ed0: 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61  tic char *displa
6ee0: 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61  yP4(Op *pOp, cha
6ef0: 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54  r *zTemp, int nT
6f00: 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  emp){.  char *zP
6f10: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73  4 = zTemp;.  ass
6f20: 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29  ert( nTemp>=20 )
6f30: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d  ;.  switch( pOp-
6f40: 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63  >p4type ){.    c
6f50: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20  ase P4_KEYINFO: 
6f60: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  {.      int i, j
6f70: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
6f80: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d  *pKeyInfo = pOp-
6f90: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
6fa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
6fb0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
6fc0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=0 );.      sql
6fd0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6fe0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28 25  emp, zTemp, "k(%
6ff0: 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d", pKeyInfo->nF
7000: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d  ield);.      i =
7010: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7020: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66  (zTemp);.      f
7030: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e  or(j=0; j<pKeyIn
7040: 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29  fo->nField; j++)
7050: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
7060: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49  q *pColl = pKeyI
7070: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  nfo->aColl[j];. 
7080: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
7090: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  r *zColl = pColl
70a0: 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20   ? pColl->zName 
70b0: 3a 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20 20  : "nil";.       
70c0: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
70d0: 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b  Strlen30(zColl);
70e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  .        if( n==
70f0: 36 20 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f 6c  6 && memcmp(zCol
7100: 6c 2c 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d 30  l,"BINARY",6)==0
7110: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43   ){.          zC
7120: 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20  oll = "B";.     
7130: 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
7140: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
7150: 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b  ( i+n>nTemp-6 ){
7160: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
7170: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e  y(&zTemp[i],",..
7180: 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20  .",4);.         
7190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
71a0: 7d 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  }.        zTemp[
71b0: 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  i++] = ',';.    
71c0: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
71d0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20  ->aSortOrder[j] 
71e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65  ){.          zTe
71f0: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20  mp[i++] = '-';. 
7200: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7210: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
7220: 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a  ], zColl, n+1);.
7230: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a          i += n;.
7240: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
7250: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a  emp[i++] = ')';.
7260: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d        zTemp[i] =
7270: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
7280: 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20  ( i<nTemp );.   
7290: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
72a0: 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c      case P4_COLL
72b0: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
72c0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f  lSeq *pColl = pO
72d0: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20  p->p4.pColl;.   
72e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
72f0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7300: 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f  , "(%.20s)", pCo
7310: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
7320: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7330: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
7340: 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  EF: {.      Func
7350: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
7360: 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20  >p4.pFunc;.     
7370: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7380: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7390: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  "%s(%d)", pDef->
73a0: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72  zName, pDef->nAr
73b0: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
73c0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
73d0: 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20  P4_INT64: {.    
73e0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
73f0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7400: 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70   "%lld", *pOp->p
7410: 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62  4.pI64);.      b
7420: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7430: 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b  case P4_INT32: {
7440: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7450: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
7460: 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d  Temp, "%d", pOp-
7470: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
7480: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7490: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
74a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
74b0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
74c0: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f  mp, "%.16g", *pO
74d0: 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20  p->p4.pReal);.  
74e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
74f0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d  .    case P4_MEM
7500: 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  : {.      Mem *p
7510: 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d  Mem = pOp->p4.pM
7520: 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  em;.      if( pM
7530: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
7540: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Str ){.        z
7550: 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  P4 = pMem->z;.  
7560: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
7570: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
7580: 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Int ){.        s
7590: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
75a0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
75b0: 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29  lld", pMem->u.i)
75c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
75d0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
75e0: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
75f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7600: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7610: 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d  p, "%.16g", pMem
7620: 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->r);.      }els
7630: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
7640: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
7650: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7660: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
7670: 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a  zTemp, "NULL");.
7680: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7690: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
76a0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  m->flags & MEM_B
76b0: 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  lob );.        z
76c0: 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20  P4 = "(blob)";. 
76d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
76e0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
76f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
7700: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
7710: 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20  ase P4_VTAB: {. 
7720: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
7730: 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  b *pVtab = pOp->
7740: 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
7750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7760: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
7770: 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25  Temp, "vtab:%p:%
7780: 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62  p", pVtab, pVtab
7790: 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20  ->pModule);.    
77a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
77b0: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
77c0: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
77d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
77e0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
77f0: 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a  p, "intarray");.
7800: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7810: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53   }.    case P4_S
7820: 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20  UBPROGRAM: {.   
7830: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7840: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7850: 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20  , "program");.  
7860: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7870: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56  .    case P4_ADV
7880: 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54  ANCE: {.      zT
7890: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
78a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
78b0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
78c0: 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70      zP4 = pOp->p
78d0: 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  4.z;.      if( z
78e0: 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  P4==0 ){.       
78f0: 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20   zP4 = zTemp;.  
7900: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
7910: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
7920: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
7930: 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  zP4!=0 );.  retu
7940: 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66  rn zP4;.}.#endif
7950: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
7960: 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74  to the Vdbe that
7970: 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63   the BTree objec
7980: 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20  t at db->aDb[i] 
7990: 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  is used..**.** T
79a0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
79b0: 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b  ements need to k
79c0: 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74  now in advance t
79d0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20  he complete set 
79e0: 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  of.** attached d
79f0: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69  atabases that wi
7a00: 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61  ll be use.  A ma
7a10: 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61  sk of these data
7a20: 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e  bases.** is main
7a30: 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72  tained in p->btr
7a40: 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e  eeMask.  The p->
7a50: 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69  lockMask value i
7a60: 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a  s the subset of.
7a70: 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  ** p->btreeMask 
7a80: 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61  of databases tha
7a90: 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  t will require a
7aa0: 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73   lock..*/.void s
7ab0: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
7ac0: 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ree(Vdbe *p, int
7ad0: 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69   i){.  assert( i
7ae0: 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e  >=0 && i<p->db->
7af0: 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69  nDb && i<(int)si
7b00: 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20  zeof(yDbMask)*8 
7b10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28  );.  assert( i<(
7b20: 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74  int)sizeof(p->bt
7b30: 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  reeMask)*8 );.  
7b40: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20  p->btreeMask |= 
7b50: 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b  ((yDbMask)1)<<i;
7b60: 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 73  .  if( i!=1 && s
7b70: 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 61  qlite3BtreeShara
7b80: 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69  ble(p->db->aDb[i
7b90: 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 70 2d  ].pBt) ){.    p-
7ba0: 3e 6c 6f 63 6b 4d 61 73 6b 20 7c 3d 20 28 28 79  >lockMask |= ((y
7bb0: 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20  DbMask)1)<<i;.  
7bc0: 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  }.}..#if !define
7bd0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
7be0: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
7bf0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
7c00: 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  >0./*.** If SQLi
7c10: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
7c20: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
7c30: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
7c40: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
7c50: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
7c60: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
7c70: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
7c80: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
7c90: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
7ca0: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
7cb0: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
7cc0: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
7cd0: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
7ce0: 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73   it also.** sets
7cf0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
7d00: 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20   member of each 
7d10: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20  of the BtShared 
7d20: 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75  structures, ensu
7d30: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
7d40: 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61   correct busy-ha
7d50: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ndler callback i
7d60: 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71  s invoked if req
7d70: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
7d80: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
7d90: 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65  readsafe but doe
7da0: 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  s support shared
7db0: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65  -cache mode, the
7dc0: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  n.** sqlite3Btre
7dd0: 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f  eEnter() is invo
7de0: 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42  ked to set the B
7df0: 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61  tShared.db varia
7e00: 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  bles.** of all o
7e10: 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  f BtShared struc
7e20: 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65  tures accessible
7e30: 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73   via the databas
7e40: 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73  e handle .** ass
7e50: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
7e60: 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   VM..**.** If SQ
7e70: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
7e80: 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20  adsafe and does 
7e90: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
7ea0: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
7eb0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
7ec0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
7ed0: 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61  * The p->btreeMa
7ee0: 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69  sk field is a bi
7ef0: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72  tmask of all btr
7f00: 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65  ees that the pre
7f10: 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d  pared .** statem
7f20: 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20  ent p will ever 
7f30: 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74  use.  Let N be t
7f40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
7f50: 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  s in p->btreeMas
7f60: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  k.** correspondi
7f70: 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61  ng to btrees tha
7f80: 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63  t use shared cac
7f90: 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75  he.  Then the ru
7fa0: 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73  ntime of.** this
7fb0: 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e   routine is N*N.
7fc0: 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61    But as N is ra
7fd0: 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31  rely more than 1
7fe0: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
7ff0: 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65  t.** be a proble
8000: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
8010: 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65  e3VdbeEnter(Vdbe
8020: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
8030: 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20   yDbMask mask;. 
8040: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
8050: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
8060: 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63  Db;.  if( p->loc
8070: 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75 72  kMask==0 ) retur
8080: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
8090: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d  n case */.  db =
80a0: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
80b0: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
80c0: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
80d0: 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e  i=0, mask=1; i<n
80e0: 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d  Db; i++, mask +=
80f0: 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20   mask){.    if( 
8100: 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20  i!=1 && (mask & 
8110: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20  p->lockMask)!=0 
8120: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
8130: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
8140: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
8150: 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ter(aDb[i].pBt);
8160: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
8170: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
8180: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
8190: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
81a0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
81b0: 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  >0./*.** Unlock 
81c0: 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65  all of the btree
81d0: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  s previously loc
81e0: 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  ked by a call to
81f0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
8200: 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  r()..*/.void sql
8210: 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64  ite3VdbeLeave(Vd
8220: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
8230: 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b  .  yDbMask mask;
8240: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
8250: 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74    Db *aDb;.  int
8260: 20 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c   nDb;.  if( p->l
8270: 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74  ockMask==0 ) ret
8280: 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  urn;  /* The com
8290: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62  mon case */.  db
82a0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20   = p->db;.  aDb 
82b0: 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62  = db->aDb;.  nDb
82c0: 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f   = db->nDb;.  fo
82d0: 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69  r(i=0, mask=1; i
82e0: 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20  <nDb; i++, mask 
82f0: 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66  += mask){.    if
8300: 28 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20  ( i!=1 && (mask 
8310: 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d  & p->lockMask)!=
8320: 30 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  0 && ALWAYS(aDb[
8330: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
8340: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
8350: 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74  Leave(aDb[i].pBt
8360: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
8370: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
8380: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
8390: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
83a0: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
83b0: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
83c0: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
83d0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
83e0: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
83f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8400: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
8410: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
8420: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
8430: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50   *zP4;.  char zP
8440: 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a  tr[50];.  char z
8450: 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74  Com[100];.  stat
8460: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
8470: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25  Format1 = "%4d %
8480: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64  -13s %4d %4d %4d
8490: 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e   %-13s %.2X %s\n
84a0: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
84b0: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
84c0: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
84d0: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
84e0: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69  izeof(zPtr));.#i
84f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8500: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
8510: 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d  NTS.  displayCom
8520: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a  ment(pOp, zP4, z
8530: 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d  Com, sizeof(zCom
8540: 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d  ));.#else.  zCom
8550: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
8560: 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71    /* NB:  The sq
8570: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
8580: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  ) function is im
8590: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64  plemented by cod
85a0: 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62  e created.  ** b
85b0: 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  y the mkopcodeh.
85c0: 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65  awk and mkopcode
85d0: 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68  c.awk scripts wh
85e0: 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a  ich extract the.
85f0: 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
8600: 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63   from the vdbe.c
8610: 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a   source text */.
8620: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
8630: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
8640: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
8650: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
8660: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
8670: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
8680: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20  zP4, pOp->p5,.  
8690: 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20      zCom.  );.  
86a0: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
86b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
86c0: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
86d0: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
86e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
86f0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
8700: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
8710: 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a    if( p && N ){.
8720: 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20      Mem *pEnd;. 
8730: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
8740: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d   p->db;.    u8 m
8750: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64  alloc_failed = d
8760: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
8770: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42  .    if( db->pnB
8780: 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20  ytesFreed ){.   
8790: 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e     for(pEnd=&p[N
87a0: 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b  ]; p<pEnd; p++){
87b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
87c0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
87d0: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 0a  alloc);.      }.
87e0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
87f0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 45 6e 64    }.    for(pEnd
8800: 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20  =&p[N]; p<pEnd; 
8810: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  p++){.      asse
8820: 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e  rt( (&p[1])==pEn
8830: 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b  d || p[0].db==p[
8840: 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61  1].db );.      a
8850: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
8860: 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69  beCheckMemInvari
8870: 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20  ants(p) );..    
8880: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
8890: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c  is really an inl
88a0: 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ined version of 
88b0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
88c0: 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a  lease().      **
88d0: 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61   that takes adva
88e0: 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63  ntage of the fac
88f0: 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  t that the memor
8900: 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20  y cell value is 
8910: 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
8920: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65  set to NULL afte
8930: 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20  r releasing any 
8940: 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65  dynamic resource
8950: 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s..      **.    
8960: 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69    ** The justifi
8970: 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  cation for dupli
8980: 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74  cating code is t
8990: 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  hat according to
89a0: 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67   .      ** callg
89b0: 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65  rind, this cause
89c0: 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74  s a certain test
89d0: 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65   case to hit the
89e0: 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20   CPU 4.7 .      
89f0: 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20  ** percent less 
8a00: 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20  (x86 linux, gcc 
8a10: 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d  version 4.1.2, -
8a20: 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20  O6) than if .   
8a30: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d     ** sqlite3Mem
8a40: 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63  Release() were c
8a50: 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e  alled from here.
8a60: 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20   With -O2, this 
8a70: 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74  jumps.      ** t
8a80: 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54  o 6.6 percent. T
8a90: 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20  he test case is 
8aa0: 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72  inserting 1000 r
8ab0: 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ows into a table
8ac0: 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20   .      ** with 
8ad0: 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67  no indexes using
8ae0: 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72   a single prepar
8af0: 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  ed INSERT statem
8b00: 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20  ent, bind() .   
8b10: 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28     ** and reset(
8b20: 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67  ). Inserts are g
8b30: 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72  rouped into a tr
8b40: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
8b50: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
8b60: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
8b70: 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20  EM_Agg );.      
8b80: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
8b90: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a  gs & MEM_Dyn );.
8ba0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8bb0: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46  p->flags & MEM_F
8bc0: 72 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65  rame );.      te
8bd0: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
8be0: 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b   & MEM_RowSet );
8bf0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  .      if( p->fl
8c00: 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d  ags&(MEM_Agg|MEM
8c10: 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d  _Dyn|MEM_Frame|M
8c20: 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20  EM_RowSet) ){.  
8c30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8c40: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a  eMemRelease(p);.
8c50: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8c60: 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20  p->zMalloc ){.  
8c70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8c80: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
8c90: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  oc);.        p->
8ca0: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
8cb0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66     }..      p->f
8cc0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66  lags = MEM_Undef
8cd0: 69 6e 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ined;.    }.    
8ce0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8cf0: 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64   = malloc_failed
8d00: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
8d10: 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d  elete a VdbeFram
8d20: 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73  e object and its
8d30: 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46   contents. VdbeF
8d40: 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65  rame objects are
8d50: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
8d60: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
8d70: 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65  opcode in sqlite
8d80: 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a  3VdbeExec()..*/.
8d90: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8da0: 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65  FrameDelete(Vdbe
8db0: 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Frame *p){.  int
8dc0: 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20   i;.  Mem *aMem 
8dd0: 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  = VdbeFrameMem(p
8de0: 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  );.  VdbeCursor 
8df0: 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43  **apCsr = (VdbeC
8e00: 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70  ursor **)&aMem[p
8e10: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20  ->nChildMem];.  
8e20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
8e30: 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20  hildCsr; i++){. 
8e40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
8e50: 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61  eeCursor(p->v, a
8e60: 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pCsr[i]);.  }.  
8e70: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
8e80: 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d  aMem, p->nChildM
8e90: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  em);.  sqlite3Db
8ea0: 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70  Free(p->v->db, p
8eb0: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
8ec0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
8ed0: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
8ee0: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
8ef0: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
8f00: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
8f10: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
8f20: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
8f30: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
8f40: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
8f50: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
8f60: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
8f70: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
8f80: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
8f90: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
8fa0: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
8fb0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
8fc0: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a   "EXPLAIN"..**.*
8fd0: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
8fe0: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72  n==1, each instr
8ff0: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  uction is listed
9000: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78  .  When.** p->ex
9010: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f  plain==2, only O
9020: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
9030: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65  ctions are liste
9040: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61  d and these.** a
9050: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69  re shown in a di
9060: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20  fferent format. 
9070: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69   p->explain==2 i
9080: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
9090: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51  ent.** EXPLAIN Q
90a0: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a  UERY PLAN..**.**
90b0: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
90c0: 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d  ==1, first the m
90d0: 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  ain program is l
90e0: 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68  isted, then each
90f0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67   of.** the trigg
9100: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
9110: 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79  re listed one by
9120: 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   one..*/.int sql
9130: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
9140: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
9150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9160: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e   VDBE */.){.  in
9170: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
9180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9190: 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20     /* Stop when 
91a0: 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65  row count reache
91b0: 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20  s this */.  int 
91c0: 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  nSub = 0;       
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75   /* Number of su
91f0: 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20  b-vdbes seen so 
9200: 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67  far */.  SubProg
9210: 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b  ram **apSub = 0;
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9230: 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64   Array of sub-vd
9240: 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53  bes */.  Mem *pS
9250: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9270: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c   Memory cell hol
9280: 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  d array of subpr
9290: 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ogs */.  sqlite3
92a0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20   *db = p->db;   
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
92c0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
92d0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
92e0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9300: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
9310: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
9320: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
9330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9340: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
9350: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
9360: 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20  >aMem[1];       
9370: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
9380: 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74  em of result set
9390: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
93a0: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61  ->explain );.  a
93b0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
93c0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
93d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
93e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
93f0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42   p->rc==SQLITE_B
9400: 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  USY || p->rc==SQ
9410: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20  LITE_NOMEM );.. 
9420: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
9430: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  this opcode does
9440: 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63   not use dynamic
9450: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a   strings for.  *
9460: 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65  * the result, re
9470: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79  sult columns may
9480: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
9490: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
94a0: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
94b0: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
94c0: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
94d0: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
94e0: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
94f0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
9500: 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e  (pMem, 8);.  p->
9510: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
9520: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
9530: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
9540: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
9550: 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  s if a malloc() 
9560: 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f  inside a call to
9570: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9580: 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a  text() or.    **
9590: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
95a0: 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e  text16() failed.
95b0: 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c    */.    db->mal
95c0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
95d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
95e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
95f0: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
9600: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
9610: 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74   reaches nRow, t
9620: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20  hat means the.  
9630: 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66  ** listing has f
9640: 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69  inished and sqli
9650: 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c  te3_step() shoul
9660: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
9670: 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20  DONE..  ** nRow 
9680: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
9690: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
96a0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   in the main pro
96b0: 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20  gram, plus.  ** 
96c0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
96d0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
96e0: 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62   all trigger sub
96f0: 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74  programs encount
9700: 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72  ered.  ** so far
9710: 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75  .  The nRow valu
9720: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
9730: 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73  as new trigger s
9740: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20  ubprograms are. 
9750: 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   ** encountered,
9760: 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20   but p->pc will 
9770: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68  eventually catch
9780: 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a   up to nRow..  *
9790: 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f  /.  nRow = p->nO
97a0: 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  p;.  if( p->expl
97b0: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  ain==1 ){.    /*
97c0: 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d   The first 8 mem
97d0: 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73  ory cells are us
97e0: 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ed for the resul
97f0: 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69  t set.  So we wi
9800: 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  ll.    ** comman
9810: 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c  deer the 9th cel
9820: 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72  l to use as stor
9830: 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79  age for an array
9840: 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20   of pointers.   
9850: 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73   ** to trigger s
9860: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65  ubprograms.  The
9870: 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74   VDBE is guarant
9880: 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c  eed to have at l
9890: 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65  east 9.    ** ce
98a0: 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  lls.  */.    ass
98b0: 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29  ert( p->nMem>9 )
98c0: 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d  ;.    pSub = &p-
98d0: 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66  >aMem[9];.    if
98e0: 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45  ( pSub->flags&ME
98f0: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
9900: 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  /* On the first 
9910: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
9920: 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c  step(), pSub wil
9930: 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20  l hold a NULL.  
9940: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  It is.      ** i
9950: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
9960: 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53  BLOB by the P4_S
9970: 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73  UBPROGRAM proces
9980: 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77  sing logic below
9990: 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d   */.      nSub =
99a0: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28   pSub->n/sizeof(
99b0: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70  Vdbe*);.      ap
99c0: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
99d0: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
99e0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
99f0: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20   i<nSub; i++){. 
9a00: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53       nRow += apS
9a10: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[i]->nOp;.    
9a20: 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  }.  }..  do{.   
9a30: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
9a40: 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26  }while( i<nRow &
9a50: 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  & p->explain==2 
9a60: 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  && p->aOp[i].opc
9a70: 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20  ode!=OP_Explain 
9a80: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77  );.  if( i>=nRow
9a90: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
9aa0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
9ab0: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
9ac0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
9ad0: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
9ae0: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
9af0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
9b00: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
9b10: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
9b20: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
9b30: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
9b40: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
9b50: 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d  Str(p->rc));.  }
9b60: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
9b70: 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  zP4;.    Op *pOp
9b80: 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e  ;.    if( i<p->n
9b90: 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  Op ){.      /* T
9ba0: 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e  he output line n
9bb0: 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65  umber is small e
9bc0: 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72  nough that we ar
9bd0: 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20  e still in the. 
9be0: 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f       ** main pro
9bf0: 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70  gram. */.      p
9c00: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
9c10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9c20: 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72    /* We are curr
9c30: 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75  ently listing su
9c40: 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75  bprograms.  Figu
9c50: 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65  re out which one
9c60: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69   and.      ** pi
9c70: 63 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70  ck up the approp
9c80: 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f  riate opcode. */
9c90: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
9ca0: 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b      i -= p->nOp;
9cb0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
9cc0: 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  i>=apSub[j]->nOp
9cd0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
9ce0: 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e  i -= apSub[j]->n
9cf0: 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Op;.      }.    
9d00: 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a    pOp = &apSub[j
9d10: 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  ]->aOp[i];.    }
9d20: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
9d30: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
9d40: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
9d50: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
9d60: 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20  m->u.i = i;     
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
9d90: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f  ogram counter */
9da0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
9db0: 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   .      pMem->fl
9dc0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63  ags = MEM_Static
9dd0: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
9de0: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  m;.      pMem->z
9df0: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
9e00: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
9e10: 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63  >opcode); /* Opc
9e20: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ode */.      ass
9e30: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
9e40: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  );.      pMem->n
9e50: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
9e60: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
9e70: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
9e80: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
9e90: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20    pMem++;..     
9ea0: 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50   /* When an OP_P
9eb0: 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73  rogram opcode is
9ec0: 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20   encounter (the 
9ed0: 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74  only opcode that
9ee0: 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20   has.      ** a 
9ef0: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72  P4_SUBPROGRAM ar
9f00: 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20  gument), expand 
9f10: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
9f20: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  array of subprog
9f30: 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65  rams.      ** ke
9f40: 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d  pt in p->aMem[9]
9f50: 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  .z to hold the n
9f60: 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73  ew program - ass
9f70: 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72  uming this subpr
9f80: 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68  ogram.      ** h
9f90: 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
9fa0: 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20  een seen..      
9fb0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  */.      if( pOp
9fc0: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
9fd0: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
9fe0: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
9ff0: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
a000: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
a010: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
a020: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
a030: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
a040: 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a       if( apSub[j
a050: 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67  ]==pOp->p4.pProg
a060: 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ram ) break;.   
a070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
a080: 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51  f( j==nSub && SQ
a090: 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33  LITE_OK==sqlite3
a0a0: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62  VdbeMemGrow(pSub
a0b0: 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30  , nByte, nSub!=0
a0c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
a0d0: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
a0e0: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
a0f0: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e           apSub[n
a100: 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34  Sub++] = pOp->p4
a110: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
a120: 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73       pSub->flags
a130: 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20   |= MEM_Blob;.  
a140: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20          pSub->n 
a150: 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75  = nSub*sizeof(Su
a160: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
a170: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a180: 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66    }..    pMem->f
a190: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
a1a0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
a1b0: 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20  pOp->p1;        
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1d0: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70    /* P1 */.    p
a1e0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
a1f0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
a200: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
a210: 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20   = pOp->p2;     
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a230: 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20       /* P2 */.  
a240: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
a250: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
a260: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
a270: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20  u.i = pOp->p3;  
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a290: 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f          /* P3 */
a2a0: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
a2b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
a2c0: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33  eMemGrow(pMem, 3
a2d0: 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20 20  2, 0) ){        
a2e0: 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20      /* P4 */.   
a2f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
a300: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
a310: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
a320: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
a330: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61   }.    pMem->fla
a340: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
a350: 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d  _Term;.    zP4 =
a360: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
a370: 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20  pMem->z, 32);.  
a380: 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d    if( zP4!=pMem-
a390: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
a3a0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
a3b0: 28 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20  (pMem, zP4, -1, 
a3c0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b  SQLITE_UTF8, 0);
a3d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a3e0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
a3f0: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
a400: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
a410: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
a420: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
a430: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
a440: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b  .    }.    pMem+
a450: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  +;..    if( p->e
a460: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
a470: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
a480: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20  beMemGrow(pMem, 
a490: 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  4, 0) ){.       
a4a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
a4b0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
a4c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
a4d0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
a4e0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
a4f0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
a500: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
a510: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20   pMem->n = 2;.  
a520: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
a530: 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c  intf(3, pMem->z,
a540: 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35   "%.2x", pOp->p5
a550: 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20  );   /* P5 */.  
a560: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
a570: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
a580: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69     pMem++;.  .#i
a590: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
a5a0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
a5b0: 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 73 71  NTS.      if( sq
a5c0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
a5d0: 28 70 4d 65 6d 2c 20 35 30 30 2c 20 30 29 20 29  (pMem, 500, 0) )
a5e0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
a5f0: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
a600: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
a610: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
a620: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
a630: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
a640: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
a650: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
a660: 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  n = displayComme
a670: 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65  nt(pOp, zP4, pMe
a680: 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20  m->z, 500);.    
a690: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
a6a0: 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65  LITE_UTF8;.#else
a6b0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
a6c0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20  gs = MEM_Null;  
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6e0: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20       /* Comment 
a6f0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  */.#endif.    }.
a700: 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  .    p->nResColu
a710: 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65  mn = 8 - 4*(p->e
a720: 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70  xplain-1);.    p
a730: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26  ->pResultSet = &
a740: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20  p->aMem[1];.    
a750: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
a760: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
a770: 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65  TE_ROW;.  }.  re
a780: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
a790: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
a7a0: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66  _EXPLAIN */..#if
a7b0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a7c0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
a7d0: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
a7e0: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
a7f0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
a800: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
a810: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
a820: 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *p){.  const cha
a830: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  r *z = 0;.  if( 
a840: 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a  p->zSql ){.    z
a850: 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65   = p->zSql;.  }e
a860: 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d  lse if( p->nOp>=
a870: 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56  1 ){.    const V
a880: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
a890: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28  >aOp[0];.    if(
a8a0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
a8b0: 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34  _Init && pOp->p4
a8c0: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  .z!=0 ){.      z
a8d0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
a8e0: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
a8f0: 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20  e3Isspace(*z) ) 
a900: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  z++;.    }.  }. 
a910: 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28   if( z ) printf(
a920: 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  "SQL: [%s]\n", z
a930: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
a940: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
a950: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
a960: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
a970: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f  NABLE_IOTRACE)./
a980: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f  *.** Print an IO
a990: 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68  TRACE message sh
a9a0: 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e  owing SQL conten
a9b0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
a9c0: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
a9d0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
a9e0: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
a9f0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
aa00: 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61  if( sqlite3IoTra
aa10: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
aa20: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
aa30: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
aa40: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20  ->aOp[0];.  if( 
aa50: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
aa60: 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e  Init && pOp->p4.
aa70: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  z!=0 ){.    int 
aa80: 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a  i, j;.    char z
aa90: 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69  [1000];.    sqli
aaa0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
aab0: 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c  eof(z), z, "%s",
aac0: 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20   pOp->p4.z);.   
aad0: 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65   for(i=0; sqlite
aae0: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20  3Isspace(z[i]); 
aaf0: 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a  i++){}.    for(j
ab00: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
ab10: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
ab20: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29  3Isspace(z[i]) )
ab30: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
ab40: 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20  i-1]!=' ' ){.   
ab50: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
ab60: 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ' ';.        }. 
ab70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ab80: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
ab90: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
aba0: 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20  .    z[j] = 0;. 
abb0: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
abc0: 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29  e("SQL %s\n", z)
abd0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
abe0: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  * !SQLITE_OMIT_T
abf0: 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45  RACE && SQLITE_E
ac00: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f  NABLE_IOTRACE */
ac10: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
ac20: 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69   space from a fi
ac30: 78 65 64 20 73 69 7a 65 20 62 75 66 66 65 72 20  xed size buffer 
ac40: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
ac50: 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20  nter to.** that 
ac60: 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66  space.  If insuf
ac70: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 73  ficient space is
ac80: 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75   available, retu
ac90: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
aca0: 68 65 20 70 42 75 66 20 70 61 72 61 6d 65 74 65  he pBuf paramete
acb0: 72 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  r is the initial
acc0: 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e   value of a poin
acd0: 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a  ter which will.*
ace0: 2a 20 72 65 63 65 69 76 65 20 74 68 65 20 6e 65  * receive the ne
acf0: 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20  w memory.  pBuf 
ad00: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c  is normally NULL
ad10: 2e 20 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f  .  If pBuf is no
ad20: 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65  t.** NULL, it me
ad30: 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  ans that memory 
ad40: 73 70 61 63 65 20 68 61 73 20 61 6c 72 65 61 64  space has alread
ad50: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
ad60: 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69   and that.** thi
ad70: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
ad80: 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e   not allocate an
ad90: 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57  y new memory.  W
ada0: 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a  hen pBuf is not.
adb0: 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72  ** NULL simply r
adc0: 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c  eturn pBuf.  Onl
add0: 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d  y allocate new m
ade0: 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e  emory space when
adf0: 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c   pBuf.** is NULL
ae00: 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73  ..**.** nByte is
ae10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
ae20: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65  ytes of space ne
ae30: 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46  eded..**.** *ppF
ae40: 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 76  rom points to av
ae50: 61 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e  ailable space an
ae60: 64 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f  d pEnd points to
ae70: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
ae80: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61  ** available spa
ae90: 63 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65 20  ce.  When space 
aea0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70  is allocated, *p
aeb0: 70 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 65  pFrom is advance
aec0: 64 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e  d past.** the en
aed0: 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  d of the allocat
aee0: 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  ed space..**.** 
aef0: 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75  *pnByte is a cou
af00: 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62  nter of the numb
af10: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
af20: 70 61 63 65 20 74 68 61 74 20 68 61 76 65 20 66  pace that have f
af30: 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f  ailed.** to allo
af40: 63 61 74 65 2e 20 20 49 66 20 74 68 65 72 65 20  cate.  If there 
af50: 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20  is insufficient 
af60: 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d  space in *ppFrom
af70: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a   to satisfy the.
af80: 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e  ** request, then
af90: 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79   increment *pnBy
afa0: 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74  te by the amount
afb0: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 2e   of the request.
afc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
afd0: 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76  *allocSpace(.  v
afe0: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
aff0: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74      /* Where ret
b000: 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c  urn pointer will
b010: 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20   be stored */.  
b020: 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
b030: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b040: 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  f bytes to alloc
b050: 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70  ate */.  u8 **pp
b060: 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a  From,         /*
b070: 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74   IN/OUT: Allocat
b080: 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a  e from *ppFrom *
b090: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20  /.  u8 *pEnd,   
b0a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
b0b0: 74 65 72 20 74 6f 20 31 20 62 79 74 65 20 70 61  ter to 1 byte pa
b0c0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70  st the end of *p
b0d0: 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a  pFrom buffer */.
b0e0: 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 20    int *pnByte   
b0f0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
b100: 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ocation cannot b
b110: 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e  e made, incremen
b120: 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a  t *pnByte */.){.
b130: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
b140: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a  BYTE_ALIGNMENT(*
b150: 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28  ppFrom) );.  if(
b160: 20 70 42 75 66 20 29 20 72 65 74 75 72 6e 20 70   pBuf ) return p
b170: 42 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52  Buf;.  nByte = R
b180: 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20  OUND8(nByte);.  
b190: 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e  if( &(*ppFrom)[n
b1a0: 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b  Byte] <= pEnd ){
b1b0: 0a 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69  .    pBuf = (voi
b1c0: 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20  d*)*ppFrom;.    
b1d0: 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65  *ppFrom += nByte
b1e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
b1f0: 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b  pnByte += nByte;
b200: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42  .  }.  return pB
b210: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77  uf;.}../*.** Rew
b220: 69 6e 64 20 74 68 65 20 56 44 42 45 20 62 61 63  ind the VDBE bac
b230: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
b240: 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  ng in preparatio
b250: 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67  n for.** running
b260: 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c   it..*/.void sql
b270: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 56  ite3VdbeRewind(V
b280: 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66  dbe *p){.#if def
b290: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
b2a0: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44  G) || defined(VD
b2b0: 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e  BE_PROFILE).  in
b2c0: 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  t i;.#endif.  as
b2d0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
b2e0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
b2f0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
b300: 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65  T );..  /* There
b310: 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65   should be at le
b320: 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a  ast one opcode..
b330: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
b340: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ->nOp>0 );..  /*
b350: 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74   Set the magic t
b360: 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  o VDBE_MAGIC_RUN
b370: 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
b380: 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20  han later. */.  
b390: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
b3a0: 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64  MAGIC_RUN;..#ifd
b3b0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b3c0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e    for(i=1; i<p->
b3d0: 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nMem; i++){.    
b3e0: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
b3f0: 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a  i].db==p->db );.
b400: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
b410: 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63  pc = -1;.  p->rc
b420: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
b430: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
b440: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e   OE_Abort;.  p->
b450: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
b460: 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68  IC_RUN;.  p->nCh
b470: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  ange = 0;.  p->c
b480: 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70  acheCtr = 1;.  p
b490: 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f  ->minWriteFileFo
b4a0: 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d  rmat = 255;.  p-
b4b0: 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >iStatement = 0;
b4c0: 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  .  p->nFkConstra
b4d0: 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  int = 0;.#ifdef 
b4e0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66  VDBE_PROFILE.  f
b4f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
b500: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61  ; i++){.    p->a
b510: 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20  Op[i].cnt = 0;. 
b520: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
b530: 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  les = 0;.  }.#en
b540: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  dif.}../*.** Pre
b550: 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  pare a virtual m
b560: 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75  achine for execu
b570: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72  tion for the fir
b580: 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a  st time after.**
b590: 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 76 69   creating the vi
b5a0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20  rtual machine.  
b5b0: 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68  This involves th
b5c0: 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20  ings such.** as 
b5d0: 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b  allocating stack
b5e0: 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69   space and initi
b5f0: 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67  alizing the prog
b600: 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20  ram counter..** 
b610: 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68  After the VDBE h
b620: 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69  as be prepped, i
b630: 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65  t can be execute
b640: 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d by one or more
b650: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
b660: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
b670: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e   .**.** This fun
b680: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
b690: 6c 65 64 20 65 78 61 63 74 20 6f 6e 63 65 20 6f  led exact once o
b6a0: 6e 20 61 20 65 61 63 68 20 76 69 72 74 75 61 6c  n a each virtual
b6b0: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74   machine..** Aft
b6c0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
b6d0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d  is called the VM
b6e0: 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61   has been "packa
b6f0: 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64  ged" and is read
b700: 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66  y.** to run.  Af
b710: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
b720: 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 74 68   is called, futh
b730: 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20  er calls to .** 
b740: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b750: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  () functions are
b760: 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68   prohibited.  Th
b770: 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f  is routine disco
b780: 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64  nnects.** the Vd
b790: 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73  be from the Pars
b7a0: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65  e object that he
b7b0: 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69 74  lped generate it
b7c0: 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20   so that the.** 
b7d0: 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73  the Vdbe becomes
b7e0: 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20   an independent 
b7f0: 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20 50  entity and the P
b800: 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20  arse object can 
b810: 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e  be.** destroyed.
b820: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
b830: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
b840: 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20  () procedure to 
b850: 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75 61  restore a virtua
b860: 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a  l machine back.*
b870: 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c  * to its initial
b880: 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74 20   state after it 
b890: 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f  has been run..*/
b8a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
b8b0: 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64  eMakeReady(.  Vd
b8c0: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b8e0: 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61  The VDBE */.  Pa
b8f0: 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20 20  rse *pParse     
b900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b910: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
b920: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
b930: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
b940: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
b950: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
b960: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b  n */.  int nVar;
b970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b980: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b990: 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  of parameters */
b9a0: 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20  .  int nMem;    
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56    /* Number of V
b9d0: 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  M memory registe
b9e0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72  rs */.  int nCur
b9f0: 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  sor;            
ba00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ba10: 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71 75   of cursors requ
ba20: 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  ired */.  int nA
ba30: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
ba40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ba50: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
ba60: 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a  in subprograms *
ba70: 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20  /.  int nOnce;  
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
baa0: 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74  OP_Once instruct
bab0: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ions */.  int n;
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
bae0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
baf0: 20 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20 20   *zCsr;         
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bb10: 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65  Memory available
bb20: 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   for allocation 
bb30: 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20  */.  u8 *zEnd;  
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb50: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
bb60: 65 20 70 61 73 74 20 61 6c 6c 6f 63 61 74 65 64  e past allocated
bb70: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
bb80: 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
bba0: 6f 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d 65  ow much extra me
bbb0: 6d 6f 72 79 20 69 73 20 6e 65 65 64 65 64 20 2a  mory is needed *
bbc0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  /..  assert( p!=
bbd0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
bbe0: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ->nOp>0 );.  ass
bbf0: 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
bc00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
bc10: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
bc20: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
bc30: 74 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50  t( pParse==p->pP
bc40: 61 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70  arse );.  db = p
bc50: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
bc60: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
bc70: 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20  ==0 );.  nVar = 
bc80: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20  pParse->nVar;.  
bc90: 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nMem = pParse->n
bca0: 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d  Mem;.  nCursor =
bcb0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
bcc0: 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e   nArg = pParse->
bcd0: 6e 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65  nMaxArg;.  nOnce
bce0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65   = pParse->nOnce
bcf0: 3b 0a 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30  ;.  if( nOnce==0
bd00: 20 29 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a   ) nOnce = 1; /*
bd10: 20 45 6e 73 75 72 65 20 61 74 20 6c 65 61 73 74   Ensure at least
bd20: 20 6f 6e 65 20 62 79 74 65 20 69 6e 20 70 2d 3e   one byte in p->
bd30: 61 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20  aOnceFlag[] */. 
bd40: 20 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20   .  /* For each 
bd50: 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c  cursor required,
bd60: 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61   also allocate a
bd70: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65   memory cell. Me
bd80: 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  mory.  ** cells 
bd90: 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29  (nMem+1-nCursor)
bda0: 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76  ..nMem, inclusiv
bdb0: 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  e, will never be
bdc0: 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68   used by.  ** th
bdd0: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20  e vdbe program. 
bde0: 49 6e 73 74 65 61 64 20 74 68 65 79 20 61 72 65  Instead they are
bdf0: 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
be00: 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a  e space for.  **
be10: 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75   VdbeCursor/BtCu
be20: 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e  rsor structures.
be30: 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   The blob of mem
be40: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
be50: 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72  ith .  ** cursor
be60: 20 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   0 is stored in 
be70: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d  memory cell nMem
be80: 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e  . Memory cell (n
be90: 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72  Mem-1).  ** stor
bea0: 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d  es the blob of m
beb0: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
bec0: 20 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20   with cursor 1, 
bed0: 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  etc..  **.  ** S
bee0: 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74  ee also: allocat
bef0: 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a  eCursor()..  */.
bf00: 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f    nMem += nCurso
bf10: 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  r;..  /* Allocat
bf20: 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f  e space for memo
bf30: 72 79 20 72 65 67 69 73 74 65 72 73 2c 20 53 51  ry registers, SQ
bf40: 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42  L variables, VDB
bf50: 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20  E cursors and . 
bf60: 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20   ** an array to 
bf70: 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63  marshal SQL func
bf80: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69  tion arguments i
bf90: 6e 2e 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20 3d  n..  */.  zCsr =
bfa0: 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d   (u8*)&p->aOp[p-
bfb0: 3e 6e 4f 70 5d 3b 20 20 20 20 20 20 20 20 20 20  >nOp];          
bfc0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 6c    /* Memory aval
bfd0: 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61  iable for alloca
bfe0: 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20 3d  tion */.  zEnd =
bff0: 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 50   (u8*)&p->aOp[pP
c000: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b  arse->nOpAlloc];
c010: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
c020: 70 61 73 74 20 65 6e 64 20 6f 66 20 7a 43 73 72  past end of zCsr
c030: 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65  [] */..  resolve
c040: 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72  P2Values(p, &nAr
c050: 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d  g);.  p->usesStm
c060: 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28  tJournal = (u8)(
c070: 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57  pParse->isMultiW
c080: 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e  rite && pParse->
c090: 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28  mayAbort);.  if(
c0a0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
c0b0: 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20   && nMem<10 ){. 
c0c0: 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20     nMem = 10;.  
c0d0: 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c  }.  memset(zCsr,
c0e0: 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a   0, zEnd-zCsr);.
c0f0: 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20    zCsr += (zCsr 
c100: 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 61  - (u8*)0)&7;.  a
c110: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
c120: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72  E_ALIGNMENT(zCsr
c130: 29 20 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65  ) );.  p->expire
c140: 64 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e 65 78 70  d = 0;..  p->exp
c150: 69 72 65 64 20 3d 20 30 3b 0a 20 20 0a 20 20 2f  ired = 0;.  .  /
c160: 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67  * Memory for reg
c170: 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65  isters, paramete
c180: 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c  rs, cursor, etc,
c190: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e   is allocated in
c1a0: 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73   two.  ** passes
c1b0: 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  .  On the first 
c1c0: 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20  pass, we try to 
c1d0: 72 65 75 73 65 20 75 6e 75 73 65 64 20 73 70 61  reuse unused spa
c1e0: 63 65 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20  ce at the .  ** 
c1f0: 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  end of the opcod
c200: 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65 20  e array.  If we 
c210: 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61  are unable to sa
c220: 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79  tisfy all memory
c230: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e  .  ** requiremen
c240: 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74 68  ts by reusing th
c250: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74  e opcode array t
c260: 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65  ail, then the se
c270: 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77  cond.  ** pass w
c280: 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ill fill in the 
c290: 72 65 73 74 20 75 73 69 6e 67 20 61 20 66 72 65  rest using a fre
c2a0: 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  sh allocation.  
c2b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
c2c0: 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63  two-pass approac
c2d0: 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73  h that reuses as
c2e0: 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
c2f0: 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20  possible from.  
c300: 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20  ** the leftover 
c310: 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
c320: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
c330: 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66 69  rray can signifi
c340: 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75  cantly.  ** redu
c350: 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ce the amount of
c360: 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
c370: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
c380: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20  ment..  */.  do 
c390: 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 30 3b  {.    nByte = 0;
c3a0: 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61  .    p->aMem = a
c3b0: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d 65  llocSpace(p->aMe
c3c0: 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d  m, nMem*sizeof(M
c3d0: 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  em), &zCsr, zEnd
c3e0: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
c3f0: 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70  ->aVar = allocSp
c400: 61 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61  ace(p->aVar, nVa
c410: 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26  r*sizeof(Mem), &
c420: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
c430: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72  te);.    p->apAr
c440: 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  g = allocSpace(p
c450: 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69  ->apArg, nArg*si
c460: 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73  zeof(Mem*), &zCs
c470: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
c480: 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d  ;.    p->azVar =
c490: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
c4a0: 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f  zVar, nVar*sizeo
c4b0: 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c  f(char*), &zCsr,
c4c0: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
c4d0: 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61      p->apCsr = a
c4e0: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 43  llocSpace(p->apC
c4f0: 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65  sr, nCursor*size
c500: 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 2c  of(VdbeCursor*),
c510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c520: 20 20 20 20 20 20 20 20 20 20 20 26 7a 43 73 72             &zCsr
c530: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
c540: 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  .    p->aOnceFla
c550: 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  g = allocSpace(p
c560: 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e  ->aOnceFlag, nOn
c570: 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  ce, &zCsr, zEnd,
c580: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66   &nByte);.    if
c590: 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  ( nByte ){.     
c5a0: 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69   p->pFree = sqli
c5b0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
c5c0: 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
c5d0: 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e  }.    zCsr = p->
c5e0: 70 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20  pFree;.    zEnd 
c5f0: 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a  = &zCsr[nByte];.
c600: 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20    }while( nByte 
c610: 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
c620: 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43  iled );..  p->nC
c630: 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b  ursor = nCursor;
c640: 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20  .  p->nOnceFlag 
c650: 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70  = nOnce;.  if( p
c660: 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70 2d  ->aVar ){.    p-
c670: 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e  >nVar = (ynVar)n
c680: 56 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30  Var;.    for(n=0
c690: 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a  ; n<nVar; n++){.
c6a0: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
c6b0: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
c6c0: 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72  l;.      p->aVar
c6d0: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
c6e0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
c6f0: 61 7a 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e  azVar ){.    p->
c700: 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e  nzVar = pParse->
c710: 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70  nzVar;.    memcp
c720: 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72  y(p->azVar, pPar
c730: 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a  se->azVar, p->nz
c740: 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a  Var*sizeof(p->az
c750: 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65  Var[0]));.    me
c760: 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a 56  mset(pParse->azV
c770: 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e  ar, 0, pParse->n
c780: 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61 72  zVar*sizeof(pPar
c790: 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a  se->azVar[0]));.
c7a0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65    }.  if( p->aMe
c7b0: 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  m ){.    p->aMem
c7c0: 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  --;             
c7d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d           /* aMem
c7e0: 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e  [] goes from 1..
c7f0: 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e  nMem */.    p->n
c800: 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20  Mem = nMem;     
c810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
c820: 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e       not from 0.
c830: 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66  .nMem-1 */.    f
c840: 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b  or(n=1; n<=nMem;
c850: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   n++){.      p->
c860: 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aMem[n].flags = 
c870: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
c880: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
c890: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20  db = db;.    }. 
c8a0: 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20   }.  p->explain 
c8b0: 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  = pParse->explai
c8c0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
c8d0: 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a  Rewind(p);.}../*
c8e0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45  .** Close a VDBE
c8f0: 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65   cursor and rele
c900: 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f  ase all the reso
c910: 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f  urces that curso
c920: 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f  r .** happens to
c930: 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   hold..*/.void s
c940: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
c950: 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64  rsor(Vdbe *p, Vd
c960: 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  beCursor *pCx){.
c970: 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
c980: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
c990: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72    sqlite3VdbeSor
c9a0: 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20  terClose(p->db, 
c9b0: 70 43 78 29 3b 0a 20 20 69 66 28 20 70 43 78 2d  pCx);.  if( pCx-
c9c0: 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  >pBt ){.    sqli
c9d0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43  te3BtreeClose(pC
c9e0: 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20  x->pBt);.    /* 
c9f0: 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  The pCx->pCursor
ca00: 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61   will be close a
ca10: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66  utomatically, if
ca20: 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20   it exists, by. 
ca30: 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61     ** the call a
ca40: 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65  bove. */.  }else
ca50: 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f   if( pCx->pCurso
ca60: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
ca70: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
ca80: 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a  (pCx->pCursor);.
ca90: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
caa0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
cab0: 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e  ABLE.  if( pCx->
cac0: 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20  pVtabCursor ){. 
cad0: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f     sqlite3_vtab_
cae0: 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
caf0: 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62  sor = pCx->pVtab
cb00: 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73  Cursor;.    cons
cb10: 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
cb20: 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61   *pModule = pVta
cb30: 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e  bCursor->pVtab->
cb40: 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e  pModule;.    p->
cb50: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31  inVtabMethod = 1
cb60: 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  ;.    pModule->x
cb70: 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f  Close(pVtabCurso
cb80: 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  r);.    p->inVta
cb90: 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d  bMethod = 0;.  }
cba0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
cbb0: 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73   Copy the values
cbc0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
cbd0: 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75  dbeFrame structu
cbe0: 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20  re to its Vdbe. 
cbf0: 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c  This.** is used,
cc00: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
cc10: 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62  en a trigger sub
cc20: 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74  -program is halt
cc30: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a  ed to restore.**
cc40: 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20   control to the 
cc50: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  main program..*/
cc60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
cc70: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62  FrameRestore(Vdb
cc80: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  eFrame *pFrame){
cc90: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72  .  Vdbe *v = pFr
cca0: 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 6e  ame->v;.  v->aOn
ccb0: 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d  ceFlag = pFrame-
ccc0: 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d  >aOnceFlag;.  v-
ccd0: 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72  >nOnceFlag = pFr
cce0: 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a  ame->nOnceFlag;.
ccf0: 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d    v->aOp = pFram
cd00: 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70  e->aOp;.  v->nOp
cd10: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a   = pFrame->nOp;.
cd20: 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61    v->aMem = pFra
cd30: 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e  me->aMem;.  v->n
cd40: 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d  Mem = pFrame->nM
cd50: 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d  em;.  v->apCsr =
cd60: 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a   pFrame->apCsr;.
cd70: 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70    v->nCursor = p
cd80: 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a  Frame->nCursor;.
cd90: 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77    v->db->lastRow
cda0: 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73  id = pFrame->las
cdb0: 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68  tRowid;.  v->nCh
cdc0: 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  ange = pFrame->n
cdd0: 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e  Change;.  return
cde0: 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a   pFrame->pc;.}..
cdf0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
ce00: 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41  cursors..**.** A
ce10: 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20  lso release any 
ce20: 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68  dynamic memory h
ce30: 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e  eld by the VM in
ce40: 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d   the Vdbe.aMem m
ce50: 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61  emory .** cell a
ce60: 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65  rray. This is ne
ce70: 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d  cessary as the m
ce80: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79  emory cell array
ce90: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   may contain.** 
cea0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65  pointers to Vdbe
ceb0: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77  Frame objects, w
cec0: 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e  hich may in turn
ced0: 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72   contain pointer
cee0: 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72  s to.** open cur
cef0: 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sors..*/.static 
cf00: 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72  void closeAllCur
cf10: 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20  sors(Vdbe *p){. 
cf20: 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29   if( p->pFrame )
cf30: 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20  {.    VdbeFrame 
cf40: 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72  *pFrame;.    for
cf50: 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d  (pFrame=p->pFram
cf60: 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  e; pFrame->pPare
cf70: 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d  nt; pFrame=pFram
cf80: 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  e->pParent);.   
cf90: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
cfa0: 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29  eRestore(pFrame)
cfb0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d  ;.  }.  p->pFram
cfc0: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61  e = 0;.  p->nFra
cfd0: 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  me = 0;..  if( p
cfe0: 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69  ->apCsr ){.    i
cff0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
d000: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
d010: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62   i++){.      Vdb
d020: 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d  eCursor *pC = p-
d030: 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20  >apCsr[i];.     
d040: 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20   if( pC ){.     
d050: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
d060: 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b  eeCursor(p, pC);
d070: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73  .        p->apCs
d080: 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
d090: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
d0a0: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
d0b0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
d0c0: 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d  (&p->aMem[1], p-
d0d0: 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68  >nMem);.  }.  wh
d0e0: 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d  ile( p->pDelFram
d0f0: 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
d100: 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44  me *pDel = p->pD
d110: 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e  elFrame;.    p->
d120: 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c  pDelFrame = pDel
d130: 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73  ->pParent;.    s
d140: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44  qlite3VdbeFrameD
d150: 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d  elete(pDel);.  }
d160: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e  ..  /* Delete an
d170: 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61  y auxdata alloca
d180: 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68  tions made by th
d190: 65 20 56 4d 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e VM */.  sqlite
d1a0: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
d1b0: 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  ta(p, -1, 0);.  
d1c0: 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44  assert( p->pAuxD
d1d0: 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ata==0 );.}../*.
d1e0: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20  ** Clean up the 
d1f0: 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 69  VM after executi
d200: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
d210: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f  outine will auto
d220: 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20  matically close 
d230: 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73  any cursors, lis
d240: 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f  ts, and/or.** so
d250: 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65 20  rters that were 
d260: 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61  left open.  It a
d270: 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20  lso deletes the 
d280: 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72  values of.** var
d290: 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56  iables in the aV
d2a0: 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  ar[] array..*/.s
d2b0: 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e  tatic void Clean
d2c0: 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  up(Vdbe *p){.  s
d2d0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
d2e0: 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  db;..#ifdef SQLI
d2f0: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78  TE_DEBUG.  /* Ex
d300: 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73  ecute assert() s
d310: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
d320: 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62  ure that the Vdb
d330: 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20  e.apCsr[] and . 
d340: 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20   ** Vdbe.aMem[] 
d350: 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65  arrays have alre
d360: 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64  ady been cleaned
d370: 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69   up.  */.  int i
d380: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72  ;.  if( p->apCsr
d390: 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d   ) for(i=0; i<p-
d3a0: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61  >nCursor; i++) a
d3b0: 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b  ssert( p->apCsr[
d3c0: 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  i]==0 );.  if( p
d3d0: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f  ->aMem ){.    fo
d3e0: 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65  r(i=1; i<=p->nMe
d3f0: 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  m; i++) assert( 
d400: 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73  p->aMem[i].flags
d410: 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20  ==MEM_Undefined 
d420: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
d430: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d440: 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
d450: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
d460: 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  ;.  p->pResultSe
d470: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
d480: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
d490: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
d4a0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
d4b0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53  turned by this S
d4c0: 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  QL.** statement.
d4d0: 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74   This is now set
d4e0: 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
d4f0: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75  , rather than du
d500: 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f  ring.** executio
d510: 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72  n of the vdbe pr
d520: 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71  ogram so that sq
d530: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
d540: 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63  nt() can.** be c
d550: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20  alled on an SQL 
d560: 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65  statement before
d570: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
d580: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d590: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56  VdbeSetNumCols(V
d5a0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73  dbe *p, int nRes
d5b0: 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a  Column){.  Mem *
d5c0: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  pColName;.  int 
d5d0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
d5e0: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c   = p->db;..  rel
d5f0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
d600: 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
d610: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
d620: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  N);.  sqlite3DbF
d630: 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e  ree(db, p->aColN
d640: 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73  ame);.  n = nRes
d650: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
d660: 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  ;.  p->nResColum
d670: 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c  n = (u16)nResCol
d680: 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  umn;.  p->aColNa
d690: 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  me = pColName = 
d6a0: 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d  (Mem*)sqlite3DbM
d6b0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
d6c0: 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20  zeof(Mem)*n );. 
d6d0: 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65   if( p->aColName
d6e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d6f0: 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29  while( n-- > 0 )
d700: 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  {.    pColName->
d710: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
d720: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  ;.    pColName->
d730: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
d740: 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a  pColName++;.  }.
d750: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
d760: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78   name of the idx
d770: 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  'th column to be
d780: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
d790: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
d7a0: 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65  ** zName must be
d7b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
d7c0: 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73  nul terminated s
d7d0: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tring..**.** Thi
d7e0: 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d  s call must be m
d7f0: 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ade after a call
d800: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53   to sqlite3VdbeS
d810: 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a  etNumCols()..**.
d820: 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72  ** The final par
d830: 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75  ameter, xDel, mu
d840: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c  st be one of SQL
d850: 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c  ITE_DYNAMIC, SQL
d860: 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72  ITE_STATIC.** or
d870: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
d880: 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49  T. If it is SQLI
d890: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  TE_DYNAMIC, then
d8a0: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
d8b0: 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61  ted.** to by zNa
d8c0: 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  me will be freed
d8d0: 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65   by sqlite3DbFre
d8e0: 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62  e() when the vdb
d8f0: 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a  e is destroyed..
d900: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
d910: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20  beSetColName(.  
d920: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d940: 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63   /* Vdbe being c
d950: 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69  onfigured */.  i
d960: 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20  nt idx,         
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
d990: 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73  mn zName applies
d9a0: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72   to */.  int var
d9b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
d9d0: 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f   of the COLNAME_
d9e0: 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20  * constants */. 
d9f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
da00: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
da10: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
da20: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
da30: 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64  g name */.  void
da40: 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20   (*xDel)(void*) 
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da60: 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e  Memory managemen
da70: 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a  t strategy for z
da80: 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Name */.){.  int
da90: 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c   rc;.  Mem *pCol
daa0: 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Name;.  assert( 
dab0: 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  idx<p->nResColum
dac0: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  n );.  assert( v
dad0: 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a  ar<COLNAME_N );.
dae0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
daf0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
db00: 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20   assert( !zName 
db10: 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f  || xDel!=SQLITE_
db20: 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72  DYNAMIC );.    r
db30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
db40: 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  EM;.  }.  assert
db50: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30  ( p->aColName!=0
db60: 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d   );.  pColName =
db70: 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69   &(p->aColName[i
db80: 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f  dx+var*p->nResCo
db90: 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73  lumn]);.  rc = s
dba0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
dbb0: 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e  Str(pColName, zN
dbc0: 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
dbd0: 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61  UTF8, xDel);.  a
dbe0: 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20  ssert( rc!=0 || 
dbf0: 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e  !zName || (pColN
dc00: 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54  ame->flags&MEM_T
dc10: 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74  erm)!=0 );.  ret
dc20: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
dc30: 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65   A read or write
dc40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
dc50: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61   or may not be a
dc60: 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73  ctive on databas
dc70: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
dc80: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
dc90: 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d   is active, comm
dca0: 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  it it. If there 
dcb0: 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72  is a.** write-tr
dcc0: 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69  ansaction spanni
dcd0: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ng more than one
dce0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
dcf0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
dd00: 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68  takes care of th
dd10: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
dd20: 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74   trickery..*/.st
dd30: 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
dd40: 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
dd50: 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74   Vdbe *p){.  int
dd60: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
dd70: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
dd80: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
dd90: 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
dda0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  te-transaction *
ddb0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
ddc0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
ddd0: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
dde0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
ddf0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
de00: 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f    /* With this o
de10: 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74  ption, sqlite3Vt
de20: 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69  abSync() is defi
de30: 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79  ned to be simply
de40: 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b   .  ** SQLITE_OK
de50: 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65   so p is not use
de60: 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45  d. .  */.  UNUSE
de70: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
de80: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66  #endif..  /* Bef
de90: 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
dea0: 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68  ng else, call th
deb0: 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  e xSync() callba
dec0: 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20  ck for any.  ** 
ded0: 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74  virtual module t
dee0: 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e  ables written in
def0: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
df00: 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20  n. This has to. 
df10: 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f   ** be done befo
df20: 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77  re determining w
df30: 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20  hether a master 
df40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
df50: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20  .  ** required, 
df60: 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61  as an xSync() ca
df70: 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61  llback may add a
df80: 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  n attached datab
df90: 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ase.  ** to the 
dfa0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
dfb0: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
dfc0: 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b  VtabSync(db, p);
dfd0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
dfe0: 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20   determines (a) 
dff0: 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  if the commit ho
e000: 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ok should be inv
e010: 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62  oked and.  ** (b
e020: 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62  ) how many datab
e030: 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f  ase files have o
e040: 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
e050: 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a  ctions, not .  *
e060: 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
e070: 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28  temp database. (
e080: 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  b) is important 
e090: 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20  because if more 
e0a0: 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64  than .  ** one d
e0b0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
e0c0: 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
e0d0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61  ransaction, a ma
e0e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  ster journal.  *
e0f0: 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72  * file is requir
e100: 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63  ed for an atomic
e110: 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20   commit..  */ . 
e120: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
e130: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
e140: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
e150: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
e160: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
e170: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
e180: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
e190: 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63   ){.      needXc
e1a0: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
e1b0: 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61   if( i!=1 ) nTra
e1c0: 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  ns++;.      sqli
e1d0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
e1e0: 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
e1f0: 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
e200: 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33  siveLock(sqlite3
e210: 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29  BtreePager(pBt))
e220: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
e230: 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a  treeLeave(pBt);.
e240: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
e250: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e260: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
e270: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
e280: 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65  re are any write
e290: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74  -transactions at
e2a0: 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65   all, invoke the
e2b0: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a   commit hook */.
e2c0: 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69    if( needXcommi
e2d0: 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  t && db->xCommit
e2e0: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
e2f0: 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  rc = db->xCommit
e300: 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f  Callback(db->pCo
e310: 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66  mmitArg);.    if
e320: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
e330: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
e340: 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
e350: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
e360: 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
e370: 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
e380: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
e390: 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
e3a0: 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
e3b0: 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
e3c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
e3d0: 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
e3e0: 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
e3f0: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
e400: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
e410: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
e420: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
e430: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
e440: 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
e450: 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
e460: 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
e470: 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
e480: 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69  ry: or a temp fi
e490: 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68  le.  In .  ** th
e4a0: 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f  at case we do no
e4b0: 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
e4c0: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
e4d0: 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
e4e0: 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73  .  ** simple cas
e4f0: 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f  e then too..  */
e500: 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
e510: 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
e520: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
e530: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
e540: 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c  )).   || nTrans<
e550: 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28  =1.  ){.    for(
e560: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
e570: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
e580: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
e590: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
e5a0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
e5b0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
e5c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
e5d0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
e5e0: 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ne(pBt, 0);.    
e5f0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
e600: 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20  * Do the commit 
e610: 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61  only if all data
e620: 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c  bases successful
e630: 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73  ly complete phas
e640: 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e 1. .    ** If 
e650: 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65  one of the Btree
e660: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
e670: 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68   calls fails, th
e680: 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a  is indicates an.
e690: 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20      ** IO error 
e6a0: 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f  while deleting o
e6b0: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  r truncating a j
e6c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
e6d0: 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20  is unlikely,.   
e6e0: 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61   ** but could ha
e6f0: 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  ppen. In this ca
e700: 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  se abandon proce
e710: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
e720: 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20   the error..    
e730: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
e740: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e750: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
e760: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
e770: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
e780: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
e790: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
e7a0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
e7b0: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
e7c0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
e7d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
e7e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e7f0: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
e800: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d  ommit(db);.    }
e810: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
e820: 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
e830: 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
e840: 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
e850: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
e860: 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
e870: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
e880: 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
e890: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e8a0: 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
e8b0: 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a  ed atomicly..  *
e8c0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
e8d0: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65  _OMIT_DISKIO.  e
e8e0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
e8f0: 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d  _vfs *pVfs = db-
e900: 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e  >pVfs;.    int n
e910: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
e920: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
e930: 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61   0;   /* File-na
e940: 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65  me for the maste
e950: 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  r journal */.   
e960: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61   char const *zMa
e970: 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
e980: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
e990: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
e9a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
e9b0: 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b  le *pMaster = 0;
e9c0: 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
e9d0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  = 0;.    int res
e9e0: 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79 43  ;.    int retryC
e9f0: 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ount = 0;.    in
ea00: 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20  t nMainFile;..  
ea10: 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61    /* Select a ma
ea20: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ea30: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d  e name */.    nM
ea40: 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
ea50: 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46  3Strlen30(zMainF
ea60: 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ile);.    zMaste
ea70: 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
ea80: 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58  tf(db, "%s-mjXXX
ea90: 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46  XXX9XXz", zMainF
eaa0: 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  ile);.    if( zM
eab0: 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72  aster==0 ) retur
eac0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
ead0: 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
eae0: 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20  32 iRandom;.    
eaf0: 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74    if( retryCount
eb00: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
eb10: 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29  retryCount>100 )
eb20: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
eb30: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
eb40: 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a  ULL, "MJ delete:
eb50: 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
eb60: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
eb70: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
eb80: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
eb90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
eba0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ebb0: 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b  retryCount==1 ){
ebc0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ebd0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55  e3_log(SQLITE_FU
ebe0: 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a  LL, "MJ collide:
ebf0: 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
ec00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ec10: 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f 75  }.      retryCou
ec20: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt++;.      sqli
ec30: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
ec40: 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20  izeof(iRandom), 
ec50: 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20  &iRandom);.     
ec60: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
ec70: 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e  f(13, &zMaster[n
ec80: 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25  MainFile], "-mj%
ec90: 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20  06X9%02X",.     
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecb0: 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e 64            (iRand
ecc0: 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c  om>>8)&0xffffff,
ecd0: 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a   iRandom&0xff);.
ece0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74        /* The ant
ecf0: 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61  ipenultimate cha
ed00: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61  racter of the ma
ed10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
ed20: 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  e must.      ** 
ed30: 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20  be "9" to avoid 
ed40: 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20  name collisions 
ed50: 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66  when using 8+3 f
ed60: 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20  ilenames. */.   
ed70: 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74     assert( zMast
ed80: 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  er[sqlite3Strlen
ed90: 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d  30(zMaster)-3]==
eda0: 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  '9' );.      sql
edb0: 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
edc0: 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74  zMainFile, zMast
edd0: 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
ede0: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
edf0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
ee00: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
ee10: 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  STS, &res);.    
ee20: 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
ee30: 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a  TE_OK && res );.
ee40: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ee50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
ee60: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
ee70: 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
ee80: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ee90: 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66  OsOpenMalloc(pVf
eea0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61  s, zMaster, &pMa
eeb0: 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20  ster, .         
eec0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
eed0: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
eee0: 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
eef0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
ef00: 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54  _EXCLUSIVE|SQLIT
ef10: 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
ef20: 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29  URNAL, 0.      )
ef30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ef40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ef50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
ef60: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
ef70: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ef80: 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  rc;.    }. .    
ef90: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  /* Write the nam
efa0: 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61  e of each databa
efb0: 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74  se file in the t
efc0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20  ransaction into 
efd0: 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d  the new.    ** m
efe0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
eff0: 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
f000: 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70  occurs at this p
f010: 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a  oint close.    *
f020: 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  * and delete the
f030: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f040: 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e  file. All the in
f050: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
f060: 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74   files.    ** st
f070: 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20  ill have 'null' 
f080: 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  as the master jo
f090: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73  urnal pointer, s
f0a0: 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c  o they will roll
f0b0: 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64  .    ** back ind
f0c0: 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20  ependently if a 
f0d0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
f0e0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
f0f0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
f100: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
f110: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
f120: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
f130: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
f140: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
f150: 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
f160: 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69  st *zFile = sqli
f170: 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e  te3BtreeGetJourn
f180: 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20  alname(pBt);.   
f190: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d       if( zFile==
f1a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
f1b0: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
f1c0: 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65  ore TEMP and :me
f1d0: 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20  mory: databases 
f1e0: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
f1f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69       assert( zFi
f200: 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  le[0]!=0 );.    
f210: 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e      if( !needSyn
f220: 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72  c && !sqlite3Btr
f230: 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70  eeSyncDisabled(p
f240: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Bt) ){.         
f250: 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
f260: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f270: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
f280: 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46  rite(pMaster, zF
f290: 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ile, sqlite3Strl
f2a0: 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f  en30(zFile)+1, o
f2b0: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
f2c0: 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65  offset += sqlite
f2d0: 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
f2e0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +1;.        if( 
f2f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f300: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
f310: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
f320: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
f330: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
f340: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
f350: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
f360: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
f370: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
f380: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
f390: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f3a0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
f3b0: 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20  Sync the master 
f3c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
f3d0: 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45   the IOCAP_SEQUE
f3e0: 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20  NTIAL device.   
f3f0: 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20   ** flag is set 
f400: 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  this is not requ
f410: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
f420: 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20   if( needSync . 
f430: 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74      && 0==(sqlit
f440: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
f450: 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65  teristics(pMaste
f460: 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  r)&SQLITE_IOCAP_
f470: 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20  SEQUENTIAL).    
f480: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
f490: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
f4a0: 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49  nc(pMaster, SQLI
f4b0: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29  TE_SYNC_NORMAL))
f4c0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
f4d0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
f4e0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
f4f0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
f500: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
f510: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
f520: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
f530: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
f540: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
f550: 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68    /* Sync all th
f560: 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c  e db files invol
f570: 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ved in the trans
f580: 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65  action. The same
f590: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74   call.    ** set
f5a0: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
f5b0: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  rnal pointer in 
f5c0: 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20  each individual 
f5d0: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
f5e0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
f5f0: 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20  rs here, do not 
f600: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
f610: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
f620: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
f630: 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
f640: 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72  s during the fir
f650: 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  st call to.    *
f660: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
f670: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20  mmitPhaseOne(), 
f680: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20  then there is a 
f690: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a  chance that the.
f6a0: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
f6b0: 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
f6c0: 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74  be orphaned. But
f6d0: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74   we cannot delet
f6e0: 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20  e it,.    ** in 
f6f0: 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20  case the master 
f700: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
f710: 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
f720: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
f730: 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72     ** file befor
f740: 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63  e the failure oc
f750: 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  curred..    */. 
f760: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
f770: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
f780: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
f790: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
f7a0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
f7b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
f7c0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
f7d0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
f7e0: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
f7f0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
f800: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
f810: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
f820: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
f830: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
f840: 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20  BUSY );.    if( 
f850: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f860: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
f870: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
f880: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f890: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
f8a0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * Delete the mas
f8b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
f8c0: 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74  . This commits t
f8d0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
f8e0: 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69  After.    ** doi
f8f0: 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65  ng this the dire
f900: 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20  ctory is synced 
f910: 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79  again before any
f920: 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20   individual.    
f930: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ** transaction f
f940: 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64  iles are deleted
f950: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
f960: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
f970: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
f980: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
f990: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
f9a0: 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  er);.    zMaster
f9b0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
f9c0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
f9d0: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
f9e0: 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64  /* All files and
f9f0: 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76   directories hav
fa00: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
fa10: 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f  ynced, so the fo
fa20: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63  llowing.    ** c
fa30: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
fa40: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
fa50: 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c  wo() are only cl
fa60: 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a  osing files and.
fa70: 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20      ** deleting 
fa80: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f  or truncating jo
fa90: 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74  urnals. If somet
faa0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
fab0: 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
fac0: 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77  s is happening w
fad0: 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63  e don't really c
fae0: 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69  are. The integri
faf0: 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ty of the.    **
fb00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
fb10: 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65  already guarante
fb20: 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72  ed, but some str
fb30: 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61  ay 'cold' journa
fb40: 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65  ls.    ** may be
fb50: 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52   lying around. R
fb60: 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
fb70: 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c  r code won't hel
fb80: 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a  p matters..    *
fb90: 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  /.    disable_si
fba0: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
fbb0: 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s();.    sqlite3
fbc0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
fbd0: 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  c();.    for(i=0
fbe0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
fbf0: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
fc00: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
fc10: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
fc20: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
fc30: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
fc40: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20  itPhaseTwo(pBt, 
fc50: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
fc60: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  }.    sqlite3End
fc70: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
fc80: 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c      enable_simul
fc90: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
fca0: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  ;..    sqlite3Vt
fcb0: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
fcc0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
fcd0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
fce0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
fcf0: 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71  ecks that the sq
fd00: 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76  lite3.nVdbeActiv
fd10: 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65  e count variable
fd20: 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20  .** matches the 
fd30: 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73  number of vdbe's
fd40: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c   in the list sql
fd50: 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20  ite3.pVdbe that 
fd60: 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  are.** currently
fd70: 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65   active. An asse
fd80: 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74  rtion fails if t
fd90: 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f  he two counts do
fda0: 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54   not match..** T
fdb0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  his is an intern
fdc0: 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e  al self-check on
fdd0: 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61  ly - it is not a
fde0: 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63  n essential proc
fdf0: 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a  essing.** step..
fe00: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
fe10: 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20  no-op if NDEBUG 
fe20: 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23  is defined..*/.#
fe30: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
fe40: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41  atic void checkA
fe50: 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c  ctiveVdbeCnt(sql
fe60: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
fe70: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20  e *p;.  int cnt 
fe80: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74  = 0;.  int nWrit
fe90: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65  e = 0;.  int nRe
fea0: 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62  ad = 0;.  p = db
feb0: 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65  ->pVdbe;.  while
fec0: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
fed0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
fee0: 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63  GIC_RUN && p->pc
fef0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  >=0 ){.      cnt
ff00: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
ff10: 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e  >readOnly==0 ) n
ff20: 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Write++;.      i
ff30: 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  f( p->bIsReader 
ff40: 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d  ) nRead++;.    }
ff50: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
ff60: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
ff70: 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41   cnt==db->nVdbeA
ff80: 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72  ctive );.  asser
ff90: 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e  t( nWrite==db->n
ffa0: 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61  VdbeWrite );.  a
ffb0: 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62  ssert( nRead==db
ffc0: 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d  ->nVdbeRead );.}
ffd0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
ffe0: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
fff0: 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
10000 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70  ** If the Vdbe p
10010 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
10020 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e  st argument open
10030 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74  ed a statement-t
10040 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63  ransaction,.** c
10050 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67  lose it now. Arg
10060 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62  ument eOp must b
10070 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  e either SAVEPOI
10080 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a  NT_ROLLBACK or.*
10090 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  * SAVEPOINT_RELE
100a0 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41  ASE. If it is SA
100b0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
100c0 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65  , then the state
100d0 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
100e0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
100f0 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41  ck. If eOp is SA
10100 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
10110 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74   then the .** st
10120 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
10130 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
10140 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
10150 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
10160 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  n SQLITE_IOERR_X
10170 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
10180 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
10190 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
101a0 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
101b0 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
101c0 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  ment(Vdbe *p, in
101d0 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65  t eOp){.  sqlite
101e0 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d  3 *const db = p-
101f0 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
10200 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
10210 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e   If p->iStatemen
10220 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
10230 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  n zero, then thi
10240 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20  s Vdbe opened a 
10250 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
10260 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
10270 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
10280 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79  d here. The only
10290 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20   exception.  ** 
102a0 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72  is that an IO er
102b0 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63  ror may have occ
102c0 75 72 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61  urred, causing a
102d0 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c  n emergency roll
102e0 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68  back..  ** In th
102f0 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74  is case (db->nSt
10300 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64  atement==0), and
10310 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
10320 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20  g to do..  */.  
10330 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  if( db->nStateme
10340 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d  nt && p->iStatem
10350 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ent ){.    int i
10360 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
10370 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e  iSavepoint = p->
10380 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20  iStatement-1;.. 
10390 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d     assert( eOp==
103a0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
103b0 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50  CK || eOp==SAVEP
103c0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20  OINT_RELEASE);. 
103d0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
103e0 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
103f0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53     assert( p->iS
10400 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e  tatement==(db->n
10410 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53  Statement+db->nS
10420 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20  avepoint) );..  
10430 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
10440 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
10450 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c     int rc2 = SQL
10460 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74  ITE_OK;.      Bt
10470 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
10480 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
10490 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
104a0 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
104b0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
104c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32  ){.          rc2
104d0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
104e0 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
104f0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10500 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
10510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10520 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
10530 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
10540 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
10550 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
10560 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
10570 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
10580 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10590 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
105a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
105b0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
105c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
105d0 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74     }.    db->nSt
105e0 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70  atement--;.    p
105f0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
10600 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
10610 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10620 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
10630 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
10640 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
10650 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
10660 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
10670 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
10680 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
10690 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
106a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
106b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
106c0 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c  tabSavepoint(db,
106d0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
106e0 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
106f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
10700 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
10710 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
10720 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ion is being rol
10730 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72  led back, also r
10740 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20  estore the .    
10750 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
10760 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e  les deferred con
10770 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20  straint counter 
10780 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
10790 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a  had when .    **
107a0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
107b0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f  ransaction was o
107c0 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  pened.  */.    i
107d0 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
107e0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
107f0 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
10800 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  dCons = p->nStmt
10810 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64  DefCons;.      d
10820 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
10830 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65  ons = p->nStmtDe
10840 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a  fImmCons;.    }.
10850 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10860 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
10870 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
10880 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
10890 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74  tion opened by t
108a0 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
108b0 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65  handle associate
108c0 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61  d with the VM pa
108d0 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
108e0 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ent is about to 
108f0 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  be .** committed
10900 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  . If there are o
10910 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72  utstanding defer
10920 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
10930 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69  constraint.** vi
10940 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e  olations, return
10950 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f   SQLITE_ERROR. O
10960 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
10970 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
10980 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
10990 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e  ing FK violation
109a0 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  s and this funct
109b0 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ion returns .** 
109c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65  SQLITE_ERROR, se
109d0 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  t the result of 
109e0 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45  the VM to SQLITE
109f0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
10a00 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72  IGNKEY.** and wr
10a10 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ite an error mes
10a20 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e  sage to it. Then
10a30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
10a40 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  RROR..*/.#ifndef
10a50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
10a60 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c  EIGN_KEY.int sql
10a70 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
10a80 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66  Vdbe *p, int def
10a90 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65  erred){.  sqlite
10aa0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
10ab0 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26   if( (deferred &
10ac0 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  & (db->nDeferred
10ad0 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72  Cons+db->nDeferr
10ae0 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20  edImmCons)>0) . 
10af0 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20    || (!deferred 
10b00 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  && p->nFkConstra
10b10 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20  int>0) .  ){.   
10b20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
10b30 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
10b40 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72  GNKEY;.    p->er
10b50 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
10b60 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  bort;.    sqlite
10b70 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
10b80 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 46 4f 52  ErrMsg, db, "FOR
10b90 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
10ba0 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20  int failed");.  
10bb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10bc0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
10bd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10be0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
10bf0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
10c00 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61  alled the when a
10c10 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68   VDBE tries to h
10c20 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42  alt.  If the VDB
10c30 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68  E.** has made ch
10c40 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20  anges and is in 
10c50 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
10c60 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f   then commit tho
10c70 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  se.** changes.  
10c80 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73  If a rollback is
10c90 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f   needed, then do
10ca0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
10cb0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10cc0 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  e is the only wa
10cd0 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74  y to move the st
10ce0 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d  ate of a VM from
10cf0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  .** SQLITE_MAGIC
10d00 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d  _RUN to SQLITE_M
10d10 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69  AGIC_HALT.  It i
10d20 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a  s harmless to.**
10d30 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20   call this on a 
10d40 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  VM that is in th
10d50 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  e SQLITE_MAGIC_H
10d60 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ALT state..**.**
10d70 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
10d80 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63   code.  If the c
10d90 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ommit could not 
10da0 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65  complete because
10db0 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74   of.** lock cont
10dc0 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53  ention, return S
10dd0 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20  QLITE_BUSY.  If 
10de0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
10df0 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d  eturned, it.** m
10e00 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64  eans the close d
10e10 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e  id not happen an
10e20 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  d needs to be re
10e30 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  peated..*/.int s
10e40 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56  qlite3VdbeHalt(V
10e50 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
10e60 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
10e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
10e80 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e  ed to store tran
10e90 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64  sient return cod
10ea0 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  es */.  sqlite3 
10eb0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
10ec0 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
10ed0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f   contains the lo
10ee0 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69  gic that determi
10ef0 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65  nes if a stateme
10f00 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73  nt or.  ** trans
10f10 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  action will be c
10f20 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
10f30 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
10f40 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ult of the.  ** 
10f50 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69  execution of thi
10f60 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
10f70 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  e. .  **.  ** If
10f80 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
10f90 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63  owing errors occ
10fa0 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ur:.  **.  **   
10fb0 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20    SQLITE_NOMEM. 
10fc0 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
10fd0 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51  OERR.  **     SQ
10fe0 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20  LITE_FULL.  **  
10ff0 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52     SQLITE_INTERR
11000 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  UPT.  **.  ** Th
11010 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  en the internal 
11020 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65  cache might have
11030 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e   been left in an
11040 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20   inconsistent.  
11050 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65  ** state.  We ne
11060 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ed to rollback t
11070 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
11080 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65  nsaction, if the
11090 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20  re is.  ** one, 
110a0 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  or the complete 
110b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
110c0 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65  here is no state
110d0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
110e0 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d  ..  */..  if( p-
110f0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
11100 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
11110 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11120 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63   }.  if( p->aOnc
11130 65 46 6c 61 67 20 29 20 6d 65 6d 73 65 74 28 70  eFlag ) memset(p
11140 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20  ->aOnceFlag, 0, 
11150 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20  p->nOnceFlag);. 
11160 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
11170 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  (p);.  if( p->ma
11180 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
11190 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  RUN ){.    retur
111a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
111b0 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
111c0 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  beCnt(db);..  /*
111d0 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f   No commit or ro
111e0 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66  llback needed if
111f0 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76   the program nev
11200 65 72 20 73 74 61 72 74 65 64 20 6f 72 20 69 66  er started or if
11210 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74   the.  ** SQL st
11220 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  atement does not
11230 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61   read or write a
11240 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11250 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
11260 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64  =0 && p->bIsRead
11270 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72  er ){.    int mr
11280 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20  c;   /* Primary 
11290 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  error code from 
112a0 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74  p->rc */.    int
112b0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
112c0 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65  0;.    int isSpe
112d0 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20  cialError;      
112e0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
112f0 74 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69  true if a 'speci
11300 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20  al' error */..  
11310 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74    /* Lock all bt
11320 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65  rees used by the
11330 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
11340 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74    sqlite3VdbeEnt
11350 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  er(p);..    /* C
11360 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20  heck for one of 
11370 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
11380 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20  rs */.    mrc = 
11390 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20  p->rc & 0xff;.  
113a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
113b0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
113c0 4f 43 4b 45 44 20 29 3b 20 20 2f 2a 20 54 68 69  OCKED );  /* Thi
113d0 73 20 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65  s error no longe
113e0 72 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  r exists */.    
113f0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d  isSpecialError =
11400 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d   mrc==SQLITE_NOM
11410 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
11420 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  E_IOERR.        
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
11440 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc==SQLITE_INTE
11450 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51  RRUPT || mrc==SQ
11460 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69  LITE_FULL;.    i
11470 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  f( isSpecialErro
11480 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  r ){.      /* If
11490 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72   the query was r
114a0 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65  ead-only and the
114b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
114c0 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c  QLITE_INTERRUPT,
114d0 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f   .      ** no ro
114e0 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73  llback is necess
114f0 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ary. Otherwise, 
11500 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70  at least a savep
11510 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
11520 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
11530 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  be rolled back t
11540 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
11550 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20  tabase to a .   
11560 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74     ** consistent
11570 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
11580 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69  .      ** Even i
11590 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
115a0 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74  is read-only, it
115b0 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
115c0 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a   perform.      *
115d0 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  * a statement or
115e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
115f0 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e  lback operation.
11600 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20   If the error . 
11610 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64       ** occurred
11620 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
11630 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  o the journal, s
11640 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61  ub-journal or da
11650 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
11660 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20  file as part of 
11670 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65  an effort to fre
11680 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65  e up cache space
11690 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20   (see function. 
116a0 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72       ** pagerStr
116b0 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63  ess() in pager.c
116c0 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ), the rollback 
116d0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72  is required to r
116e0 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  estore .      **
116f0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20   the pager to a 
11700 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
11710 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11720 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
11730 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
11740 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
11750 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d        if( (mrc==
11760 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
11770 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
11780 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  ) && p->usesStmt
11790 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
117a0 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
117b0 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
117c0 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
117d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
117e0 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65   /* We are force
117f0 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
11800 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  he active transa
11810 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f  ction. Before do
11820 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
11830 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f   so, abort any o
11840 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20  ther statements 
11850 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72  this handle curr
11860 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65  ently has active
11870 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
11880 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11890 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
118a0 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
118b0 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
118c0 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
118d0 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
118e0 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
118f0 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
11900 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11910 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
11920 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20  k for immediate 
11930 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c  foreign key viol
11940 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69  ations. */.    i
11950 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
11960 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
11970 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
11980 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  p, 0);.    }.  .
11990 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75      /* If the au
119a0 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
119b0 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69  s set and this i
119c0 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76  s the only activ
119d0 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a  e writer .    **
119e0 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20   VM, then we do 
119f0 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20  either a commit 
11a00 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74  or rollback of t
11a10 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
11a20 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a  action. .    **.
11a30 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69      ** Note: Thi
11a40 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e  s block also run
11a50 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s if one of the 
11a60 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68  special errors h
11a70 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61  andled .    ** a
11a80 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65  bove has occurre
11a90 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d. .    */.    i
11aa0 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49  f( !sqlite3VtabI
11ab0 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20  nSync(db) .     
11ac0 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  && db->autoCommi
11ad0 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e  t .     && db->n
11ae0 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72  VdbeWrite==(p->r
11af0 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20  eadOnly==0) .   
11b00 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
11b10 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
11b20 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  | (p->errorActio
11b30 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69  n==OE_Fail && !i
11b40 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29  sSpecialError) )
11b50 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
11b60 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
11b70 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  k(p, 1);.       
11b80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11b90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
11ba0 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61  if( NEVER(p->rea
11bb0 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  dOnly) ){.      
11bc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11bd0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
11be0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
11bf0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
11c00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11c10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
11c20 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
11c30 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KEY;.        }el
11c40 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f  se{ .          /
11c50 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  * The auto-commi
11c60 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
11c70 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
11c80 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20   was successful 
11c90 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
11ca0 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
11cb0 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  ' constraint and
11cc0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65   there are no de
11cd0 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20  ferred foreign. 
11ce0 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20           ** key 
11cf0 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68  constraints to h
11d00 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73  old up the trans
11d10 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  action. This mea
11d20 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20  ns a commit .   
11d30 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
11d40 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
11d50 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
11d60 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  mit(db, p);.    
11d70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
11d80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
11d90 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  Y && p->readOnly
11da0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
11db0 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
11dc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
11dd0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
11de0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11df0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11e00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
11e10 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
11e20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
11e30 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
11e40 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d  E_OK);.        }
11e50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11e60 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
11e70 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
11e80 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
11e90 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  mCons = 0;.     
11ea0 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
11eb0 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46  = ~SQLITE_DeferF
11ec0 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Ks;.          sq
11ed0 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
11ee0 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
11ef0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11f00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
11f10 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
11f20 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
11f30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11f40 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d  db->nStatement =
11f50 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
11f60 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d  ( eStatementOp==
11f70 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
11f80 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
11f90 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  || p->errorActio
11fa0 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20  n==OE_Fail ){.  
11fb0 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
11fc0 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
11fd0 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65  ELEASE;.      }e
11fe0 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72  lse if( p->error
11ff0 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74  Action==OE_Abort
12000 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
12010 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
12020 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
12030 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12040 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
12050 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
12060 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
12070 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12080 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
12090 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
120a0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
120b0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
120c0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53  .  .    /* If eS
120d0 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f  tatementOp is no
120e0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73  n-zero, then a s
120f0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
12100 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20  tion needs to.  
12110 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65    ** be committe
12120 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
12130 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  . Call sqlite3Vd
12140 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
12150 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20  () to.    ** do 
12160 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72  so. If this oper
12170 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ation returns an
12180 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20   error, and the 
12190 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
121a0 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63  t.    ** error c
121b0 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b  ode is SQLITE_OK
121c0 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   or SQLITE_CONST
121d0 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d  RAINT, then prom
121e0 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  ote the.    ** c
121f0 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
12200 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20   error code..   
12210 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61   */.    if( eSta
12220 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20  tementOp ){.    
12230 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
12240 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
12250 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  (p, eStatementOp
12260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
12270 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
12280 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12290 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d  || (p->rc&0xff)=
122a0 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
122b0 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NT ){.          
122c0 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
122d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
122e0 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
122f0 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  sg);.          p
12300 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
12310 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12320 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
12330 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
12340 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
12350 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
12360 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
12370 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
12380 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
12390 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
123a0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
123b0 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55  was an INSERT, U
123c0 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
123d0 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74  and no statement
123e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
123f0 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c   ** has been rol
12400 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65  led back, update
12410 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
12420 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d  nnection change-
12430 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
12440 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
12450 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20  geCntOn ){.     
12460 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
12470 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p!=SAVEPOINT_ROL
12480 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
12490 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
124a0 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
124b0 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65  hange);.      }e
124c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
124d0 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
124e0 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  es(db, 0);.     
124f0 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61   }.      p->nCha
12500 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  nge = 0;.    }..
12510 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
12520 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  he locks */.    
12530 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
12540 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  (p);.  }..  /* W
12550 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75  e have successfu
12560 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63  lly halted and c
12570 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52  losed the VM.  R
12580 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e  ecord this fact.
12590 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
125a0 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56  =0 ){.    db->nV
125b0 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20  dbeActive--;.   
125c0 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
125d0 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69  y ) db->nVdbeWri
125e0 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  te--;.    if( p-
125f0 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62 2d  >bIsReader ) db-
12600 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20  >nVdbeRead--;.  
12610 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
12620 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e  dbeActive>=db->n
12630 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20  VdbeRead );.    
12640 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
12650 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65  eRead>=db->nVdbe
12660 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73  Write );.    ass
12670 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72  ert( db->nVdbeWr
12680 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  ite>=0 );.  }.  
12690 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
126a0 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68  MAGIC_HALT;.  ch
126b0 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
126c0 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  (db);.  if( p->d
126d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
126e0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
126f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
12700 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75  ..  /* If the au
12710 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
12720 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74  s set to true, t
12730 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68  hen any locks th
12740 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a  at were held.  *
12750 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  * by connection 
12760 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  db have now been
12770 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20   released. Call 
12780 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
12790 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a  nUnlocked() .  *
127a0 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20  * to invoke any 
127b0 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d  required unlock-
127c0 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
127d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
127e0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
127f0 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
12800 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29  tionUnlocked(db)
12810 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
12820 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
12830 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f  >0 || db->autoCo
12840 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e  mmit==0 || db->n
12850 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a  Statement==0 );.
12860 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d    return (p->rc=
12870 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53  =SQLITE_BUSY ? S
12880 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c  QLITE_BUSY : SQL
12890 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ITE_OK);.}.../*.
128a0 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
128b0 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
128c0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
128d0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
128e0 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
128f0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
12900 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
12910 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
12920 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
12930 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
12940 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
12950 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
12960 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
12970 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f  opy the error co
12980 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
12990 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  sage belonging t
129a0 6f 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65  o the VDBE passe
129b0 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
129c0 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74  t argument to it
129d0 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  s database handl
129e0 65 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20  e (so that they 
129f0 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75  will be .** retu
12a00 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  rned by calls to
12a10 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
12a20 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65  () and sqlite3_e
12a30 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  rrmsg())..**.** 
12a40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
12a50 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65  es not clear the
12a60 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65   VDBE error code
12a70 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73   or message, jus
12a80 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d  t.** copies them
12a90 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
12aa0 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
12ab0 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73  sqlite3VdbeTrans
12ac0 66 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70  ferError(Vdbe *p
12ad0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
12ae0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
12af0 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66  rc = p->rc;.  if
12b00 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
12b10 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69      u8 mallocFai
12b20 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63  led = db->malloc
12b30 46 61 69 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69  Failed;.    sqli
12b40 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
12b50 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20  lloc();.    if( 
12b60 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62  db->pErr==0 ) db
12b70 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33  ->pErr = sqlite3
12b80 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20  ValueNew(db);.  
12b90 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
12ba0 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d  tStr(db->pErr, -
12bb0 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53  1, p->zErrMsg, S
12bc0 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
12bd0 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
12be0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
12bf0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
12c00 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12c10 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  d = mallocFailed
12c20 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64  ;.    db->errCod
12c30 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b  e = rc;.  }else{
12c40 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12c50 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20  r(db, rc, 0);.  
12c60 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12c70 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
12c80 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a  ENABLE_SQLLOG./*
12c90 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45  .** If an SQLITE
12ca0 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68  _CONFIG_SQLLOG h
12cb0 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 65  ook is registere
12cc0 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73  d and the VM has
12cd0 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69   been run, .** i
12ce0 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  nvoke it..*/.sta
12cf0 74 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76  tic void vdbeInv
12d00 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a  okeSqllog(Vdbe *
12d10 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  v){.  if( sqlite
12d20 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
12d30 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d  qllog && v->rc==
12d40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e  SQLITE_OK && v->
12d50 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30  zSql && v->pc>=0
12d60 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   ){.    char *zE
12d70 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65  xpanded = sqlite
12d80 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76  3VdbeExpandSql(v
12d90 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20  , v->zSql);.    
12da0 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69  assert( v->db->i
12db0 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20  nit.busy==0 );. 
12dc0 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64     if( zExpanded
12dd0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12de0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
12df0 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20  qllog(.         
12e00 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
12e10 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c  nfig.pSqllogArg,
12e20 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65   v->db, zExpande
12e30 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20  d, 1.      );.  
12e40 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
12e50 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64  e(v->db, zExpand
12e60 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ed);.    }.  }.}
12e70 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
12e80 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
12e90 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
12ea0 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42  * Clean up a VDB
12eb0 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
12ec0 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c  n but do not del
12ed0 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73  ete the VDBE jus
12ee0 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20  t yet..** Write 
12ef0 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
12f00 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  es into *pzErrMs
12f10 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  g.  Return the r
12f20 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  esult code..**.*
12f30 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
12f40 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65  tine is run, the
12f50 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20   VDBE should be 
12f60 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63  ready to be exec
12f70 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a  uted.** again..*
12f80 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20  *.** To look at 
12f90 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20  it another way, 
12fa0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  this routine res
12fb0 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
12fc0 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
12fd0 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42  machine from VDB
12fe0 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56  E_MAGIC_RUN or V
12ff0 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62  DBE_MAGIC_HALT b
13000 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  ack to.** VDBE_M
13010 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e  AGIC_INIT..*/.in
13020 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  t sqlite3VdbeRes
13030 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  et(Vdbe *p){.  s
13040 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62  qlite3 *db;.  db
13050 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
13060 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f  If the VM did no
13070 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74  t run to complet
13080 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63  ion or if it enc
13090 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a  ountered an.  **
130a0 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20   error, then it 
130b0 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62  might not have b
130c0 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65  een halted prope
130d0 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20  rly.  So halt.  
130e0 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ** it now..  */.
130f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c    sqlite3VdbeHal
13100 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  t(p);..  /* If t
13110 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72  he VDBE has be r
13120 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c  un even partiall
13130 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  y, then transfer
13140 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
13150 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d    ** and error m
13160 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20  essage from the 
13170 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61  VDBE into the ma
13180 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
13190 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a  cture.  But.  **
131a0 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73   if the VDBE has
131b0 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74   just been set t
131c0 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f  o run but has no
131d0 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75  t actually execu
131e0 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73  ted any.  ** ins
131f0 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c  tructions yet, l
13200 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61  eave the main da
13210 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66  tabase error inf
13220 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67  ormation unchang
13230 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
13240 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76  ->pc>=0 ){.    v
13250 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
13260 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
13270 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72  dbeTransferError
13280 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
13290 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
132a0 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
132b0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
132c0 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e  if( p->runOnlyOn
132d0 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20  ce ) p->expired 
132e0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
132f0 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70   p->rc && p->exp
13300 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ired ){.    /* T
13310 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20  he expired flag 
13320 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56  was set on the V
13330 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66  DBE before the f
13340 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  irst call.    **
13350 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70   to sqlite3_step
13360 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65  (). For consiste
13370 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74  ncy (since sqlit
13380 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20  e3_step() was.  
13390 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65    ** called), se
133a0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65  t the database e
133b0 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73  rror in this cas
133c0 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a  e as well..    *
133d0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
133e0 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d  or(db, p->rc, p-
133f0 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20  >zErrMsg ? "%s" 
13400 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  : 0, p->zErrMsg)
13410 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
13420 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
13430 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
13440 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Msg = 0;.  }..  
13450 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d  /* Reclaim all m
13460 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
13470 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c  e VDBE.  */.  Cl
13480 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20  eanup(p);..  /* 
13490 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69  Save profiling i
134a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
134b0 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20  this VDBE run.. 
134c0 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f   */.#ifdef VDBE_
134d0 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
134e0 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65  FILE *out = fope
134f0 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e  n("vdbe_profile.
13500 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20  out", "a");.    
13510 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20  if( out ){.     
13520 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70   int i;.      fp
13530 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d  rintf(out, "----
13540 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ");.      for(i
13550 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
13560 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
13570 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c  ntf(out, "%02x",
13580 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
13590 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
135a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
135b0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  \n");.      if( 
135c0 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20  p->zSql ){.     
135d0 20 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20     char c, pc = 
135e0 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  0;.        fprin
135f0 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a  tf(out, "-- ");.
13600 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
13610 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d   (c = p->zSql[i]
13620 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
13630 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c        if( pc=='\
13640 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  n' ) fprintf(out
13650 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  , "-- ");.      
13660 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29      putc(c, out)
13670 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d  ;.          pc =
13680 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   c;.        }.  
13690 20 20 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c        if( pc!='\
136a0 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  n' ) fprintf(out
136b0 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  , "\n");.      }
136c0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
136d0 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
136e0 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 48 64          char zHd
136f0 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20  r[100];.        
13700 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
13710 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a  (sizeof(zHdr), z
13720 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75  Hdr, "%6u %12llu
13730 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20   %8llu ",.      
13740 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
13750 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  nt,.           p
13760 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c  ->aOp[i].cycles,
13770 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
13780 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d  Op[i].cnt>0 ? p-
13790 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70  >aOp[i].cycles/p
137a0 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30  ->aOp[i].cnt : 0
137b0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
137c0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
137d0 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20   "%s", zHdr);.  
137e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
137f0 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c  ePrintOp(out, i,
13800 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
13810 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f      }.      fclo
13820 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  se(out);.    }. 
13830 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69   }.#endif.  p->i
13840 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b  CurrentTime = 0;
13850 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
13860 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
13870 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20   return p->rc & 
13880 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20  db->errMask;.}. 
13890 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
138a0 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
138b0 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
138c0 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
138d0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
138e0 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
138f0 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
13900 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
13910 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
13920 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
13930 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
13940 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
13950 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
13960 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
13970 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d  _MAGIC_RUN || p-
13980 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
13990 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72  IC_HALT ){.    r
139a0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
139b0 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73  eset(p);.    ass
139c0 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62  ert( (rc & p->db
139d0 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29  ->errMask)==rc )
139e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
139f0 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  dbeDelete(p);.  
13a00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13a10 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
13a20 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61   iOp is less tha
13a30 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76  n zero, then inv
13a40 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
13a50 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75  or for.** all au
13a60 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69  xiliary data poi
13a70 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20  nters currently 
13a80 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d  cached by the VM
13a90 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68   passed as.** th
13aa0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
13ab0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69  ..**.** Or, if i
13ac0 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68  Op is greater th
13ad0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
13ae0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65  ero, then the de
13af0 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f  structor is.** o
13b00 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20  nly invoked for 
13b10 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20  those auxiliary 
13b20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72  data pointers cr
13b30 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65  eated by the use
13b40 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  r .** function i
13b50 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50  nvoked by the OP
13b60 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65  _Function opcode
13b70 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   at instruction 
13b80 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56  iOp of .** VM pV
13b90 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68  dbe, and only th
13ba0 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  en if:.**.**    
13bb0 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  * the associated
13bc0 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
13bd0 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20  ter is the 32nd 
13be0 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69  or later (counti
13bf0 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ng.**      from 
13c00 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20  left to right), 
13c10 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  or.**.**    * th
13c20 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
13c30 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20  bit in argument 
13c40 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77  mask is clear (w
13c50 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  here the first.*
13c60 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20  *      function 
13c70 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 73 70  parameter corrsp
13c80 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74  onds to bit 0 et
13c90 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c.)..*/.void sql
13ca0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
13cb0 78 44 61 74 61 28 56 64 62 65 20 2a 70 56 64 62  xData(Vdbe *pVdb
13cc0 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20  e, int iOp, int 
13cd0 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44 61 74 61  mask){.  AuxData
13ce0 20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65 2d 3e   **pp = &pVdbe->
13cf0 70 41 75 78 44 61 74 61 3b 0a 20 20 77 68 69 6c  pAuxData;.  whil
13d00 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75  e( *pp ){.    Au
13d10 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70  xData *pAux = *p
13d20 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c  p;.    if( (iOp<
13d30 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78  0).     || (pAux
13d40 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70  ->iOp==iOp && (p
13d50 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20  Aux->iArg>31 || 
13d60 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54  !(mask & MASKBIT
13d70 33 32 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29  32(pAux->iArg)))
13d80 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74  ).    ){.      t
13d90 65 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69  estcase( pAux->i
13da0 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  Arg==31 );.     
13db0 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
13dc0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  te ){.        pA
13dd0 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78  ux->xDelete(pAux
13de0 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
13df0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75  .      *pp = pAu
13e00 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
13e10 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 56  sqlite3DbFree(pV
13e20 64 62 65 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a  dbe->db, pAux);.
13e30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13e40 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78   pp= &pAux->pNex
13e50 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t;.    }.  }.}..
13e60 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d  /*.** Free all m
13e70 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
13e80 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70   with the Vdbe p
13e90 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
13ea0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
13eb0 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65   except for obje
13ec0 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68  ct itself, which
13ed0 20 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a   is preserved..*
13ee0 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
13ef0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
13f00 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71   function and sq
13f10 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
13f20 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62  ) is that.** Vdb
13f30 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75  eDelete() also u
13f40 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20  nlinks the Vdbe 
13f50 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
13f60 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20   VMs associated 
13f70 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61  with.** the data
13f80 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
13f90 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f 62  and frees the ob
13fa0 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a  ject itself..*/.
13fb0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
13fc0 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69  ClearObject(sqli
13fd0 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
13fe0 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  ){.  SubProgram 
13ff0 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20  *pSub, *pNext;. 
14000 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
14010 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d  ( p->db==0 || p-
14020 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c  >db==db );.  rel
14030 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
14040 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a  aVar, p->nVar);.
14050 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
14060 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
14070 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
14080 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70  NAME_N);.  for(p
14090 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b  Sub=p->pProgram;
140a0 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78   pSub; pSub=pNex
140b0 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
140c0 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSub->pNext;.   
140d0 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
140e0 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20  (db, pSub->aOp, 
140f0 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20  pSub->nOp);.    
14100 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14110 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66  , pSub);.  }.  f
14120 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b  or(i=p->nzVar-1;
14130 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69   i>=0; i--) sqli
14140 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14150 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64  >azVar[i]);.  vd
14160 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
14170 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70  , p->aOp, p->nOp
14180 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
14190 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
141a0 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
141b0 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c  Free(db, p->zSql
141c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
141d0 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29  ee(db, p->pFree)
141e0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
141f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
14200 5f 45 58 50 4c 41 49 4e 29 0a 20 20 73 71 6c 69  _EXPLAIN).  sqli
14210 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14220 3e 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 73 71  >zExplain);.  sq
14230 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14240 70 2d 3e 70 45 78 70 6c 61 69 6e 29 3b 0a 23 65  p->pExplain);.#e
14250 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ndif.}../*.** De
14260 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56  lete an entire V
14270 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  DBE..*/.void sql
14280 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56  ite3VdbeDelete(V
14290 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
142a0 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e  e3 *db;..  if( N
142b0 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
142c0 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  urn;.  db = p->d
142d0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
142e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
142f0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
14300 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72  sqlite3VdbeClear
14310 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20  Object(db, p);. 
14320 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
14330 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
14340 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
14350 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
14360 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d  sert( db->pVdbe=
14370 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56  =p );.    db->pV
14380 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  dbe = p->pNext;.
14390 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65    }.  if( p->pNe
143a0 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
143b0 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
143c0 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  Prev;.  }.  p->m
143d0 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
143e0 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20  C_DEAD;.  p->db 
143f0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  = 0;.  sqlite3Db
14400 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
14410 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
14420 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20  the cursor p is 
14430 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72  ready to read or
14440 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74   write the row t
14450 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61  o which it.** wa
14460 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65  s last positione
14470 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  d.  Return an er
14480 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f  ror code if an O
14490 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20  OM fault or I/O 
144a0 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74  error.** prevent
144b0 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69  s us from positi
144c0 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  oning the cursor
144d0 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
144e0 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  position..**.** 
144f0 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72  If a MoveTo oper
14500 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67  ation is pending
14510 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75   on the given cu
14520 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68  rsor, then do th
14530 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77  at.** MoveTo now
14540 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73  .  If no move is
14550 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20   pending, check 
14560 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f  to see if the ro
14570 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65  w has been.** de
14580 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
14590 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20  nder the cursor 
145a0 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d  and if it has, m
145b0 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a  ark the row as.*
145c0 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a  * a NULL row..**
145d0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f  .** If the curso
145e0 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69  r is already poi
145f0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72  nting to the cor
14600 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61  rect row and tha
14610 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74  t row has.** not
14620 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
14630 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
14640 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68   cursor, then th
14650 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
14660 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
14670 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
14680 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
14690 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64   *p){.  if( p->d
146a0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
146b0 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63  .    int res, rc
146c0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
146d0 54 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20  TEST.    extern 
146e0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
146f0 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  ch_count;.#endif
14700 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
14710 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72  isTable );.    r
14720 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
14730 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
14740 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  ->pCursor, 0, p-
14750 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
14760 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
14770 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
14780 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69  .    p->lastRowi
14790 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72  d = p->movetoTar
147a0 67 65 74 3b 0a 20 20 20 20 69 66 28 20 72 65 73  get;.    if( res
147b0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=0 ) return SQL
147c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
147d0 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73  ;.    p->rowidIs
147e0 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66 64 65  Valid = 1;.#ifde
147f0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
14800 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
14810 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
14820 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64  .    p->deferred
14830 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
14840 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
14850 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
14860 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 43 75  }else if( p->pCu
14870 72 73 6f 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  rsor ){.    int 
14880 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e  hasMoved;.    in
14890 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  t rc = sqlite3Bt
148a0 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
148b0 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68  d(p->pCursor, &h
148c0 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69 66  asMoved);.    if
148d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
148e0 3b 0a 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76  ;.    if( hasMov
148f0 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63  ed ){.      p->c
14900 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
14910 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20  HE_STALE;.      
14920 69 66 28 20 68 61 73 4d 6f 76 65 64 3d 3d 32 20  if( hasMoved==2 
14930 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31  ) p->nullRow = 1
14940 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
14950 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14960 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
14970 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
14980 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
14990 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
149a0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
149b0 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
149c0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
149d0 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
149e0 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
149f0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
14a00 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a  SerialGet().**.*
14a10 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
14a20 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
14a30 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
14a40 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
14a50 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
14a60 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
14a70 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
14a80 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
14a90 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
14aa0 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
14ab0 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
14ac0 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
14ad0 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
14ae0 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
14af0 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
14b00 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
14b10 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
14b20 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
14b30 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
14b40 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
14b50 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
14b60 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
14b70 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
14b80 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
14b90 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
14ba0 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
14bb0 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
14bc0 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
14bd0 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
14be0 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
14bf0 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
14c00 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
14c10 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
14c20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
14c30 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61  data blob separa
14c40 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
14c50 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
14c60 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
14c70 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
14c80 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
14c90 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
14ca0 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
14cb0 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
14cc0 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
14cd0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
14ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
14cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
14d00 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
14d10 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
14d20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
14d30 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
14d40 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
14d50 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
14d60 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
14d70 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
14d80 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
14d90 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
14da0 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
14db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14dc0 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
14dd0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
14de0 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
14df0 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
14e00 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
14e10 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
14e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e30 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
14e40 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
14e50 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
14e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
14e70 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
14e80 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
14e90 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
14ea0 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
14eb0 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
14ec0 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
14ee0 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
14ef0 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
14f00 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
14f10 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
14f20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
14f30 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
14f40 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
14f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f60 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
14f70 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
14f80 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
14f90 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
14fa0 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
14fb0 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
14fc0 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
14fd0 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
14fe0 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
14ff0 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
15000 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
15010 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
15020 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
15030 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
15040 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
15050 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
15060 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
15070 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
15080 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
15090 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
150a0 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
150b0 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
150c0 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
150d0 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c  ormat){.  int fl
150e0 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
150f0 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69  s;.  int n;..  i
15100 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
15110 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
15120 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
15130 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  gs&MEM_Int ){.  
15140 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
15150 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31  whether to use 1
15160 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62  , 2, 4, 6 or 8 b
15170 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66  ytes. */.#   def
15180 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28  ine MAX_6BYTE ((
15190 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30  ((i64)0x00008000
151a0 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36  )<<32)-1).    i6
151b0 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b  4 i = pMem->u.i;
151c0 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20  .    u64 u;.    
151d0 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20  if( i<0 ){.     
151e0 20 69 66 28 20 69 3c 28 2d 4d 41 58 5f 36 42 59   if( i<(-MAX_6BY
151f0 54 45 29 20 29 20 72 65 74 75 72 6e 20 36 3b 0a  TE) ) return 6;.
15200 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
15210 73 20 74 65 73 74 20 70 72 65 76 65 6e 74 73 3a  s test prevents:
15220 20 20 75 20 3d 20 2d 28 2d 39 32 32 33 33 37 32    u = -(-9223372
15230 30 33 36 38 35 34 37 37 35 38 30 38 29 20 2a 2f  036854775808) */
15240 0a 20 20 20 20 20 20 75 20 3d 20 2d 69 3b 0a 20  .      u = -i;. 
15250 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15260 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  u = i;.    }.   
15270 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20   if( u<=127 ){. 
15280 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 69 26       return ((i&
15290 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f  1)==i && file_fo
152a0 72 6d 61 74 3e 3d 34 29 20 3f 20 38 2b 28 75 33  rmat>=4) ? 8+(u3
152b0 32 29 75 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20  2)u : 1;.    }. 
152c0 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
152d0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
152e0 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
152f0 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69   return 3;.    i
15300 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
15310 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20   ) return 4;.   
15320 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54   if( u<=MAX_6BYT
15330 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20  E ) return 5;.  
15340 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
15350 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
15360 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Real ){.    retu
15370 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 7;.  }.  asse
15380 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61  rt( pMem->db->ma
15390 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c  llocFailed || fl
153a0 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
153b0 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20  _Blob) );.  n = 
153c0 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66  pMem->n;.  if( f
153d0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
153e0 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d  ){.    n += pMem
153f0 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20  ->u.nZero;.  }. 
15400 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b   assert( n>=0 );
15410 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29  .  return ((n*2)
15420 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26   + 12 + ((flags&
15430 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d  MEM_Str)!=0));.}
15440 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
15450 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
15460 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64   data correspond
15470 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
15480 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e  ied serial-type.
15490 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
154a0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
154b0 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
154c0 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  ){.  if( serial_
154d0 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
154e0 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
154f0 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c  ype-12)/2;.  }el
15500 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  se{.    static c
15510 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20  onst u8 aSize[] 
15520 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20  = { 0, 1, 2, 3, 
15530 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30  4, 6, 8, 8, 0, 0
15540 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65  , 0, 0 };.    re
15550 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61  turn aSize[seria
15560 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a  l_type];.  }.}..
15570 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
15580 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75  on an architectu
15590 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e  re with mixed-en
155a0 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a  dian floating .*
155b0 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52  * points (ex: AR
155c0 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68  M7) then swap th
155d0 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20  e lower 4 bytes 
155e0 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70  with the .** upp
155f0 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74  er 4 bytes.  Ret
15600 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
15610 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61  **.** For most a
15620 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68  rchitectures, th
15630 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
15640 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49  *.** (later):  I
15650 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f  t is reported to
15660 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78   me that the mix
15670 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65  ed-endian proble
15680 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20  m.** on ARM7 is 
15690 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43  an issue with GC
156a0 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20  C, not with the 
156b0 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73  ARM7 chip.  It s
156c0 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72  eems.** that ear
156d0 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  ly versions of G
156e0 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77  CC stored the tw
156f0 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d  o words of a 64-
15700 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20  bit.** float in 
15710 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e  the wrong order.
15720 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72    And that error
15730 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67   has been propag
15740 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e  ated.** ever sin
15750 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69  ce.  The blame i
15760 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
15770 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75  y with GCC, thou
15780 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74  gh..** GCC might
15790 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69   have just copyi
157a0 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66  ng the problem f
157b0 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70  rom a prior comp
157c0 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c  iler..** I am al
157d0 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77  so told that new
157e0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  er versions of G
157f0 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61  CC that follow a
15800 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42   different.** AB
15810 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f  I get the byte o
15820 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a  rder right..**.*
15830 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69  * Developers usi
15840 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20  ng SQLite on an 
15850 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70  ARM7 should comp
15860 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69  ile and run thei
15870 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e  r.** application
15880 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
15890 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74  DEBUG=1 at least
158a0 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42   once.  With DEB
158b0 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73  UG.** enabled, s
158c0 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f  ome asserts belo
158d0 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68  w will ensure th
158e0 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  at the byte orde
158f0 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67  r of.** floating
15900 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73   point values is
15910 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20   correct..**.** 
15920 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72  (2007-08-30)  Fr
15930 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73  ank van Vugt has
15940 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72   studied this pr
15950 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a  oblem closely.**
15960 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69   and has send hi
15970 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68  s findings to th
15980 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70  e SQLite develop
15990 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77  ers.  Frank.** w
159a0 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20  rites that some 
159b0 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66  Linux kernels of
159c0 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  fer floating poi
159d0 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65  nt hardware.** e
159e0 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73  mulation that us
159f0 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d  es only 32-bit m
15a00 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64  antissas instead
15a10 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34   of a full .** 4
15a20 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72  8-bits as requir
15a30 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73  ed by the IEEE s
15a40 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20  tandard.  (This 
15a50 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47  is the.** CONFIG
15a60 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74  _FPE_FASTFPE opt
15a70 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73  ion.)  On such s
15a80 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67  ystems, floating
15a90 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73   point.** byte s
15aa0 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20  wapping becomes 
15ab0 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64  very complicated
15ac0 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62  .  To avoid prob
15ad0 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63  lems,.** the nec
15ae0 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70  essary byte swap
15af0 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20  ping is carried 
15b00 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62  out using a 64-b
15b10 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61  it integer.** ra
15b20 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62  ther than a 64-b
15b30 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b  it float.  Frank
15b40 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74   assures us that
15b50 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a   the code here.*
15b60 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e  * works for him.
15b70 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f    We, the develo
15b80 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61  pers, have no wa
15b90 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74  y to independent
15ba0 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69  ly.** verify thi
15bb0 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65  s, but Frank see
15bc0 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20  ms to know what 
15bd0 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62  he is talking ab
15be0 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75  out.** so we tru
15bf0 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65  st him..*/.#ifde
15c00 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
15c10 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
15c20 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f  T.static u64 flo
15c30 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a  atSwap(u64 in){.
15c40 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36    union {.    u6
15c50 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32  4 r;.    u32 i[2
15c60 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20  ];.  } u;.  u32 
15c70 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a  t;..  u.r = in;.
15c80 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20    t = u.i[0];.  
15c90 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b  u.i[0] = u.i[1];
15ca0 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20  .  u.i[1] = t;. 
15cb0 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23   return u.r;.}.#
15cc0 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
15cd0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20  dEndianFloat(X) 
15ce0 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58   X = floatSwap(X
15cf0 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
15d00 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
15d10 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a  Float(X).#endif.
15d20 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
15d30 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61   serialized data
15d40 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61   blob for the va
15d50 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
15d60 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e  em into .** buf.
15d70 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
15d80 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
15d90 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66  as allocated suf
15da0 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a  ficient space..*
15db0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
15dc0 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
15dd0 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66  tten..**.** nBuf
15de0 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   is the amount o
15df0 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20  f space left in 
15e00 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c  buf[].  The call
15e10 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
15e20 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74  e.** for allocat
15e30 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65  ing enough space
15e40 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c   to buf[] to hol
15e50 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65  d the entire fie
15e60 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  ld, exclusive.**
15e70 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e   of the pMem->u.
15e80 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20  nZero bytes for 
15e90 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65  a MEM_Zero value
15ea0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
15eb0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
15ec0 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  es actually writ
15ed0 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20  ten into buf[]. 
15ee0 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   The number.** o
15ef0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a  f bytes in the z
15f00 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20  ero-filled tail 
15f10 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  is included in t
15f20 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
15f30 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65  only.** if those
15f40 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f   bytes were zero
15f50 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20  ed in buf[]..*/ 
15f60 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
15f70 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75  SerialPut(u8 *bu
15f80 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33  f, Mem *pMem, u3
15f90 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
15fa0 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a    u32 len;..  /*
15fb0 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61   Integer and Rea
15fc0 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  l */.  if( seria
15fd0 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72  l_type<=7 && ser
15fe0 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20  ial_type>0 ){.  
15ff0 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32    u64 v;.    u32
16000 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69   i;.    if( seri
16010 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
16020 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
16030 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d  of(v)==sizeof(pM
16040 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20  em->r) );.      
16050 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d  memcpy(&v, &pMem
16060 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b  ->r, sizeof(v));
16070 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
16080 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a  EndianFloat(v);.
16090 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
160a0 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   v = pMem->u.i;.
160b0 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
160c0 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  i = sqlite3VdbeS
160d0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
160e0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 77  ial_type);.    w
160f0 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20  hile( i-- ){.   
16100 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 75 38 29     buf[i] = (u8)
16110 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20  (v&0xFF);.      
16120 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20  v >>= 8;.    }. 
16130 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
16140 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20   }..  /* String 
16150 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28  or blob */.  if(
16160 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
16170 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16180 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d  pMem->n + ((pMem
16190 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
161a0 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  ro)?pMem->u.nZer
161b0 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  o:0).           
161c0 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65    == (int)sqlite
161d0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
161e0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20  en(serial_type) 
161f0 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
16200 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79  m->n;.    memcpy
16210 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c  (buf, pMem->z, l
16220 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  en);.    return 
16230 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  len;.  }..  /* N
16240 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73  ULL or constants
16250 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74   0 or 1 */.  ret
16260 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70  urn 0;.}../* Inp
16270 75 74 20 22 78 22 20 69 73 20 61 20 73 65 71 75  ut "x" is a sequ
16280 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64  ence of unsigned
16290 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74   characters that
162a0 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20   represent a.** 
162b0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
162c0 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
162d0 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76  equivalent nativ
162e0 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65  e integer.*/.#de
162f0 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  fine ONE_BYTE_IN
16300 54 28 78 29 20 20 20 20 28 28 69 38 29 28 78 29  T(x)    ((i8)(x)
16310 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f  [0]).#define TWO
16320 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20  _BYTE_INT(x)    
16330 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  (256*(i8)((x)[0]
16340 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e  )|(x)[1]).#defin
16350 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  e THREE_BYTE_INT
16360 28 78 29 20 20 28 36 35 35 33 36 2a 28 69 38 29  (x)  (65536*(i8)
16370 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d  ((x)[0])|((x)[1]
16380 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65  <<8)|(x)[2]).#de
16390 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55  fine FOUR_BYTE_U
163a0 49 4e 54 28 78 29 20 20 28 28 28 75 33 32 29 28  INT(x)  (((u32)(
163b0 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b  x)[0]<<24)|((x)[
163c0 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c  1]<<16)|((x)[2]<
163d0 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a  <8)|(x)[3])../*.
163e0 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
163f0 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
16400 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
16410 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
16420 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
16430 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
16440 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
16450 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
16460 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20   bytes read..*/ 
16470 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
16480 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
16490 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
164a0 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
164b0 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
164c0 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
164d0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
164e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
164f0 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
16500 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
16510 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
16520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16530 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
16540 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
16550 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 3b 0a 20  */.){.  u64 x;. 
16560 20 75 33 32 20 79 3b 0a 20 20 73 77 69 74 63 68   u32 y;.  switch
16570 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
16580 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20  .    case 10:   
16590 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
165a0 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
165b0 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20    case 11:   /* 
165c0 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
165d0 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
165e0 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c  ase 0: {  /* NUL
165f0 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  L */.      pMem-
16600 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
16610 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
16620 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
16630 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69  : { /* 1-byte si
16640 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
16650 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
16660 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62  = ONE_BYTE_INT(b
16670 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
16680 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
16690 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
166a0 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
166b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
166c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
166d0 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
166e0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
166f0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
16700 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28   = TWO_BYTE_INT(
16710 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
16720 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
16730 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
16740 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
16750 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
16760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
16770 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
16780 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
16790 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
167a0 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49  i = THREE_BYTE_I
167b0 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
167c0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
167d0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
167e0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
167f0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
16800 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 3;.    }.    c
16810 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79  ase 4: { /* 4-by
16820 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
16830 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46  r */.      y = F
16840 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
16850 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
16860 75 2e 69 20 3d 20 28 69 36 34 29 2a 28 69 6e 74  u.i = (i64)*(int
16870 2a 29 26 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d  *)&y;.      pMem
16880 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
16890 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
168a0 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
168b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34  ;.      return 4
168c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
168d0 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
168e0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
168f0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
16900 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  i = FOUR_BYTE_UI
16910 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69  NT(buf+2) + (((i
16920 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
16930 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
16940 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
16950 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
16960 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
16970 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
16980 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a  return 6;.    }.
16990 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a      case 6:   /*
169a0 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
169b0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61  nteger */.    ca
169c0 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20  se 7: { /* IEEE 
169d0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a  floating point *
169e0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  /.#if !defined(N
169f0 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
16a00 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
16a10 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
16a20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
16a30 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64  hat integers and
16a40 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
16a50 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73  values use the s
16a60 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
16a70 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68  e order.  Or, th
16a80 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58  at if SQLITE_MIX
16a90 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
16aa0 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a  FLOAT is.      *
16ab0 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36  * defined that 6
16ac0 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
16ad0 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c  oint values real
16ae0 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20  ly are mixed.   
16af0 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20     ** endian..  
16b00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61      */.      sta
16b10 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
16b20 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
16b30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20  000)<<32;.      
16b40 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75  static const dou
16b50 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20  ble r1 = 1.0;.  
16b60 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b      u64 t2 = t1;
16b70 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
16b80 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b  EndianFloat(t2);
16b90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
16ba0 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f  izeof(r1)==sizeo
16bb0 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28  f(t2) && memcmp(
16bc0 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66  &r1, &t2, sizeof
16bd0 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  (r1))==0 );.#end
16be0 69 66 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55  if.      x = FOU
16bf0 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29  R_BYTE_UINT(buf)
16c00 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52  ;.      y = FOUR
16c10 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34  _BYTE_UINT(buf+4
16c20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  );.      x = (x<
16c30 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20  <32) | y;.      
16c40 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
16c50 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =6 ){.        pM
16c60 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
16c70 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  )&x;.        pMe
16c80 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
16c90 6e 74 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  nt;.        test
16ca0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
16cb0 30 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0 );.      }else
16cc0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
16cd0 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
16ce0 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72  & sizeof(pMem->r
16cf0 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20  )==8 );.        
16d00 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
16d10 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20  loat(x);.       
16d20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72   memcpy(&pMem->r
16d30 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29  , &x, sizeof(x))
16d40 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
16d50 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49  flags = sqlite3I
16d60 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20  sNaN(pMem->r) ? 
16d70 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52  MEM_Null : MEM_R
16d80 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eal;.      }.   
16d90 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20     return 8;.   
16da0 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20   }.    case 8:  
16db0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a    /* Integer 0 *
16dc0 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20  /.    case 9: { 
16dd0 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f   /* Integer 1 */
16de0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
16df0 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38   = serial_type-8
16e00 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
16e10 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
16e20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
16e30 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
16e40 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  : {.      static
16e50 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67   const u16 aFlag
16e60 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c  [] = { MEM_Blob|
16e70 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53  MEM_Ephem, MEM_S
16e80 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a  tr|MEM_Ephem };.
16e90 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20 3d 20        u32 len = 
16ea0 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
16eb0 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
16ec0 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
16ed0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
16ee0 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d   len;.      pMem
16ef0 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20  ->xDel = 0;.    
16f00 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
16f10 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70  aFlag[serial_typ
16f20 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75  e&1];.      retu
16f30 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20  rn len;.    }.  
16f40 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
16f50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
16f60 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61  ine is used to a
16f70 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65  llocate sufficie
16f80 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20  nt space for an 
16f90 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a  UnpackedRecord.*
16fa0 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67  * structure larg
16fb0 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75  e enough to be u
16fc0 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  sed with sqlite3
16fd0 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
16fe0 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72  () if.** the fir
16ff0 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
17000 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49   pointer to KeyI
17010 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b  nfo structure pK
17020 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  eyInfo..**.** Th
17030 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65  e space is eithe
17040 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  r allocated usin
17050 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  g sqlite3DbMallo
17060 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77  cRaw() or from w
17070 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61  ithin.** the una
17080 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61  ligned buffer pa
17090 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63  ssed via the sec
170a0 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72  ond and third ar
170b0 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61  guments (presuma
170c0 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61  bly.** stack spa
170d0 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d  ce). If the form
170e0 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65  er, then *ppFree
170f0 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69   is set to a poi
17100 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64  nter that should
17110 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c  .** be eventuall
17120 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  y freed by the c
17130 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
17140 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c  te3DbFree(). Or,
17150 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f   if the .** allo
17160 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f  cation comes fro
17170 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53  m the pSpace/szS
17180 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70  pace buffer, *pp
17190 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Free is set to N
171a0 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65  ULL.** before re
171b0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
171c0 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
171d0 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
171e0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61  eturned..*/.Unpa
171f0 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69  ckedRecord *sqli
17200 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
17210 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65  ckedRecord(.  Ke
17220 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
17230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17240 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
17250 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
17260 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20  char *pSpace,   
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17280 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61  /* Unaligned spa
17290 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ce available */.
172a0 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20    int szSpace,  
172b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172c0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70    /* Size of pSp
172d0 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  ace[] in bytes *
172e0 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65  /.  char **ppFre
172f0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
17300 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c      /* OUT: Call
17310 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74  er should free t
17320 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29  his pointer */.)
17330 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  {.  UnpackedReco
17340 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  rd *p;          
17350 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20      /* Unpacked 
17360 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e  record to return
17370 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20   */.  int nOff; 
17380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17390 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65        /* Increme
173a0 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66  nt pSpace by nOf
173b0 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f  f to align it */
173c0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
173f0 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66  bytes required f
17400 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57  or *p */..  /* W
17410 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20  e want to shift 
17420 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61  the pointer pSpa
17430 63 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20  ce up such that 
17440 69 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69  it is 8-byte ali
17450 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c  gned..  ** Thus,
17460 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63   we need to calc
17470 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e  ulate a value, n
17480 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61  Off, between 0 a
17490 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a  nd 7, to shift .
174a0 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20    ** it by.  If 
174b0 70 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64  pSpace is alread
174c0 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  y 8-byte aligned
174d0 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65  , nOff should be
174e0 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f   zero..  */.  nO
174f0 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54  ff = (8 - (SQLIT
17500 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70  E_PTR_TO_INT(pSp
17510 61 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a  ace) & 7)) & 7;.
17520 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
17530 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
17540 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f  Record)) + sizeo
17550 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f  f(Mem)*(pKeyInfo
17560 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69  ->nField+1);.  i
17570 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65  f( nByte>szSpace
17580 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d  +nOff ){.    p =
17590 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
175a0 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
175b0 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e  ocRaw(pKeyInfo->
175c0 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
175d0 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61 72 20  *ppFree = (char 
175e0 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20  *)p;.    if( !p 
175f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65  ) return 0;.  }e
17600 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e  lse{.    p = (Un
17610 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70  packedRecord*)&p
17620 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20  Space[nOff];.   
17630 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20   *ppFree = 0;.  
17640 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28  }..  p->aMem = (
17650 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29  Mem*)&((char*)p)
17660 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55  [ROUND8(sizeof(U
17670 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d  npackedRecord))]
17680 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
17690 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
176a0 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79  !=0 );.  p->pKey
176b0 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
176c0 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  .  p->nField = p
176d0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
176e0 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  + 1;.  return p;
176f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
17700 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e  the nKey-byte en
17710 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f  coding of a reco
17720 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f  rd in pKey[], po
17730 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55  pulate the .** U
17740 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
17750 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
17760 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20  d by the fourth 
17770 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68  argument with th
17780 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
17790 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63   the decoded rec
177a0 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ord..*/ .void sq
177b0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
177c0 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f  npack(.  KeyInfo
177d0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
177e0 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
177f0 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20  bout the record 
17800 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20  format */.  int 
17810 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
17820 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
17830 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
17840 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
17850 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54  *pKey,      /* T
17860 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
17870 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
17880 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20  cord *p      /* 
17890 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74  Populate this st
178a0 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72  ructure before r
178b0 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a  eturning. */.){.
178c0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
178d0 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
178e0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
178f0 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74  ar *)pKey;.  int
17900 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20   d; .  u32 idx; 
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17920 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
17930 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65   in aKey[] to re
17940 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36  ad from */.  u16
17950 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
17960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17970 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
17980 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
17990 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
179a0 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20  m = p->aMem;..  
179b0 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20  p->default_rc = 
179c0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  0;.  assert( EIG
179d0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
179e0 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78  T(pMem) );.  idx
179f0 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
17a00 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64  Key, szHdr);.  d
17a10 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20   = szHdr;.  u = 
17a20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  0;.  while( idx<
17a30 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46  szHdr && u<p->nF
17a40 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65 79 20  ield && d<=nKey 
17a50 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
17a60 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78  l_type;..    idx
17a70 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
17a80 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69  &aKey[idx], seri
17a90 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d  al_type);.    pM
17aa0 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em->enc = pKeyIn
17ab0 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65  fo->enc;.    pMe
17ac0 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m->db = pKeyInfo
17ad0 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65  ->db;.    /* pMe
17ae0 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f  m->flags = 0; //
17af0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17b00 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74  alGet() will set
17b10 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a   this for us */.
17b20 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f      pMem->zMallo
17b30 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20  c = 0;.    d += 
17b40 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17b50 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73  lGet(&aKey[d], s
17b60 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d  erial_type, pMem
17b70 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  );.    pMem++;. 
17b80 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73     u++;.  }.  as
17b90 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66  sert( u<=pKeyInf
17ba0 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b  o->nField + 1 );
17bb0 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75  .  p->nField = u
17bc0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
17bd0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DEBUG./*.** This
17be0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
17bf0 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20  es two index or 
17c00 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79  table record key
17c10 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61  s in the same wa
17c20 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69  y.** as the sqli
17c30 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
17c40 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20  pare() routine. 
17c50 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72  Unlike VdbeRecor
17c60 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74  dCompare(),.** t
17c70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
17c80 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f  erializes and co
17c90 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20 75 73  mpares values us
17ca0 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ing the.** sqlit
17cb0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
17cc0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d  ) and sqlite3Mem
17cd0 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69  Compare() functi
17ce0 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a  ons. It is used.
17cf0 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 73  ** in assert() s
17d00 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
17d10 75 72 65 20 74 68 61 74 20 74 68 65 20 6f 70 74  ure that the opt
17d20 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a  imized code in.*
17d30 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  * sqlite3VdbeRec
17d40 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74  ordCompare() ret
17d50 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74  urns results wit
17d60 68 20 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d  h these two prim
17d70 69 74 69 76 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  itives..*/.stati
17d80 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
17d90 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20  CompareDebug(.  
17da0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
17db0 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
17dc0 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63   Left key */.  c
17dd0 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63  onst UnpackedRec
17de0 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 2f 2a 20  ord *pPKey2  /* 
17df0 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
17e00 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20    u32 d1;       
17e10 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
17e20 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
17e30 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
17e40 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
17e50 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
17e60 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
17e70 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65   next header ele
17e80 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ment */.  u32 sz
17e90 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  Hdr1;        /* 
17ea0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
17eb0 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
17ec0 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
17ed0 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  rc = 0;.  const 
17ee0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
17ef0 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
17f00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
17f10 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ey1;.  KeyInfo *
17f20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20  pKeyInfo;.  Mem 
17f30 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66  mem1;..  pKeyInf
17f40 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  o = pPKey2->pKey
17f50 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63  Info;.  mem1.enc
17f60 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
17f70 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b  ;.  mem1.db = pK
17f80 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a  eyInfo->db;.  /*
17f90 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b   mem1.flags = 0;
17fa0 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69    // Will be ini
17fb0 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69  tialized by sqli
17fc0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
17fd0 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59  () */.  VVA_ONLY
17fe0 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d  ( mem1.zMalloc =
17ff0 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
18000 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
18010 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a   statements */..
18020 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d    /* Compilers m
18030 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74  ay complain that
18040 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74   mem1.u.i is pot
18050 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69  entially uniniti
18060 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20  alized..  ** We 
18070 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65  could initialize
18080 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65   it, as shown he
18090 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74  re, to silence t
180a0 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e  hose complaints.
180b0 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63  .  ** But in fac
180c0 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c  t, mem1.u.i will
180d0 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20   never actually 
180e0 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61  be used uninitia
180f0 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67  lized, and doing
18100 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63   .  ** the unnec
18110 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a  essary initializ
18120 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73  ation has a meas
18130 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20  urable negative 
18140 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a  performance.  **
18150 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74   impact, since t
18160 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
18170 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65   very high runne
18180 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63  r.  And so, we c
18190 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67  hoose.  ** to ig
181a0 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  nore the compile
181b0 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c  r warnings and l
181c0 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62  eave this variab
181d0 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  le uninitialized
181e0 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d  ..  */.  /*  mem
181f0 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e  1.u.i = 0;  // n
18200 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20  ot needed, here 
18210 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69  to silence compi
18220 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20  ler warning */. 
18230 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61   .  idx1 = getVa
18240 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
18250 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a  Hdr1);.  d1 = sz
18260 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20  Hdr1;.  assert( 
18270 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
18280 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65  +pKeyInfo->nXFie
18290 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65  ld>=pPKey2->nFie
182a0 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ld || CORRUPT_DB
182b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
182c0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
182d0 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
182e0 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  t( pKeyInfo->nFi
182f0 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  eld>0 );.  asser
18300 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20  t( idx1<=szHdr1 
18310 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
18320 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73  .  do{.    u32 s
18330 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20  erial_type1;..  
18340 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
18350 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
18360 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
18370 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
18380 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56      idx1 += getV
18390 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69  arint32( aKey1+i
183a0 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx1, serial_type
183b0 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72  1 );..    /* Ver
183c0 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20 69  ify that there i
183d0 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61  s enough key spa
183e0 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20  ce remaining to 
183f0 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62  avoid.    ** a b
18400 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20  uffer overread. 
18410 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f   The "d1+serial_
18420 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70 72  type1+2" subexpr
18430 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20  ession will.    
18440 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72 65  ** always be gre
18450 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
18460 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74  al to the amount
18470 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65 79   of required key
18480 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55   space..    ** U
18490 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d  se that approxim
184a0 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74  ation to avoid t
184b0 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76  he more expensiv
184c0 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  e call to.    **
184d0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
184e0 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74  alTypeLen() in t
184f0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
18500 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64      */.    if( d
18510 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  1+serial_type1+2
18520 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20  >(u32)nKey1.    
18530 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64   && d1+sqlite3Vd
18540 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
18550 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75  serial_type1)>(u
18560 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b  32)nKey1 .    ){
18570 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18580 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72    }..    /* Extr
18590 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  act the values t
185a0 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20  o be compared.. 
185b0 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20     */.    d1 += 
185c0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
185d0 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
185e0 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26   serial_type1, &
185f0 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  mem1);..    /* D
18600 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
18610 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
18620 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
18630 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79  re(&mem1, &pPKey
18640 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79  2->aMem[i], pKey
18650 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b  Info->aColl[i]);
18660 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
18670 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
18680 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  mem1.zMalloc==0 
18690 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65  );  /* See comme
186a0 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  nt below */.    
186b0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
186c0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
186d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72  .        rc = -r
186e0 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68  c;  /* Invert th
186f0 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53  e result for DES
18700 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f  C sort order. */
18710 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
18720 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
18730 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c      i++;.  }whil
18740 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
18750 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
18760 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  ld );..  /* No m
18770 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
18780 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
18790 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
187a0 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
187b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
187c0 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
187d0 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
187e0 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
187f0 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
18800 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
18810 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
18820 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20  elease(&mem1).. 
18830 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
18840 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  m1.zMalloc==0 );
18850 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72  ..  /* rc==0 her
18860 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
18870 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
18880 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61   out of fields a
18890 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20  nd.  ** all the 
188a0 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61  fields up to tha
188b0 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75  t point were equ
188c0 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 74  al. Return the t
188d0 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20  he default_rc.  
188e0 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  ** value.  */.  
188f0 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64  return pPKey2->d
18900 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 23 65 6e  efault_rc;.}.#en
18910 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20  dif../*.** Both 
18920 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d  *pMem1 and *pMem
18930 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67  2 contain string
18940 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65   values. Compare
18950 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a   the two values.
18960 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  ** using the col
18970 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
18980 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c  pColl. As usual,
18990 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   return a negati
189a0 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ve , zero.** or 
189b0 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
189c0 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73  f *pMem1 is less
189d0 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
189e0 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
189f0 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70  .** *pMem2, resp
18a00 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61  ectively. Simila
18a10 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22  r in spirit to "
18a20 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20  rc = (*pMem1) - 
18a30 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73  (*pMem2);"..*/.s
18a40 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
18a50 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a  mpareMemString(.
18a60 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65    const Mem *pMe
18a70 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20  m1,.  const Mem 
18a80 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20  *pMem2,.  const 
18a90 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 0a 29  CollSeq *pColl.)
18aa0 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65  {.  if( pMem1->e
18ab0 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29  nc==pColl->enc )
18ac0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72  {.    /* The str
18ad0 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79  ings are already
18ae0 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
18af0 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20  encoding.  Call 
18b00 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70  the.     ** comp
18b10 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
18b20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20  directly */.    
18b30 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43  return pColl->xC
18b40 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
18b50 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e  pMem1->n,pMem1->
18b60 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32  z,pMem2->n,pMem2
18b70 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->z);.  }else{. 
18b80 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63     int rc;.    c
18b90 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a  onst void *v1, *
18ba0 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20  v2;.    int n1, 
18bb0 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a  n2;.    Mem c1;.
18bc0 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20      Mem c2;.    
18bd0 6d 65 6d 73 65 74 28 26 63 31 2c 20 30 2c 20 73  memset(&c1, 0, s
18be0 69 7a 65 6f 66 28 63 31 29 29 3b 0a 20 20 20 20  izeof(c1));.    
18bf0 6d 65 6d 73 65 74 28 26 63 32 2c 20 30 2c 20 73  memset(&c2, 0, s
18c00 69 7a 65 6f 66 28 63 32 29 29 3b 0a 20 20 20 20  izeof(c2));.    
18c10 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
18c20 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70  allowCopy(&c1, p
18c30 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29  Mem1, MEM_Ephem)
18c40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
18c50 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
18c60 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f  &c2, pMem2, MEM_
18c70 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d  Ephem);.    v1 =
18c80 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
18c90 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t((sqlite3_value
18ca0 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  *)&c1, pColl->en
18cb0 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d  c);.    n1 = v1=
18cc0 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20  =0 ? 0 : c1.n;. 
18cd0 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56     v2 = sqlite3V
18ce0 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65  alueText((sqlite
18cf0 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43  3_value*)&c2, pC
18d00 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e  oll->enc);.    n
18d10 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20  2 = v2==0 ? 0 : 
18d20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70  c2.n;.    rc = p
18d30 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
18d40 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c  ->pUser, n1, v1,
18d50 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 73 71   n2, v2);.    sq
18d60 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
18d70 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71  ase(&c1);.    sq
18d80 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
18d90 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72 65  ase(&c2);.    re
18da0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a  turn rc;.  }.}..
18db0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
18dc0 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e  e values contain
18dd0 65 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65  ed by the two me
18de0 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75  mory cells, retu
18df0 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76  rning.** negativ
18e00 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74  e, zero or posit
18e10 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20  ive if pMem1 is 
18e20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
18e30 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a   to, or greater.
18e40 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53  ** than pMem2. S
18e50 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20  orting order is 
18e60 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f  NULL's first, fo
18e70 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72  llowed by number
18e80 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61  s (integers.** a
18e90 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64  nd reals) sorted
18ea0 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f   numerically, fo
18eb0 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f  llowed by text o
18ec0 72 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f  rdered by the co
18ed0 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
18ee0 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69  nce pColl and fi
18ef0 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64  nally blob's ord
18f00 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29  ered by memcmp()
18f10 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
18f20 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73   values are cons
18f30 69 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 20  idered equal by 
18f40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
18f50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d  /.int sqlite3Mem
18f60 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65  Compare(const Me
18f70 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20  m *pMem1, const 
18f80 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73  Mem *pMem2, cons
18f90 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  t CollSeq *pColl
18fa0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
18fb0 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74  nt f1, f2;.  int
18fc0 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b   combined_flags;
18fd0 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e  ..  f1 = pMem1->
18fe0 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d  flags;.  f2 = pM
18ff0 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f  em2->flags;.  co
19000 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66  mbined_flags = f
19010 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20  1|f2;.  assert( 
19020 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20  (combined_flags 
19030 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  & MEM_RowSet)==0
19040 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e   );. .  /* If on
19050 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c  e value is NULL,
19060 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
19070 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62   the other. If b
19080 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20  oth values.  ** 
19090 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e  are NULL, return
190a0 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63   0..  */.  if( c
190b0 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45  ombined_flags&ME
190c0 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65  M_Null ){.    re
190d0 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c  turn (f2&MEM_Nul
190e0 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c  l) - (f1&MEM_Nul
190f0 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  l);.  }..  /* If
19100 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20   one value is a 
19110 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 6f  number and the o
19120 74 68 65 72 20 69 73 20 6e 6f 74 2c 20 74 68 65  ther is not, the
19130 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 2e   number is less.
19140 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72  .  ** If both ar
19150 65 20 6e 75 6d 62 65 72 73 2c 20 63 6f 6d 70 61  e numbers, compa
19160 72 65 20 61 73 20 72 65 61 6c 73 20 69 66 20 6f  re as reals if o
19170 6e 65 20 69 73 20 61 20 72 65 61 6c 2c 20 6f 72  ne is a real, or
19180 20 61 73 20 69 6e 74 65 67 65 72 73 0a 20 20 2a   as integers.  *
19190 2a 20 69 66 20 62 6f 74 68 20 76 61 6c 75 65 73  * if both values
191a0 20 61 72 65 20 69 6e 74 65 67 65 72 73 2e 0a 20   are integers.. 
191b0 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
191c0 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e  ed_flags&(MEM_In
191d0 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20  t|MEM_Real) ){. 
191e0 20 20 20 64 6f 75 62 6c 65 20 72 31 2c 20 72 32     double r1, r2
191f0 3b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  ;.    if( (f1 & 
19200 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30  f2 & MEM_Int)!=0
19210 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d   ){.      if( pM
19220 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32  em1->u.i < pMem2
19230 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d  ->u.i ) return -
19240 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  1;.      if( pMe
19250 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d  m1->u.i > pMem2-
19260 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 31 3b  >u.i ) return 1;
19270 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
19280 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
19290 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20  f1&MEM_Real)!=0 
192a0 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 70 4d  ){.      r1 = pM
192b0 65 6d 31 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c 73  em1->r;.    }els
192c0 65 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e  e if( (f1&MEM_In
192d0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  t)!=0 ){.      r
192e0 31 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d  1 = (double)pMem
192f0 31 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73  1->u.i;.    }els
19300 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
19310 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
19320 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d   (f2&MEM_Real)!=
19330 30 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20  0 ){.      r2 = 
19340 70 4d 65 6d 32 2d 3e 72 3b 0a 20 20 20 20 7d 65  pMem2->r;.    }e
19350 6c 73 65 20 69 66 28 20 28 66 32 26 4d 45 4d 5f  lse if( (f2&MEM_
19360 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Int)!=0 ){.     
19370 20 72 32 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d   r2 = (double)pM
19380 65 6d 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65  em2->u.i;.    }e
19390 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
193a0 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
193b0 69 66 28 20 72 31 3c 72 32 20 29 20 72 65 74 75  if( r1<r2 ) retu
193c0 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 72  rn -1;.    if( r
193d0 31 3e 72 32 20 29 20 72 65 74 75 72 6e 20 31 3b  1>r2 ) return 1;
193e0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
193f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20   }..  /* If one 
19400 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
19410 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20  g and the other 
19420 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73  is a blob, the s
19430 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20  tring is less.. 
19440 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20   ** If both are 
19450 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65  strings, compare
19460 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
19470 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ting functions..
19480 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
19490 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74  ned_flags&MEM_St
194a0 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31  r ){.    if( (f1
194b0 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29   & MEM_Str)==0 )
194c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
194d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
194e0 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d  (f2 & MEM_Str)==
194f0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
19500 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n -1;.    }..   
19510 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e   assert( pMem1->
19520 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20  enc==pMem2->enc 
19530 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
19540 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
19550 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20  E_UTF8 || .     
19560 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e         pMem1->en
19570 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  c==SQLITE_UTF16L
19580 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  E || pMem1->enc=
19590 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  =SQLITE_UTF16BE 
195a0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
195b0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
195c0 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65  e must be define
195d0 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  d at this point,
195e0 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20   even if.    ** 
195f0 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 73  the user deletes
19600 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
19610 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 68  equence after th
19620 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69  e vdbe program i
19630 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65  s.    ** compile
19640 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20  d (this was not 
19650 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 29  always the case)
19660 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
19670 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70  ert( !pColl || p
19680 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20  Coll->xCmp );.. 
19690 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
196a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
196b0 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
196c0 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20  g(pMem1, pMem2, 
196d0 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  pColl);.    }.  
196e0 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70    /* If a NULL p
196f0 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65  ointer was passe
19700 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65  d as the collate
19710 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20   function, fall 
19720 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74  through.    ** t
19730 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20  o the blob case 
19740 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29  and use memcmp()
19750 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a  .  */.  }. .  /*
19760 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73   Both values mus
19770 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d  t be blobs.  Com
19780 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d  pare using memcm
19790 70 28 29 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20  p().  */.  rc = 
197a0 6d 65 6d 63 6d 70 28 70 4d 65 6d 31 2d 3e 7a 2c  memcmp(pMem1->z,
197b0 20 70 4d 65 6d 32 2d 3e 7a 2c 20 28 70 4d 65 6d   pMem2->z, (pMem
197c0 31 2d 3e 6e 3e 70 4d 65 6d 32 2d 3e 6e 29 3f 70  1->n>pMem2->n)?p
197d0 4d 65 6d 32 2d 3e 6e 3a 70 4d 65 6d 31 2d 3e 6e  Mem2->n:pMem1->n
197e0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
197f0 7b 0a 20 20 20 20 72 63 20 3d 20 70 4d 65 6d 31  {.    rc = pMem1
19800 2d 3e 6e 20 2d 20 70 4d 65 6d 32 2d 3e 6e 3b 0a  ->n - pMem2->n;.
19810 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19820 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .}.../*.** The f
19830 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
19840 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
19850 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61  ction is a seria
19860 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63  l-type that.** c
19870 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
19880 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76   integer - all v
19890 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20  alues between 1 
198a0 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20  and 9 inclusive 
198b0 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68  .** except 7. Th
198c0 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20  e second points 
198d0 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
198e0 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65  aining an intege
198f0 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61  r value.** seria
19900 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20  lized according 
19910 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20  to serial_type. 
19920 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
19930 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e  serializes.** an
19940 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61  d returns the va
19950 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
19960 36 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63  64 vdbeRecordDec
19970 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61  odeInt(u32 seria
19980 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38  l_type, const u8
19990 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79   *aKey){.  u32 y
199a0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
199b0 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61  UPT_DB || (seria
199c0 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72  l_type>=1 && ser
199d0 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73  ial_type<=9 && s
199e0 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29  erial_type!=7) )
199f0 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  ;.  switch( seri
19a00 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
19a10 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20  ase 0:.    case 
19a20 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  1:.      testcas
19a30 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
19a40 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
19a50 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  ONE_BYTE_INT(aKe
19a60 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a  y);.    case 2:.
19a70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19a80 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
19a90 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f        return TWO
19aa0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
19ab0 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20  .    case 3:.   
19ac0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
19ad0 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
19ae0 20 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f     return THREE_
19af0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
19b00 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20      case 4: {.  
19b10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
19b20 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
19b30 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54      y = FOUR_BYT
19b40 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
19b50 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29      return (i64)
19b60 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d  *(int*)&y;.    }
19b70 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20  .    case 5: {. 
19b80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
19b90 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
19ba0 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52       return FOUR
19bb0 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
19bc0 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
19bd0 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
19be0 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20  (aKey);.    }.  
19bf0 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20    case 6: {.    
19c00 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
19c10 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
19c20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19c30 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
19c40 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
19c50 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ) | FOUR_BYTE_UI
19c60 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20  NT(aKey+4);.    
19c70 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28    return (i64)*(
19c80 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20  i64*)&x;.    }. 
19c90 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65   }..  return (se
19ca0 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a  rial_type - 8);.
19cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
19cc0 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  nction compares 
19cd0 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f  the two table ro
19ce0 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f  ws or index reco
19cf0 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  rds.** specified
19d00 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79   by {nKey1, pKey
19d10 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20  1} and pPKey2.  
19d20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67  It returns a neg
19d30 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  ative, zero.** o
19d40 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67  r positive integ
19d50 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65  er if key1 is le
19d60 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
19d70 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72  o or .** greater
19d80 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65   than key2.  The
19d90 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
19da0 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c  key must be a bl
19db0 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79  ob.** created by
19dc0 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   th OP_MakeRecor
19dd0 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20  d opcode of the 
19de0 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79  VDBE.  The pPKey
19df0 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65  2.** key must be
19e00 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75   a parsed key su
19e10 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66  ch as obtained f
19e20 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
19e30 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a  beParseRecord..*
19e40 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
19e50 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   bSkip is non-ze
19e60 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ro, it is assume
19e70 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
19e80 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  r has already.**
19e90 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
19ea0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
19eb0 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72  s of the keys ar
19ec0 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b  e equal..**.** K
19ed0 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20  ey1 and Key2 do 
19ee0 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74  not have to cont
19ef0 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ain the same num
19f00 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49  ber of fields. I
19f10 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73  f all .** fields
19f20 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
19f30 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71  both keys are eq
19f40 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32  ual, then pPKey2
19f50 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20  ->default_rc is 
19f60 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
19f70 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20  .** If database 
19f80 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69  corruption is di
19f90 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50  scovered, set pP
19fa0 4b 65 79 32 2d 3e 69 73 43 6f 72 72 75 70 74 20  Key2->isCorrupt 
19fb0 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 61  to non-zero.** a
19fc0 6e 64 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  nd return 0..*/.
19fd0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
19fe0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20  ecordCompare(.  
19ff0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1a000 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20   void *pKey1,   
1a010 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
1a020 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1a030 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20  *pPKey2,        
1a040 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1a050 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20  .  int bSkip    
1a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a070 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73     /* If true, s
1a080 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66 69  kip the first fi
1a090 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  eld */.){.  u32 
1a0a0 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d1;             
1a0b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1a0c0 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
1a0d0 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65  ] of next data e
1a0e0 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  lement */.  int 
1a0f0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1a100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1a110 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65  ndex of next fie
1a120 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  ld to compare */
1a130 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
1a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a150 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
1a160 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 62  cord header in b
1a170 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64  ytes */.  u32 id
1a180 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  x1;             
1a190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1a1a0 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 70  set of first typ
1a1b0 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  e in header */. 
1a1c0 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1e0 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
1a1f0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20   */.  Mem *pRhs 
1a200 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20  = pPKey2->aMem; 
1a210 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69        /* Next fi
1a220 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f  eld of pPKey2 to
1a230 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65   compare */.  Ke
1a240 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
1a250 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  = pPKey2->pKeyIn
1a260 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  fo;.  const unsi
1a270 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
1a280 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1a290 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
1a2a0 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20  .  Mem mem1;..  
1a2b0 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20 74  /* If bSkip is t
1a2c0 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61  rue, then the ca
1a2d0 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1a2e0 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
1a2f0 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
1a300 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  two elements in 
1a310 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75  the keys are equ
1a320 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72 69  al. Fix the vari
1a330 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69 61 62  ous stack variab
1a340 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  les so.  ** that
1a350 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
1a360 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61  gins comparing a
1a370 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65  t the second fie
1a380 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b  ld. */.  if( bSk
1a390 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31  ip ){.    u32 s1
1a3a0 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b  ;.    idx1 = 1 +
1a3b0 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
1a3c0 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20  ey1[1], s1);.   
1a3d0 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b   szHdr1 = aKey1[
1a3e0 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48  0];.    d1 = szH
1a3f0 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  dr1 + sqlite3Vdb
1a400 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
1a410 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20  1);.    i = 1;. 
1a420 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c     pRhs++;.  }el
1a430 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67  se{.    idx1 = g
1a440 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
1a450 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64  , szHdr1);.    d
1a460 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20  1 = szHdr1;.    
1a470 69 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64  if( d1>(unsigned
1a480 29 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20  )nKey1 ){ .     
1a490 20 70 50 4b 65 79 32 2d 3e 69 73 43 6f 72 72 75   pPKey2->isCorru
1a4a0 70 74 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  pt = (u8)SQLITE_
1a4b0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1a4c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
1a4d0 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
1a4e0 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b      }.    i = 0;
1a4f0 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59  .  }..  VVA_ONLY
1a500 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d  ( mem1.zMalloc =
1a510 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
1a520 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
1a530 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20   statements */. 
1a540 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
1a550 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  >pKeyInfo->nFiel
1a560 64 2b 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  d+pPKey2->pKeyIn
1a570 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b  fo->nXField>=pPK
1a580 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20  ey2->nField .   
1a590 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
1a5a0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1a5b0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1a5c0 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
1a5d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  ;.  assert( pPKe
1a5e0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  y2->pKeyInfo->nF
1a5f0 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
1a600 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
1a610 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1a620 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
1a630 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
1a640 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69    /* RHS is an i
1a650 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66  nteger */.    if
1a660 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1a670 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20  MEM_Int ){.     
1a680 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1a690 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1a6a0 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1a6b0 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1a6c0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1a6d0 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
1a6e0 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1a6f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
1a700 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20  ial_type==0 ){. 
1a710 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1a720 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1a730 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
1a740 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65  {.        double
1a750 20 72 68 73 20 3d 20 28 64 6f 75 62 6c 65 29 70   rhs = (double)p
1a760 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20  Rhs->u.i;.      
1a770 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
1a780 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
1a790 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
1a7a0 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20  &mem1);.        
1a7b0 69 66 28 20 6d 65 6d 31 2e 72 3c 72 68 73 20 29  if( mem1.r<rhs )
1a7c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1a7d0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1a7e0 73 65 20 69 66 28 20 6d 65 6d 31 2e 72 3e 72 68  se if( mem1.r>rh
1a7f0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
1a800 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
1a810 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1a820 20 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d         i64 lhs =
1a830 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64   vdbeRecordDecod
1a840 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65  eInt(serial_type
1a850 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20  , &aKey1[d1]);. 
1a860 20 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d         i64 rhs =
1a870 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20   pRhs->u.i;.    
1a880 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20      if( lhs<rhs 
1a890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1a8a0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1a8b0 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20  lse if( lhs>rhs 
1a8c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1a8d0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
1a8e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1a8f0 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61     /* RHS is rea
1a900 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  l */.    else if
1a910 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1a920 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
1a930 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
1a940 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
1a950 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1a960 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 20 20  pe>=12 ){.      
1a970 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1a980 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
1a990 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  l_type==0 ){.   
1a9a0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1a9b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a9c0 20 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d 20     double rhs = 
1a9d0 70 52 68 73 2d 3e 72 3b 0a 20 20 20 20 20 20 20  pRhs->r;.       
1a9e0 20 64 6f 75 62 6c 65 20 6c 68 73 3b 0a 20 20 20   double lhs;.   
1a9f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1aa00 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
1aa10 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
1aa20 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20  e, &mem1);.     
1aa30 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1aa40 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20  pe==7 ){.       
1aa50 20 20 20 6c 68 73 20 3d 20 6d 65 6d 31 2e 72 3b     lhs = mem1.r;
1aa60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1aa70 20 20 20 20 20 20 20 20 20 20 6c 68 73 20 3d 20            lhs = 
1aa80 28 64 6f 75 62 6c 65 29 6d 65 6d 31 2e 75 2e 69  (double)mem1.u.i
1aa90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1aaa0 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20      if( lhs<rhs 
1aab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1aac0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1aad0 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20  lse if( lhs>rhs 
1aae0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1aaf0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
1ab00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1ab10 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73     /* RHS is a s
1ab20 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73  tring */.    els
1ab30 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
1ab40 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
1ab50 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32       getVarint32
1ab60 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73  (&aKey1[idx1], s
1ab70 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1ab80 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
1ab90 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a  ial_type==12 );.
1aba0 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1abb0 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20  _type<12 ){.    
1abc0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1abd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73     }else if( !(s
1abe0 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
1abf0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
1ac00 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1ac10 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31  se{.        mem1
1ac20 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  .n = (serial_typ
1ac30 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20  e - 12) / 2;.   
1ac40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1ac50 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73  d1+mem1.n)==(uns
1ac60 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
1ac70 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1ac80 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d   (d1+mem1.n+1)==
1ac90 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1aca0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
1acb0 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e  d1+mem1.n) > (un
1acc0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a  signed)nKey1 ){.
1acd0 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
1ace0 2d 3e 69 73 43 6f 72 72 75 70 74 20 3d 20 28 75  ->isCorrupt = (u
1acf0 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
1ad00 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
1ad10 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1ad20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
1ad30 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruption */.     
1ad40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65     }else if( pKe
1ad50 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
1ad60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
1ad70 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
1ad80 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20  ->enc;.         
1ad90 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49   mem1.db = pKeyI
1ada0 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  nfo->db;.       
1adb0 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20     mem1.flags = 
1adc0 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20  MEM_Str;.       
1add0 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61     mem1.z = (cha
1ade0 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20  r*)&aKey1[d1];. 
1adf0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64           rc = vd
1ae00 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
1ae10 6e 67 28 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20  ng(&mem1, pRhs, 
1ae20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1ae30 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
1ae40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
1ae50 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d  t nCmp = MIN(mem
1ae60 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20  1.n, pRhs->n);. 
1ae70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65           rc = me
1ae80 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c  mcmp(&aKey1[d1],
1ae90 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b   pRhs->z, nCmp);
1aea0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1aeb0 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31  c==0 ) rc = mem1
1aec0 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20  .n - pRhs->n; . 
1aed0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1aee0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1aef0 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a  HS is a blob */.
1af00 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
1af10 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  s->flags & MEM_B
1af20 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 67 65 74  lob ){.      get
1af30 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1af40 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  idx1], serial_ty
1af50 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  pe);.      testc
1af60 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
1af70 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
1af80 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
1af90 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65   || (serial_type
1afa0 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20   & 0x01) ){.    
1afb0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1afc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1afd0 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65    int nStr = (se
1afe0 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20  rial_type - 12) 
1aff0 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73  / 2;.        tes
1b000 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29  tcase( (d1+nStr)
1b010 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
1b020 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
1b030 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b  tcase( (d1+nStr+
1b040 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  1)==(unsigned)nK
1b050 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ey1 );.        i
1b060 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28  f( (d1+nStr) > (
1b070 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1b080 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65  {.          pPKe
1b090 79 32 2d 3e 69 73 43 6f 72 72 75 70 74 20 3d 20  y2->isCorrupt = 
1b0a0 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
1b0b0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
1b0c0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1b0e0 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1b0f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b100 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d        int nCmp =
1b110 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d   MIN(nStr, pRhs-
1b120 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  >n);.          r
1b130 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  c = memcmp(&aKey
1b140 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20  1[d1], pRhs->z, 
1b150 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nCmp);.         
1b160 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
1b170 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e  = nStr - pRhs->n
1b180 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b190 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1b1a0 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f  * RHS is null */
1b1b0 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
1b1c0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1b1d0 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1b1e0 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74    rc = (serial_t
1b1f0 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a  ype!=0);.    }..
1b200 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
1b210 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
1b220 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
1b230 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
1b240 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = -rc;.      }.
1b250 20 20 20 20 20 20 61 73 73 65 72 74 28 20 43 4f        assert( CO
1b260 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20  RRUPT_DB.       
1b270 20 20 20 7c 7c 20 28 72 63 3c 30 20 26 26 20 76     || (rc<0 && v
1b280 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1b290 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
1b2a0 79 31 2c 20 70 50 4b 65 79 32 29 3c 30 29 0a 20  y1, pPKey2)<0). 
1b2b0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 72 63 3e           || (rc>
1b2c0 30 20 26 26 20 76 64 62 65 52 65 63 6f 72 64 43  0 && vdbeRecordC
1b2d0 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
1b2e0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1b2f0 29 3e 30 29 0a 20 20 20 20 20 20 20 20 20 20 7c  )>0).          |
1b300 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e  | pKeyInfo->db->
1b310 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20  mallocFailed.   
1b320 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
1b330 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63  rt( mem1.zMalloc
1b340 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63  ==0 );  /* See c
1b350 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a  omment below */.
1b360 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b370 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b  .    }..    i++;
1b380 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20  .    pRhs++;.   
1b390 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
1b3a0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1b3b0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1b3c0 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65    idx1 += sqlite
1b3d0 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61  3VarintLen(seria
1b3e0 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c  l_type);.  }whil
1b3f0 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65  e( idx1<(unsigne
1b400 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  d)szHdr1 && i<pP
1b410 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20  Key2->nField && 
1b420 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  d1<=(unsigned)nK
1b430 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  ey1 );..  /* No 
1b440 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1b450 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
1b460 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
1b470 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
1b480 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1b490 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
1b4a0 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
1b4b0 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
1b4c0 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
1b4d0 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
1b4e0 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
1b4f0 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20  Release(&mem1). 
1b500 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
1b510 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  m1.zMalloc==0 );
1b520 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72  ..  /* rc==0 her
1b530 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
1b540 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
1b550 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
1b560 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
1b570 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
1b580 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
1b590 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75  were equal. Retu
1b5a0 72 6e 20 74 68 65 20 74 68 65 20 64 65 66 61 75  rn the the defau
1b5b0 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65  lt_rc.  ** value
1b5c0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1b5d0 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20  CORRUPT_DB .    
1b5e0 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 64 65     || pPKey2->de
1b5f0 66 61 75 6c 74 5f 72 63 3d 3d 76 64 62 65 52 65  fault_rc==vdbeRe
1b600 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1b610 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1b620 50 4b 65 79 32 29 20 0a 20 20 20 20 20 20 20 7c  PKey2) .       |
1b630 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e  | pKeyInfo->db->
1b640 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29  mallocFailed.  )
1b650 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79  ;.  return pPKey
1b660 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d  2->default_rc;.}
1b670 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1b680 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69  ction is an opti
1b690 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  mized version of
1b6a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1b6b0 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20  rdCompare() .** 
1b6c0 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72  that (a) the fir
1b6d0 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  st field of pPKe
1b6e0 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  y2 is an integer
1b6f0 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a  , and (b) the .*
1b700 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  * size-of-header
1b710 20 76 61 72 69 6e 74 20 61 74 20 74 68 65 20 73   varint at the s
1b720 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e  tart of (pKey1/n
1b730 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20  Key1) fits in a 
1b740 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28  single.** byte (
1b750 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61  i.e. is less tha
1b760 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f  n 128)..**.** To
1b770 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20   avoid concerns 
1b780 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65  about buffer ove
1b790 72 72 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75  rreads, this rou
1b7a0 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  tine is only use
1b7b0 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20  d.** on schemas 
1b7c0 77 68 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75  where the maximu
1b7d0 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 73  m valid header s
1b7e0 69 7a 65 20 69 73 20 36 33 20 62 79 74 65 73 20  ize is 63 bytes 
1b7f0 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  or less..*/.stat
1b800 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1b810 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69  dCompareInt(.  i
1b820 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1b830 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
1b840 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
1b850 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
1b860 4b 65 79 32 2c 20 20 20 20 20 20 20 2f 2a 20 52  Key2,       /* R
1b870 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ight key */.  in
1b880 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20  t bSkip         
1b890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1b8a0 67 6e 6f 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  gnored */.){.  c
1b8b0 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20  onst u8 *aKey = 
1b8c0 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  &((const u8*)pKe
1b8d0 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29  y1)[*(const u8*)
1b8e0 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20  pKey1 & 0x3F];. 
1b8f0 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65   int serial_type
1b900 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70   = ((const u8*)p
1b910 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20  Key1)[1];.  int 
1b920 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20  res;.  u32 y;.  
1b930 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76 20 3d  u64 x;.  i64 v =
1b940 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
1b950 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73 3b  .u.i;.  i64 lhs;
1b960 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1b970 54 45 52 28 62 53 6b 69 70 29 3b 0a 0a 20 20 61  TER(bSkip);..  a
1b980 73 73 65 72 74 28 20 62 53 6b 69 70 3d 3d 30 20  ssert( bSkip==0 
1b990 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 28  );.  assert( (*(
1b9a0 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33 46  u8*)pKey1)<=0x3F
1b9b0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1b9c0 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  ;.  switch( seri
1b9d0 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
1b9e0 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79  ase 1: { /* 1-by
1b9f0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1ba00 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
1ba10 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b   ONE_BYTE_INT(aK
1ba20 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1ba30 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1ba40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ba50 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
1ba60 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
1ba70 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1ba80 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f   lhs = TWO_BYTE_
1ba90 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1baa0 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
1bab0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1bac0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1bad0 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73  3: { /* 3-byte s
1bae0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1baf0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48 52  .      lhs = THR
1bb00 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  EE_BYTE_INT(aKey
1bb10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1bb20 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
1bb30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1bb40 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
1bb50 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
1bb60 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 79  teger */.      y
1bb70 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
1bb80 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 6c  T(aKey);.      l
1bb90 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a  hs = (i64)*(int*
1bba0 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74 63  )&y;.      testc
1bbb0 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1bbc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bbd0 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f  .    case 5: { /
1bbe0 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 6-byte signed 
1bbf0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1bc00 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54 45   lhs = FOUR_BYTE
1bc10 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20  _UINT(aKey+2) + 
1bc20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54  (((i64)1)<<32)*T
1bc30 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
1bc40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1bc50 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
1bc60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1bc70 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a 20     case 6: { /* 
1bc80 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  8-byte signed in
1bc90 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 78  teger */.      x
1bca0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
1bcb0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 78  T(aKey);.      x
1bcc0 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55   = (x<<32) | FOU
1bcd0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1bce0 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d  +4);.      lhs =
1bcf0 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
1bd00 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1bd10 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1bd20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1bd30 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20 3d   8: .      lhs =
1bd40 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1bd50 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20 20  .    case 9:.   
1bd60 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20 20     lhs = 1;.    
1bd70 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a    break;..    /*
1bd80 20 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c 64   This case could
1bd90 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74 68   be removed with
1bda0 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65  out changing the
1bdb0 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e 6e   results of runn
1bdc0 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ing.    ** this 
1bdd0 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67 20  code. Including 
1bde0 69 74 20 63 61 75 73 65 73 20 67 63 63 20 74 6f  it causes gcc to
1bdf0 20 67 65 6e 65 72 61 74 65 20 61 20 66 61 73 74   generate a fast
1be00 65 72 20 73 77 69 74 63 68 20 0a 20 20 20 20 2a  er switch .    *
1be10 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69 6e  * statement (sin
1be20 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20  ce the range of 
1be30 73 77 69 74 63 68 20 74 61 72 67 65 74 73 20 6e  switch targets n
1be40 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a 65 72  ow starts at zer
1be50 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20  o and.    ** is 
1be60 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74 20  contiguous) but 
1be70 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61  does not cause a
1be80 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f 64  ny duplicate cod
1be90 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65  e to be generate
1bea0 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63 63  d.    ** (as gcc
1beb0 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75 67   is clever enoug
1bec0 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  h to combine the
1bed0 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73 29   two like cases)
1bee0 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  . Other .    ** 
1bef0 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74 20  compilers might 
1bf00 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f 20  be similar.  */ 
1bf10 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63 61 73  .    case 0: cas
1bf20 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75 72  e 7:.      retur
1bf30 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
1bf40 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31  ordCompare(nKey1
1bf50 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
1bf60 20 30 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c   0);..    defaul
1bf70 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
1bf80 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1bf90 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20  dCompare(nKey1, 
1bfa0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30  pKey1, pPKey2, 0
1bfb0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e  );.  }..  if( v>
1bfc0 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  lhs ){.    res =
1bfd0 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d   pPKey2->r1;.  }
1bfe0 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29  else if( v<lhs )
1bff0 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
1c000 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20  y2->r2;.  }else 
1c010 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65  if( pPKey2->nFie
1c020 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ld>1 ){.    /* T
1c030 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
1c040 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20  of the two keys 
1c050 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61  are equal. Compa
1c060 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20  re the trailing 
1c070 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20  .    ** fields. 
1c080 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71   */.    res = sq
1c090 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1c0a0 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b  ompare(nKey1, pK
1c0b0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b  ey1, pPKey2, 1);
1c0c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1c0d0 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   The first field
1c0e0 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79  s of the two key
1c0f0 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20  s are equal and 
1c100 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61  there are no tra
1c110 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65  iling.    ** fie
1c120 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65  lds. Return pPKe
1c130 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69  y2->default_rc i
1c140 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a  n this case. */.
1c150 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1c160 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20  ->default_rc;.  
1c170 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 72 65  }..  assert( (re
1c180 73 3d 3d 30 20 26 26 20 76 64 62 65 52 65 63 6f  s==0 && vdbeReco
1c190 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
1c1a0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1c1b0 65 79 32 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  ey2)==0).       
1c1c0 7c 7c 20 28 72 65 73 3c 30 20 26 26 20 76 64 62  || (res<0 && vdb
1c1d0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1c1e0 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
1c1f0 2c 20 70 50 4b 65 79 32 29 3c 30 29 0a 20 20 20  , pPKey2)<0).   
1c200 20 20 20 20 7c 7c 20 28 72 65 73 3e 30 20 26 26      || (res>0 &&
1c210 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1c220 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1c230 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3e 30 29  Key1, pPKey2)>0)
1c240 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55  .       || CORRU
1c250 50 54 5f 44 42 0a 20 20 29 3b 0a 20 20 72 65 74  PT_DB.  );.  ret
1c260 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
1c270 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1c280 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
1c290 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
1c2a0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1c2b0 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28  are() .** that (
1c2c0 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  a) the first fie
1c2d0 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20  ld of pPKey2 is 
1c2e0 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28  a string, that (
1c2f0 62 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  b) the first fie
1c300 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63  ld.** uses the c
1c310 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1c320 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29  e BINARY and (c)
1c330 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f   that the size-o
1c340 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
1c350 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74  .** at the start
1c360 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   of (pKey1/nKey1
1c370 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  ) fits in a sing
1c380 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74  le byte..*/.stat
1c390 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1c3a0 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a  dCompareString(.
1c3b0 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
1c3c0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
1c3d0 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
1c3e0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1c3f0 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 2f  *pPKey2,       /
1c400 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20  * Right key */. 
1c410 20 69 6e 74 20 62 53 6b 69 70 0a 29 7b 0a 20 20   int bSkip.){.  
1c420 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20  const u8 *aKey1 
1c430 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  = (const u8*)pKe
1c440 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c  y1;.  int serial
1c450 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73  _type;.  int res
1c460 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1c470 45 54 45 52 28 62 53 6b 69 70 29 3b 0a 0a 20 20  ETER(bSkip);..  
1c480 61 73 73 65 72 74 28 20 62 53 6b 69 70 3d 3d 30  assert( bSkip==0
1c490 20 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74 33   );.  getVarint3
1c4a0 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72  2(&aKey1[1], ser
1c4b0 69 61 6c 5f 74 79 70 65 29 3b 0a 0a 20 20 69 66  ial_type);..  if
1c4c0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
1c4d0 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
1c4e0 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f  Key2->r1;      /
1c4f0 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
1c500 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61  is a number or a
1c510 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65   null */.  }else
1c520 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79   if( !(serial_ty
1c530 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20  pe & 0x01) ){ . 
1c540 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1c550 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b  >r2;      /* (pK
1c560 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20  ey1/nKey1) is a 
1c570 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  blob */.  }else{
1c580 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20  .    int nCmp;. 
1c590 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20     int nStr;.   
1c5a0 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65   int szHdr = aKe
1c5b0 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72  y1[0];..    nStr
1c5c0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
1c5d0 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28  12) / 2;.    if(
1c5e0 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20   (szHdr + nStr) 
1c5f0 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  > nKey1 ){.     
1c600 20 70 50 4b 65 79 32 2d 3e 69 73 43 6f 72 72 75   pPKey2->isCorru
1c610 70 74 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  pt = (u8)SQLITE_
1c620 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1c630 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1c640 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1c650 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70  /.    }.    nCmp
1c660 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e   = MIN( pPKey2->
1c670 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20  aMem[0].n, nStr 
1c680 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d  );.    res = mem
1c690 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72  cmp(&aKey1[szHdr
1c6a0 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  ], pPKey2->aMem[
1c6b0 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20  0].z, nCmp);..  
1c6c0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
1c6d0 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72        res = nStr
1c6e0 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b   - pPKey2->aMem[
1c6f0 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  0].n;.      if( 
1c700 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
1c710 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46    if( pPKey2->nF
1c720 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20  ield>1 ){.      
1c730 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
1c740 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1c750 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  re(nKey1, pKey1,
1c760 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20   pPKey2, 1);.   
1c770 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c780 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
1c790 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
1c7a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c7b0 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20  }else if( res>0 
1c7c0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  ){.        res =
1c7d0 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20   pPKey2->r2;.   
1c7e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c7f0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1c800 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r1;.      }.    
1c810 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20  }else if( res>0 
1c820 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  ){.      res = p
1c830 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d  PKey2->r2;.    }
1c840 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20  else{.      res 
1c850 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
1c860 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
1c870 74 28 20 28 72 65 73 3d 3d 30 20 26 26 20 76 64  t( (res==0 && vd
1c880 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1c890 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
1c8a0 31 2c 20 70 50 4b 65 79 32 29 3d 3d 30 29 0a 20  1, pPKey2)==0). 
1c8b0 20 20 20 20 20 20 7c 7c 20 28 72 65 73 3c 30 20        || (res<0 
1c8c0 26 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  && vdbeRecordCom
1c8d0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1c8e0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3c   pKey1, pPKey2)<
1c8f0 30 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 72 65  0).       || (re
1c900 73 3e 30 20 26 26 20 76 64 62 65 52 65 63 6f 72  s>0 && vdbeRecor
1c910 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1c920 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1c930 79 32 29 3e 30 29 0a 20 20 20 20 20 20 20 7c 7c  y2)>0).       ||
1c940 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20 20 20   CORRUPT_DB.    
1c950 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b     || pPKey2->pK
1c960 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
1c970 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20  ocFailed.  );.  
1c980 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
1c990 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
1c9a0 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
1c9b0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1c9c0 70 61 72 65 28 29 20 63 6f 6d 70 61 74 69 62 6c  pare() compatibl
1c9d0 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75  e function.** su
1c9e0 69 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61  itable for compa
1c9f0 72 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20  ring serialized 
1ca00 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20 75  records to the u
1ca10 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 70  npacked record p
1ca20 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
1ca30 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  only argument..*
1ca40 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20  /.RecordCompare 
1ca50 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43  sqlite3VdbeFindC
1ca60 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b 65 64 52  ompare(UnpackedR
1ca70 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20  ecord *p){.  /* 
1ca80 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
1ca90 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 61 72  areInt() and var
1caa0 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
1cab0 53 74 72 69 6e 67 28 29 20 62 6f 74 68 20 61 73  String() both as
1cac0 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20 74  sume.  ** that t
1cad0 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65  he size-of-heade
1cae0 72 20 76 61 72 69 6e 74 20 74 68 61 74 20 6f 63  r varint that oc
1caf0 63 75 72 73 20 61 74 20 74 68 65 20 73 74 61 72  curs at the star
1cb00 74 20 6f 66 20 65 61 63 68 20 72 65 63 6f 72 64  t of each record
1cb10 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e 20 61 20  .  ** fits in a 
1cb20 73 69 6e 67 6c 65 20 62 79 74 65 20 28 69 2e 65  single byte (i.e
1cb30 2e 20 69 73 20 31 32 37 20 6f 72 20 6c 65 73 73  . is 127 or less
1cb40 29 2e 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  ). varintRecordC
1cb50 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a  ompareInt().  **
1cb60 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68   also assumes th
1cb70 61 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  at it is safe to
1cb80 20 6f 76 65 72 72 65 61 64 20 61 20 62 75 66 66   overread a buff
1cb90 65 72 20 62 79 20 61 74 20 6c 65 61 73 74 20 74  er by at least t
1cba0 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d  he .  ** maximum
1cbb0 20 70 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c 20   possible legal 
1cbc0 68 65 61 64 65 72 20 73 69 7a 65 20 70 6c 75 73  header size plus
1cbd0 20 38 20 62 79 74 65 73 2e 20 42 65 63 61 75 73   8 bytes. Becaus
1cbe0 65 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20  e there is.  ** 
1cbf0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1cc00 20 61 74 20 6c 65 61 73 74 20 37 34 20 28 62 75   at least 74 (bu
1cc10 74 20 6e 6f 74 20 31 33 36 29 20 62 79 74 65 73  t not 136) bytes
1cc20 20 6f 66 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c   of padding foll
1cc30 6f 77 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20  owing each.  ** 
1cc40 62 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f  buffer passed to
1cc50 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
1cc60 70 61 72 65 49 6e 74 28 29 20 74 68 69 73 20 6d  pareInt() this m
1cc70 61 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e 69 65  akes it convenie
1cc80 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74  nt to.  ** limit
1cc90 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1cca0 20 68 65 61 64 65 72 20 74 6f 20 36 34 20 62 79   header to 64 by
1ccb0 74 65 73 20 69 6e 20 63 61 73 65 73 20 77 68 65  tes in cases whe
1ccc0 72 65 20 74 68 65 20 66 69 72 73 74 20 66 69 65  re the first fie
1ccd0 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e  ld.  ** is an in
1cce0 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  teger..  **.  **
1ccf0 20 54 68 65 20 65 61 73 69 65 73 74 20 77 61 79   The easiest way
1cd00 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73   to enforce this
1cd10 20 6c 69 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e   limit is to con
1cd20 73 69 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72  sider only recor
1cd30 64 73 20 77 69 74 68 0a 20 20 2a 2a 20 31 33 20  ds with.  ** 13 
1cd40 66 69 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20  fields or less. 
1cd50 49 66 20 74 68 65 20 66 69 72 73 74 20 66 69 65  If the first fie
1cd60 6c 64 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ld is an integer
1cd70 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  , the maximum le
1cd80 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20  gal.  ** header 
1cd90 73 69 7a 65 20 69 73 20 28 31 32 2a 35 20 2b 20  size is (12*5 + 
1cda0 31 20 2b 20 31 29 20 62 79 74 65 73 2e 20 20 2a  1 + 1) bytes.  *
1cdb0 2f 0a 20 20 69 66 28 20 28 70 2d 3e 70 4b 65 79  /.  if( (p->pKey
1cdc0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70  Info->nField + p
1cdd0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  ->pKeyInfo->nXFi
1cde0 65 6c 64 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20  eld)<=13 ){.    
1cdf0 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61  int flags = p->a
1ce00 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20  Mem[0].flags;.  
1ce10 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66    if( p->pKeyInf
1ce20 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  o->aSortOrder[0]
1ce30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20   ){.      p->r1 
1ce40 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32  = 1;.      p->r2
1ce50 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
1ce60 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20  {.      p->r1 = 
1ce70 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20  -1;.      p->r2 
1ce80 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
1ce90 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f  f( (flags & MEM_
1cea0 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65  Int) ){.      re
1ceb0 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43  turn vdbeRecordC
1cec0 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d  ompareInt;.    }
1ced0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66  .    testcase( f
1cee0 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
1cef0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1cf00 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c   flags & MEM_Nul
1cf10 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
1cf20 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  e( flags & MEM_B
1cf30 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28  lob );.    if( (
1cf40 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61  flags & (MEM_Rea
1cf50 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42  l|MEM_Null|MEM_B
1cf60 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70  lob))==0 && p->p
1cf70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
1cf80 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  ]==0 ){.      as
1cf90 73 65 72 74 28 20 66 6c 61 67 73 20 26 20 4d 45  sert( flags & ME
1cfa0 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20 20 20 72  M_Str );.      r
1cfb0 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64  eturn vdbeRecord
1cfc0 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a 20  CompareString;. 
1cfd0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1cfe0 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
1cff0 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a  cordCompare;.}..
1d000 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74  /*.** pCur point
1d010 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e  s at an index en
1d020 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e  try created usin
1d030 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  g the OP_MakeRec
1d040 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52  ord opcode..** R
1d050 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74  ead the rowid (t
1d060 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e  he last field in
1d070 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64   the record) and
1d080 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f   store it in *ro
1d090 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53  wid..** Return S
1d0a0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
1d0b0 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72  ything works, or
1d0c0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f   an error code o
1d0d0 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
1d0e0 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f  pCur might be po
1d0f0 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f  inting to text o
1d100 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63  btained from a c
1d110 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
1d120 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20  file..** So the 
1d130 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62  content cannot b
1d140 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61  e trusted.  Do a
1d150 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b  ppropriate check
1d160 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  s on the content
1d170 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d180 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c  VdbeIdxRowid(sql
1d190 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73  ite3 *db, BtCurs
1d1a0 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72  or *pCur, i64 *r
1d1b0 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65  owid){.  i64 nCe
1d1c0 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  llKey = 0;.  int
1d1d0 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72   rc;.  u32 szHdr
1d1e0 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ;        /* Size
1d1f0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a   of the header *
1d200 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69  /.  u32 typeRowi
1d210 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20  d;    /* Serial 
1d220 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69  type of the rowi
1d230 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f  d */.  u32 lenRo
1d240 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65  wid;     /* Size
1d250 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
1d260 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20  .  Mem m, v;..  
1d270 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1d280 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  (db);..  /* Get 
1d290 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1d2a0 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e  index entry.  On
1d2b0 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69  ly indices entri
1d2c0 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20  es of less.  ** 
1d2d0 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75  than 2GiB are su
1d2e0 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67  pport - anything
1d2f0 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64   large must be d
1d300 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1d310 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72  on..  ** Any cor
1d320 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
1d330 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74  ted in sqlite3Bt
1d340 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
1d350 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20  ), though, so.  
1d360 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e  ** this code can
1d370 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74   safely assume t
1d380 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20  hat nCellKey is 
1d390 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20  32-bits  .  */. 
1d3a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1d3b0 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
1d3c0 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56  id(pCur) );.  VV
1d3d0 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c  A_ONLY(rc =) sql
1d3e0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
1d3f0 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
1d400 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
1d410 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
1d420 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
1d430 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
1d440 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
1d450 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e   */.  assert( (n
1d460 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45  CellKey & SQLITE
1d470 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29  _MAX_U32)==(u64)
1d480 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f  nCellKey );..  /
1d490 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f  * Read in the co
1d4a0 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
1d4b0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
1d4c0 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d  y */.  memset(&m
1d4d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b  , 0, sizeof(m));
1d4e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
1d4f0 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
1d500 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43  pCur, 0, (u32)nC
1d510 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
1d520 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1d530 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1d540 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65    /* The index e
1d550 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20  ntry must begin 
1d560 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69  with a header si
1d570 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  ze */.  (void)ge
1d580 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
1d590 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65  .z, szHdr);.  te
1d5a0 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33  stcase( szHdr==3
1d5b0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1d5c0 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20  szHdr==m.n );.  
1d5d0 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48  if( unlikely(szH
1d5e0 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48  dr<3 || (int)szH
1d5f0 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67  dr>m.n) ){.    g
1d600 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
1d610 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
1d620 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65   /* The last fie
1d630 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ld of the index 
1d640 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74  should be an int
1d650 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44  eger - the ROWID
1d660 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68  ..  ** Verify th
1d670 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  at the last entr
1d680 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69  y really is an i
1d690 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f  nteger. */.  (vo
1d6a0 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
1d6b0 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31  u8*)&m.z[szHdr-1
1d6c0 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  ], typeRowid);. 
1d6d0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1d6e0 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73  owid==1 );.  tes
1d6f0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1d700 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==2 );.  testcas
1d710 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20  e( typeRowid==3 
1d720 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1d730 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20  ypeRowid==4 );. 
1d740 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1d750 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73  owid==5 );.  tes
1d760 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1d770 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==6 );.  testcas
1d780 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20  e( typeRowid==8 
1d790 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1d7a0 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20  ypeRowid==9 );. 
1d7b0 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79   if( unlikely(ty
1d7c0 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70  peRowid<1 || typ
1d7d0 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65  eRowid>9 || type
1d7e0 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20  Rowid==7) ){.   
1d7f0 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
1d800 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
1d810 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c    lenRowid = sql
1d820 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1d830 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29  peLen(typeRowid)
1d840 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75  ;.  testcase( (u
1d850 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65  32)m.n==szHdr+le
1d860 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20  nRowid );.  if( 
1d870 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e  unlikely((u32)m.
1d880 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  n<szHdr+lenRowid
1d890 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
1d8a0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
1d8b0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65  on;.  }..  /* Fe
1d8c0 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20  tch the integer 
1d8d0 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
1d8e0 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  he index record 
1d8f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1d900 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
1d910 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
1d920 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
1d930 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
1d940 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
1d950 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
1d960 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1d970 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
1d980 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73   here if databas
1d990 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
1d9a0 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d  detected after m
1d9b0 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61   has been.  ** a
1d9c0 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20  llocated.  Free 
1d9d0 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64  the m object and
1d9e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1d9f0 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72  ORRUPT. */.idx_r
1da00 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a  owid_corruption:
1da10 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a  .  testcase( m.z
1da20 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73  Malloc!=0 );.  s
1da30 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1da40 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
1da50 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1da60 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  T_BKPT;.}../*.**
1da70 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
1da80 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
1da90 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
1daa0 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  pC is pointing t
1dab0 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65  o against.** the
1dac0 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70   key string in p
1dad0 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65  Unpacked.  Write
1dae0 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75   into *pRes a nu
1daf0 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  mber.** that is 
1db00 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
1db10 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
1db20 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  C is less than, 
1db30 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20  equal to,.** or 
1db40 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e  greater than pUn
1db50 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20  packed.  Return 
1db60 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
1db70 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70  cess..**.** pUnp
1db80 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20  acked is either 
1db90 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20  created without 
1dba0 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72  a rowid or is tr
1dbb0 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  uncated so that 
1dbc0 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20  it.** omits the 
1dbd0 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
1dbe0 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20  .  The rowid at 
1dbf0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
1dc00 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73  ndex entry.** is
1dc10 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c   ignored as well
1dc20 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72  .  Hence, this r
1dc30 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70  outine only comp
1dc40 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65  ares the prefixe
1dc50 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79  s .** of the key
1dc60 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66  s prior to the f
1dc70 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20  inal rowid, not 
1dc80 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a  the entire key..
1dc90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1dca0 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28  beIdxKeyCompare(
1dcb0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
1dcc0 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
1dcd0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1dce0 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  r to compare aga
1dcf0 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  inst */.  Unpack
1dd00 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63  edRecord *pUnpac
1dd10 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e  ked,       /* Un
1dd20 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f  packed version o
1dd30 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  f key */.  int *
1dd40 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  res             
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1dd60 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  rite the compari
1dd70 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20  son result here 
1dd80 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  */.){.  i64 nCel
1dd90 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
1dda0 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  rc;.  BtCursor *
1ddb0 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73  pCur = pC->pCurs
1ddc0 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20  or;.  Mem m;..  
1ddd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1dde0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
1ddf0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41  d(pCur) );.  VVA
1de00 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69  _ONLY(rc =) sqli
1de10 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
1de20 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
1de30 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
1de40 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
1de50 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79  /* pCur is alway
1de60 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69  s valid so KeySi
1de70 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  ze cannot fail *
1de80 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20  /.  /* nCellKey 
1de90 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62  will always be b
1dea0 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66  etween 0 and 0xf
1deb0 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20  fffffff because 
1dec0 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20  of the way.  ** 
1ded0 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43  that btreeParseC
1dee0 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c  ellPtr() and sql
1def0 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
1df00 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
1df10 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c  d */.  if( nCell
1df20 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b  Key<=0 || nCellK
1df30 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b  ey>0x7fffffff ){
1df40 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20  .    *res = 0;. 
1df50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1df60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1df70 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20   }.  memset(&m, 
1df80 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20  0, sizeof(m));. 
1df90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
1dfa0 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
1dfb0 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75  ->pCursor, 0, (u
1dfc0 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  32)nCellKey, 1, 
1dfd0 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
1dfe0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1dff0 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c    }.  *res = sql
1e000 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1e010 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  mpare(m.n, m.z, 
1e020 70 55 6e 70 61 63 6b 65 64 2c 20 30 29 3b 0a 20  pUnpacked, 0);. 
1e030 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1e040 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
1e050 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e060 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1e070 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
1e080 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
1e090 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
1e0a0 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
1e0b0 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
1e0c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1e0d0 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
1e0e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
1e0f0 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
1e100 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
1e110 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
1e120 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1e130 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
1e140 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
1e150 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
1e160 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
1e170 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
1e180 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
1e190 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
1e1a0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
1e1b0 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
1e1c0 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
1e1d0 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
1e1e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
1e1f0 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
1e200 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
1e210 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
1e220 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
1e230 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
1e240 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1e250 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
1e260 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
1e270 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
1e280 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
1e290 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
1e2a0 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
1e2b0 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
1e2c0 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
1e2d0 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
1e2e0 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
1e2f0 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
1e300 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
1e310 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
1e320 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
1e330 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
1e340 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
1e350 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
1e360 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
1e370 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
1e380 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
1e390 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
1e3a0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
1e3b0 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76  s obsolete..*/.v
1e3c0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72  oid sqlite3Expir
1e3d0 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
1e3e0 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
1e3f0 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
1e400 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
1e410 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1e420 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
1e430 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
1e440 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
1e450 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
1e460 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e  d with the Vdbe.
1e470 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c  .*/.sqlite3 *sql
1e480 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20  ite3VdbeDb(Vdbe 
1e490 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
1e4a0 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >db;.}../*.** Re
1e4b0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1e4c0 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  o an sqlite3_val
1e4d0 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
1e4e0 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
1e4f0 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  e bound.** param
1e500 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20  eter iVar of VM 
1e510 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  v. Except, if th
1e520 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51  e value is an SQ
1e530 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a  L NULL, return .
1e540 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e  ** 0 instead. Un
1e550 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c  less it is NULL,
1e560 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20   apply affinity 
1e570 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20  aff (one of the 
1e580 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20  SQLITE_AFF_*.** 
1e590 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68  constants) to th
1e5a0 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72  e value before r
1e5b0 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a  eturning it..**.
1e5c0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
1e5d0 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72  value must be fr
1e5e0 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
1e5f0 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  r using sqlite3V
1e600 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  alueFree()..*/.s
1e610 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71  qlite3_value *sq
1e620 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
1e630 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20  dValue(Vdbe *v, 
1e640 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66  int iVar, u8 aff
1e650 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
1e660 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29  r>0 );.  if( v )
1e670 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  {.    Mem *pMem 
1e680 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d  = &v->aVar[iVar-
1e690 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  1];.    if( 0==(
1e6a0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
1e6b0 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20  M_Null) ){.     
1e6c0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
1e6d0 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61  pRet = sqlite3Va
1e6e0 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20  lueNew(v->db);. 
1e6f0 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b       if( pRet ){
1e700 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e710 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d  VdbeMemCopy((Mem
1e720 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a   *)pRet, pMem);.
1e730 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e740 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74  alueApplyAffinit
1e750 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c  y(pRet, aff, SQL
1e760 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
1e770 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1e780 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pRet;.    }.  }.
1e790 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1e7a0 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53  *.** Configure S
1e7b0 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72  QL variable iVar
1e7c0 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67   so that binding
1e7d0 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20   a new value to 
1e7e0 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f  it signals.** to
1e7f0 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d   sqlite3_reoptim
1e800 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72  ize() that re-pr
1e810 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74  eparing the stat
1e820 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74  ement may result
1e830 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20  .** in a better 
1e840 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76  query plan..*/.v
1e850 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
1e860 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a  etVarmask(Vdbe *
1e870 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20  v, int iVar){.  
1e880 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29  assert( iVar>0 )
1e890 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20  ;.  if( iVar>32 
1e8a0 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  ){.    v->expmas
1e8b0 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a  k = 0xffffffff;.
1e8c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e    }else{.    v->
1e8d0 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32  expmask |= ((u32
1e8e0 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b  )1 << (iVar-1));
1e8f0 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
1e900 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1e910 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54  UALTABLE./*.** T
1e920 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65  ransfer error me
1e930 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20  ssage text from 
1e940 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e  an sqlite3_vtab.
1e950 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
1e960 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
1e970 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
1e980 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
1e990 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72  into a Vdbe.zErr
1e9a0 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64  Msg (text stored
1e9b0 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  .** in memory ob
1e9c0 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1e9d0 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f  te3DbMalloc)..*/
1e9e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61  .void sqlite3Vta
1e9f0 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64  bImportErrmsg(Vd
1ea00 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  be *p, sqlite3_v
1ea10 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73  tab *pVtab){.  s
1ea20 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
1ea30 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  db;.  sqlite3DbF
1ea40 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
1ea50 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
1ea60 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  g = sqlite3DbStr
1ea70 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a  Dup(db, pVtab->z
1ea80 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
1ea90 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
1eaa0 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62  ErrMsg);.  pVtab
1eab0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d  ->zErrMsg = 0;.}
1eac0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1ead0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1eae0 42 4c 45 20 2a 2f 0a                             BLE */.