/ Hex Artifact Content
Login

Artifact 808daddbcd3cd52f9aed80a13a78baac8ec29b00:


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 28 69 36 34 29 6e 4e 65 77 2a 73 69 7a  p, (i64)nNew*siz
0ab0: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28 20  eof(Op));.  if( 
0ac0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  pNew ){.    p->n
0ad0: 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65  OpAlloc = sqlite
0ae0: 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 2d  3DbMallocSize(p-
0af0: 3e 64 62 2c 20 70 4e 65 77 29 2f 73 69 7a 65 6f  >db, pNew)/sizeo
0b00: 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e 61 4f  f(Op);.    v->aO
0b10: 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  p = pNew;.  }.  
0b20: 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20 53  return (pNew ? S
0b30: 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
0b40: 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a 0a 23 69 66  E_NOMEM);.}..#if
0b50: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
0b60: 0a 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ./* This routine
0b70: 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65   is just a conve
0b80: 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73  nient place to s
0b90: 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20  et a breakpoint 
0ba0: 74 68 61 74 20 77 69 6c 6c 0a 2a 2a 20 66 69 72  that will.** fir
0bb0: 65 20 61 66 74 65 72 20 65 61 63 68 20 6f 70 63  e after each opc
0bc0: 6f 64 65 20 69 73 20 69 6e 73 65 72 74 65 64 20  ode is inserted 
0bd0: 61 6e 64 20 64 69 73 70 6c 61 79 65 64 20 75 73  and displayed us
0be0: 69 6e 67 0a 2a 2a 20 22 50 52 41 47 4d 41 20 76  ing.** "PRAGMA v
0bf0: 64 62 65 5f 61 64 64 6f 70 74 72 61 63 65 3d 6f  dbe_addoptrace=o
0c00: 6e 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  n"..*/.static vo
0c10: 69 64 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72  id test_addop_br
0c20: 65 61 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a  eakpoint(void){.
0c30: 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e 20 3d    static int n =
0c40: 20 30 3b 0a 20 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e   0;.  n++;.}.#en
0c50: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  dif../*.** Add a
0c60: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
0c70: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
0c80: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72  instructions cur
0c90: 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56  rent in the.** V
0ca0: 44 42 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65  DBE.  Return the
0cb0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
0cc0: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  new instruction.
0cd0: 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
0ce0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20  s:.**.**    p   
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e              Poin
0d00: 74 65 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a  ter to the VDBE.
0d10: 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20  **.**    op     
0d20: 20 20 20 20 20 20 20 20 20 54 68 65 20 6f 70 63           The opc
0d30: 6f 64 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73  ode for this ins
0d40: 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  truction.**.**  
0d50: 20 20 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20    p1, p2, p3    
0d60: 20 20 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a    Operands.**.**
0d70: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
0d80: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
0d90: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66  () function to f
0da0: 69 78 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e  ix an address an
0db0: 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  d.** the sqlite3
0dc0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 20 66  VdbeChangeP4() f
0dd0: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67  unction to chang
0de0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
0df0: 68 65 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64  he P4.** operand
0e00: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0e10: 56 64 62 65 41 64 64 4f 70 33 28 56 64 62 65 20  VdbeAddOp3(Vdbe 
0e20: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
0e30: 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20  p1, int p2, int 
0e40: 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p3){.  int i;.  
0e50: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20  VdbeOp *pOp;..  
0e60: 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73  i = p->nOp;.  as
0e70: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
0e80: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
0e90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e  );.  assert( op>
0ea0: 30 20 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a  0 && op<0xff );.
0eb0: 20 20 69 66 28 20 70 2d 3e 70 50 61 72 73 65 2d    if( p->pParse-
0ec0: 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a  >nOpAlloc<=i ){.
0ed0: 20 20 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72      if( growOpAr
0ee0: 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 20 20  ray(p) ){.      
0ef0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
0f00: 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a    }.  p->nOp++;.
0f10: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
0f20: 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64  i];.  pOp->opcod
0f30: 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f  e = (u8)op;.  pO
0f40: 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70  p->p5 = 0;.  pOp
0f50: 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70  ->p1 = p1;.  pOp
0f60: 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70  ->p2 = p2;.  pOp
0f70: 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70  ->p3 = p3;.  pOp
0f80: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f  ->p4.p = 0;.  pO
0f90: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
0fa0: 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66 20 53  OTUSED;.#ifdef S
0fb0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
0fc0: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
0fd0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  pOp->zComment = 
0fe0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
0ff0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1000: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
1010: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
1020: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
1030: 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20 20 20 20  int jj, kk;.    
1040: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
1050: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 66  p->pParse;.    f
1060: 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53  or(jj=kk=0; jj<S
1070: 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
1080: 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  ; jj++){.      s
1090: 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
10a0: 2a 78 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  *x = pParse->aCo
10b0: 6c 43 61 63 68 65 20 2b 20 6a 6a 3b 0a 20 20 20  lCache + jj;.   
10c0: 20 20 20 69 66 28 20 78 2d 3e 69 4c 65 76 65 6c     if( x->iLevel
10d0: 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c  >pParse->iCacheL
10e0: 65 76 65 6c 20 7c 7c 20 78 2d 3e 69 52 65 67 3d  evel || x->iReg=
10f0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1100: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 72 5b       printf(" r[
1110: 25 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c 20 78 2d  %d]={%d:%d}", x-
1120: 3e 69 52 65 67 2c 20 78 2d 3e 69 54 61 62 6c 65  >iReg, x->iTable
1130: 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  , x->iColumn);. 
1140: 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20 20 20 7d       kk++;.    }
1150: 0a 20 20 20 20 69 66 28 20 6b 6b 20 29 20 70 72  .    if( kk ) pr
1160: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
1170: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
1180: 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  Op(0, i, &p->aOp
1190: 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f 61  [i]);.    test_a
11a0: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
11b0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  );.  }.#endif.#i
11c0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
11d0: 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20  E.  pOp->cycles 
11e0: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20  = 0;.  pOp->cnt 
11f0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
1200: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
1210: 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69  OVERAGE.  pOp->i
1220: 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e  SrcLine = 0;.#en
1230: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
1240: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1250: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c  eAddOp0(Vdbe *p,
1260: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75   int op){.  retu
1270: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1280: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30  dOp3(p, op, 0, 0
1290: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
12a0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64  te3VdbeAddOp1(Vd
12b0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
12c0: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e  nt p1){.  return
12d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12e0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c  p3(p, op, p1, 0,
12f0: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
1300: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62  e3VdbeAddOp2(Vdb
1310: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
1320: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
1330: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1340: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1350: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a   p1, p2, 0);.}..
1360: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
1370: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
1380: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
1390: 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  as a pointer..*/
13a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
13b0: 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a  AddOp4(.  Vdbe *
13c0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
13d0: 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20   Add the opcode 
13e0: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
13f0: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
1400: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
1410: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70  pcode */.  int p
1420: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1,             /
1430: 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64  * The P1 operand
1440: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20   */.  int p2,   
1450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1460: 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P2 operand */. 
1470: 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20   int p3,        
1480: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f       /* The P3 o
1490: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
14a0: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20  t char *zP4,    
14b0: 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e  /* The P4 operan
14c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70  d */.  int p4typ
14d0: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34  e          /* P4
14e0: 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f   operand type */
14f0: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
1500: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1510: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1520: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
1530: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
1540: 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70  addr, zP4, p4typ
1550: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
1560: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  r;.}../*.** Add 
1570: 61 6e 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  an OP_ParseSchem
1580: 61 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  a opcode.  This 
1590: 72 6f 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65  routine is broke
15a0: 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71  n out from.** sq
15b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
15c0: 29 20 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73  ) since it needs
15d0: 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74   to also needs t
15e0: 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65  o mark all btree
15f0: 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62  s.** as having b
1600: 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  een used..**.** 
1610: 54 68 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e  The zWhere strin
1620: 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  g must have been
1630: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
1640: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
1650: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1660: 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72   will take owner
1670: 73 68 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f  ship of the allo
1680: 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  cated memory..*/
1690: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
16a0: 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f  eAddParseSchemaO
16b0: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  p(Vdbe *p, int i
16c0: 44 62 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65  Db, char *zWhere
16d0: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e  ){.  int j;.  in
16e0: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
16f0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50  VdbeAddOp3(p, OP
1700: 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
1710: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  b, 0, 0);.  sqli
1720: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
1730: 70 2c 20 61 64 64 72 2c 20 7a 57 68 65 72 65 2c  p, addr, zWhere,
1740: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
1750: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62  for(j=0; j<p->db
1760: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69  ->nDb; j++) sqli
1770: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
1780: 28 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (p, j);.}../*.**
1790: 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74   Add an opcode t
17a0: 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65  hat includes the
17b0: 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20   p4 value as an 
17c0: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  integer..*/.int 
17d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17e0: 34 49 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c  4Int(.  Vdbe *p,
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1800: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
1810: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
1820: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
1830: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
1840: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1860: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1870: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1880: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1890: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
18a0: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
18b0: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
18c0: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18e0: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
18f0: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f  as an integer */
1900: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
1910: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1920: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1930: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
1940: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
1950: 61 64 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54  addr, SQLITE_INT
1960: 5f 54 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f  _TO_PTR(p4), P4_
1970: 49 4e 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e  INT32);.  return
1980: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
1990: 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d  Create a new sym
19a0: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20  bolic label for 
19b0: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
19c0: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
19d0: 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65  e.** coded.  The
19e0: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
19f0: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61  is really just a
1a00: 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
1a10: 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20  .  The.** label 
1a20: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74  can be used as t
1a30: 68 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61  he P2 value of a
1a40: 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61  n operation.  La
1a50: 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ter, when.** the
1a60: 20 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76   label is resolv
1a70: 65 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63  ed to a specific
1a80: 20 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44   address, the VD
1a90: 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20  BE will scan.** 
1aa0: 74 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72  through its oper
1ab0: 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63  ation list and c
1ac0: 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73  hange all values
1ad0: 20 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74   of P2 which mat
1ae0: 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  ch.** the label 
1af0: 69 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65  into the resolve
1b00: 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  d address..**.**
1b10: 20 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20   The VDBE knows 
1b20: 74 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20  that a P2 value 
1b30: 69 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75  is a label becau
1b40: 73 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a  se labels are.**
1b50: 20 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65   always negative
1b60: 20 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61   and P2 values a
1b70: 72 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65  re suppose to be
1b80: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a   non-negative..*
1b90: 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74  * Hence, a negat
1ba0: 69 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20  ive P2 value is 
1bb0: 61 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73  a label that has
1bc0: 20 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c   yet to be resol
1bd0: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20  ved..**.** Zero 
1be0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
1bf0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
1c00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1c10: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62  dbeMakeLabel(Vdb
1c20: 65 20 2a 76 29 7b 0a 20 20 50 61 72 73 65 20 2a  e *v){.  Parse *
1c30: 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20  p = v->pParse;. 
1c40: 20 69 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62   int i = p->nLab
1c50: 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  el++;.  assert( 
1c60: 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  v->magic==VDBE_M
1c70: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
1c80: 66 28 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d  f( (i & (i-1))==
1c90: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  0 ){.    p->aLab
1ca0: 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  el = sqlite3DbRe
1cb0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64  allocOrFree(p->d
1cc0: 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20  b, p->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 20 20 20 20 20 28 69 36 34 29 28 69 2a 32 2b        (i64)(i*2+
1d00: 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61  1)*sizeof(p->aLa
1d10: 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20  bel[0]));.  }.  
1d20: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b  if( p->aLabel ){
1d30: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69  .    p->aLabel[i
1d40: 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  ] = -1;.  }.  re
1d50: 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a  turn -1-i;.}../*
1d60: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65  .** Resolve labe
1d70: 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20  l "x" to be the 
1d80: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
1d90: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
1da0: 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65  to.** be inserte
1db0: 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65  d.  The paramete
1dc0: 72 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20  r "x" must have 
1dd0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
1de0: 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61  om.** a prior ca
1df0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
1e00: 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f  eMakeLabel()..*/
1e10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
1e20: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64  eResolveLabel(Vd
1e30: 62 65 20 2a 76 2c 20 69 6e 74 20 78 29 7b 0a 20  be *v, int x){. 
1e40: 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70   Parse *p = v->p
1e50: 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 6a 20 3d  Parse;.  int j =
1e60: 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72 74 28   -1-x;.  assert(
1e70: 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   v->magic==VDBE_
1e80: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
1e90: 61 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61  assert( j<p->nLa
1ea0: 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  bel );.  if( ALW
1eb0: 41 59 53 28 6a 3e 3d 30 29 20 26 26 20 70 2d 3e  AYS(j>=0) && p->
1ec0: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
1ed0: 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e  >aLabel[j] = v->
1ee0: 6e 4f 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 46  nOp;.  }.  p->iF
1ef0: 69 78 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f 70 20  ixedOp = v->nOp 
1f00: 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  - 1;.}../*.** Ma
1f10: 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f  rk the VDBE as o
1f20: 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79  ne that can only
1f30: 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65   be run one time
1f40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1f50: 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65  3VdbeRunOnlyOnce
1f60: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
1f70: 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b  runOnlyOnce = 1;
1f80: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1f90: 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74  E_DEBUG /* sqlit
1fa0: 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  e3AssertMayAbort
1fb0: 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a  () logic */../*.
1fc0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1fd0: 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69   type and functi
1fe0: 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 69  on are used to i
1ff0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
2000: 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e  ll opcodes.** in
2010: 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f   a Vdbe main pro
2020: 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66  gram and each of
2030: 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d   the sub-program
2040: 73 20 28 74 72 69 67 67 65 72 73 29 20 69 74 20  s (triggers) it 
2050: 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64  may .** invoke d
2060: 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72  irectly or indir
2070: 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64  ectly. It should
2080: 20 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c   be used as foll
2090: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20  ows:.**.**   Op 
20a0: 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f  *pOp;.**   VdbeO
20b0: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a  pIter sIter;.**.
20c0: 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74  **   memset(&sIt
20d0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49  er, 0, sizeof(sI
20e0: 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65  ter));.**   sIte
20f0: 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20  r.v = v;        
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2110: 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74      // v is of t
2120: 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20  ype Vdbe* .**   
2130: 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70  while( (pOp = op
2140: 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29  IterNext(&sIter)
2150: 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44  ) ){.**     // D
2160: 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68  o something with
2170: 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20   pOp.**   }.**  
2180: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76   sqlite3DbFree(v
2190: 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75  ->db, sIter.apSu
21a0: 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64  b);.** .*/.typed
21b0: 65 66 20 73 74 72 75 63 74 20 56 64 62 65 4f 70  ef struct VdbeOp
21c0: 49 74 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b  Iter VdbeOpIter;
21d0: 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74  .struct VdbeOpIt
21e0: 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20  er {.  Vdbe *v; 
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2200: 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65    /* Vdbe to ite
2210: 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
2220: 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20   opcodes of */. 
2230: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70   SubProgram **ap
2240: 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  Sub;        /* A
2250: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72  rray of subprogr
2260: 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  ams */.  int nSu
2270: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2280: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2290: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75   entries in apSu
22a0: 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72  b */.  int iAddr
22b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22c0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
22d0: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
22e0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
22f0: 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20 20  int iSub;       
2300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
2310: 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20  = main program, 
2320: 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72  1 = first sub-pr
2330: 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b  ogram etc. */.};
2340: 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74  .static Op *opIt
2350: 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65  erNext(VdbeOpIte
2360: 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76  r *p){.  Vdbe *v
2370: 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70   = p->v;.  Op *p
2380: 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61  Ret = 0;.  Op *a
2390: 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a  Op;.  int nOp;..
23a0: 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70    if( p->iSub<=p
23b0: 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69  ->nSub ){..    i
23c0: 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b  f( p->iSub==0 ){
23d0: 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e  .      aOp = v->
23e0: 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d  aOp;.      nOp =
23f0: 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c   v->nOp;.    }el
2400: 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20  se{.      aOp = 
2410: 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62  p->apSub[p->iSub
2420: 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20  -1]->aOp;.      
2430: 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  nOp = p->apSub[p
2440: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a  ->iSub-1]->nOp;.
2450: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2460: 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29  ( p->iAddr<nOp )
2470: 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61  ;..    pRet = &a
2480: 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20  Op[p->iAddr];.  
2490: 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20    p->iAddr++;.  
24a0: 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d    if( p->iAddr==
24b0: 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  nOp ){.      p->
24c0: 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d  iSub++;.      p-
24d0: 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  >iAddr = 0;.    
24e0: 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52 65  }.  .    if( pRe
24f0: 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55  t->p4type==P4_SU
2500: 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20  BPROGRAM ){.    
2510: 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20 28 70    i64 nByte = (p
2520: 2d 3e 6e 53 75 62 2b 31 29 2a 28 69 36 34 29 73  ->nSub+1)*(i64)s
2530: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
2540: 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  *);.      int j;
2550: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
2560: 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b  j<p->nSub; j++){
2570: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
2580: 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e  apSub[j]==pRet->
2590: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72  p4.pProgram ) br
25a0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
25b0: 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75     if( j==p->nSu
25c0: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  b ){.        p->
25d0: 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44  apSub = sqlite3D
25e0: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76  bReallocOrFree(v
25f0: 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20  ->db, p->apSub, 
2600: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
2610: 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b  if( !p->apSub ){
2620: 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20  .          pRet 
2630: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
2640: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  se{.          p-
2650: 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b  >apSub[p->nSub++
2660: 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72  ] = pRet->p4.pPr
2670: 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d  ogram;.        }
2680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2690: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65   }..  return pRe
26a0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  t;.}../*.** Chec
26b0: 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  k if the program
26c0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
26d0: 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  M associated wit
26e0: 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20  h pParse may.** 
26f0: 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65  throw an ABORT e
2700: 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e  xception (causin
2710: 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  g the statement,
2720: 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20   but not entire 
2730: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74  transaction.** t
2740: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
2750: 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f  ). This conditio
2760: 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  n is true if the
2770: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72   main program or
2780: 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67   any.** sub-prog
2790: 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e  rams contains an
27a0: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
27b0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f  ng:.**.**   *  O
27c0: 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53  P_Halt with P1=S
27d0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
27e0: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
27f0: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c  ..**   *  OP_Hal
2800: 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d  tIfNull with P1=
2810: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
2820: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
2830: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65  t..**   *  OP_De
2840: 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50  stroy.**   *  OP
2850: 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20  _VUpdate.**   * 
2860: 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20   OP_VRename.**  
2870: 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72   *  OP_FkCounter
2880: 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d   with P2==0 (imm
2890: 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
28a0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a  ey constraint).*
28b0: 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20  *.** Then check 
28c0: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f  that the value o
28d0: 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74  f Parse.mayAbort
28e0: 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a   is true if an.*
28f0: 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74  * ABORT may be t
2900: 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20  hrown, or false 
2910: 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72  otherwise. Retur
2920: 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  n true if it doe
2930: 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66  s.** match, or f
2940: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20  alse otherwise. 
2950: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2960: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
2970: 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  used as.** part 
2980: 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61  of an assert sta
2990: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f  tement in the co
29a0: 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20  mpiler. Similar 
29b0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  to:.**.**   asse
29c0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41  rt( sqlite3VdbeA
29d0: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50  ssertMayAbort(pP
29e0: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61  arse->pVdbe, pPa
29f0: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29  rse->mayAbort) )
2a00: 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.*/.int sqlite3
2a10: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
2a20: 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  rt(Vdbe *v, int 
2a30: 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74  mayAbort){.  int
2a40: 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20   hasAbort = 0;. 
2a50: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65   Op *pOp;.  Vdbe
2a60: 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20  OpIter sIter;.  
2a70: 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30  memset(&sIter, 0
2a80: 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29  , sizeof(sIter))
2a90: 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  ;.  sIter.v = v;
2aa0: 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  ..  while( (pOp 
2ab0: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
2ac0: 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ter))!=0 ){.    
2ad0: 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70  int opcode = pOp
2ae0: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66  ->opcode;.    if
2af0: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73  ( opcode==OP_Des
2b00: 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  troy || opcode==
2b10: 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70  OP_VUpdate || op
2b20: 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65  code==OP_VRename
2b30: 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
2b40: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
2b50: 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64  Y.     || (opcod
2b60: 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20  e==OP_FkCounter 
2b70: 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26  && pOp->p1==0 &&
2b80: 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65   pOp->p2==1) .#e
2b90: 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f  ndif.     || ((o
2ba0: 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c  pcode==OP_Halt |
2bb0: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c  | opcode==OP_Hal
2bc0: 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20  tIfNull) .      
2bd0: 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30 78 66  && ((pOp->p1&0xf
2be0: 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
2bf0: 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32  RAINT && pOp->p2
2c00: 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20 20  ==OE_Abort)).   
2c10: 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62 6f   ){.      hasAbo
2c20: 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  rt = 1;.      br
2c30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
2c40: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76   sqlite3DbFree(v
2c50: 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75  ->db, sIter.apSu
2c60: 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e  b);..  /* Return
2c70: 20 74 72 75 65 20 69 66 20 68 61 73 41 62 6f 72   true if hasAbor
2c80: 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20  t==mayAbort. Or 
2c90: 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
2ca0: 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20  ure occurred..  
2cb0: 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69  ** If malloc fai
2cc0: 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77 68  led, then the wh
2cd0: 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65  ile() loop above
2ce0: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69 74   may not have it
2cf0: 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f  erated.  ** thro
2d00: 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ugh all opcodes 
2d10: 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61 79  and hasAbort may
2d20: 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65 63   be set incorrec
2d30: 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a  tly. Return.  **
2d40: 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 20 63   true for this c
2d50: 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20 74  ase to prevent t
2d60: 68 65 20 61 73 73 65 72 74 28 29 20 69 6e 20 74  he assert() in t
2d70: 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d 65  he callers frame
2d80: 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69  .  ** from faili
2d90: 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ng.  */.  return
2da0: 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63   ( v->db->malloc
2db0: 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f  Failed || hasAbo
2dc0: 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 29 3b 0a  rt==mayAbort );.
2dd0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2de0: 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73  TE_DEBUG - the s
2df0: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
2e00: 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20  bort() function 
2e10: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74  */../*.** Loop t
2e20: 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67 72  hrough the progr
2e30: 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50  am looking for P
2e40: 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72  2 values that ar
2e50: 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6f 6e  e negative.** on
2e60: 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   jump instructio
2e70: 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68 20 76  ns.  Each such v
2e80: 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 2e  alue is a label.
2e90: 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a 2a 2a    Resolve the.**
2ea0: 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69 6e   label by settin
2eb0: 67 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 74  g the P2 value t
2ec0: 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 6e 6f  o its correct no
2ed0: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a  n-zero value..**
2ee0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2ef0: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   is called once 
2f00: 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65  after all opcode
2f10: 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65  s have been inse
2f20: 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69  rted..**.** Vari
2f30: 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41 72  able *pMaxFuncAr
2f40: 67 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  gs is set to the
2f50: 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f   maximum value o
2f60: 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d 65 6e  f any P2 argumen
2f70: 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f 46  t .** to an OP_F
2f80: 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67 67 53  unction, OP_AggS
2f90: 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c 74 65  tep or OP_VFilte
2fa0: 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73 20 69  r opcode. This i
2fb0: 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 73 71  s used by .** sq
2fc0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
2fd0: 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74 68 65  dy() to size the
2fe0: 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72   Vdbe.apArg[] ar
2ff0: 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f  ray..**.** The O
3000: 70 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c 64 20  p.opflags field 
3010: 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20 6f 70  is set on all op
3020: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  codes..*/.static
3030: 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56   void resolveP2V
3040: 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69  alues(Vdbe *p, i
3050: 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  nt *pMaxFuncArgs
3060: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
3070: 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d  t nMaxArgs = *pM
3080: 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70  axFuncArgs;.  Op
3090: 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a   *pOp;.  Parse *
30a0: 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72  pParse = p->pPar
30b0: 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65  se;.  int *aLabe
30c0: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 62  l = pParse->aLab
30d0: 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c  el;.  p->readOnl
30e0: 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52  y = 1;.  p->bIsR
30f0: 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72  eader = 0;.  for
3100: 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70  (pOp=p->aOp, i=p
3110: 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69  ->nOp-1; i>=0; i
3120: 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  --, pOp++){.    
3130: 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  u8 opcode = pOp-
3140: 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a  >opcode;..    /*
3150: 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74   NOTE: Be sure t
3160: 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64  o update mkopcod
3170: 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64 64 69  eh.awk when addi
3180: 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20  ng or removing. 
3190: 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d     ** cases from
31a0: 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a 2f   this switch! */
31b0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 63  .    switch( opc
31c0: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ode ){.      cas
31d0: 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 3a 0a 20  e OP_Function:. 
31e0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 67 67       case OP_Agg
31f0: 53 74 65 70 3a 20 7b 0a 20 20 20 20 20 20 20 20  Step: {.        
3200: 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78  if( pOp->p5>nMax
3210: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
3220: 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 20 20  = pOp->p5;.     
3230: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3240: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
3250: 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20  Transaction: {. 
3260: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
3270: 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64 4f  p2!=0 ) p->readO
3280: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nly = 0;.       
3290: 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f   /* fall thru */
32a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
32b0: 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  ase OP_AutoCommi
32c0: 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  t:.      case OP
32d0: 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20  _Savepoint: {.  
32e0: 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64        p->bIsRead
32f0: 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  er = 1;.        
3300: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
3310: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3320: 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 63 61 73  IT_WAL.      cas
3330: 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a  e OP_Checkpoint:
3340: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61  .#endif.      ca
3350: 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a 20 20  se OP_Vacuum:.  
3360: 20 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72      case OP_Jour
3370: 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20  nalMode: {.     
3380: 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d     p->readOnly =
3390: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62   0;.        p->b
33a0: 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20  IsReader = 1;.  
33b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
33c0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
33d0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
33e0: 54 41 42 4c 45 0a 20 20 20 20 20 20 63 61 73 65  TABLE.      case
33f0: 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20   OP_VUpdate: {. 
3400: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
3410: 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p2>nMaxArgs ) nM
3420: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32  axArgs = pOp->p2
3430: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3440: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
3450: 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20  ase OP_VFilter: 
3460: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b  {.        int n;
3470: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
3480: 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33   p->nOp - i >= 3
3490: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
34a0: 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f  rt( pOp[-1].opco
34b0: 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29  de==OP_Integer )
34c0: 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 70 4f  ;.        n = pO
34d0: 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20  p[-1].p1;.      
34e0: 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73    if( n>nMaxArgs
34f0: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b   ) nMaxArgs = n;
3500: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3510: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
3520: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78       case OP_Nex
3530: 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  t:.      case OP
3540: 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 0a 20 20 20  _NextIfOpen:.   
3550: 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 65     case OP_Sorte
3560: 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20 20  rNext: {.       
3570: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
3580: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
3590: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 4f  Next;.        pO
35a0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41  p->p4type = P4_A
35b0: 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20  DVANCE;.        
35c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
35d0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65       case OP_Pre
35e0: 76 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  v:.      case OP
35f0: 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 7b 0a 20  _PrevIfOpen: {. 
3600: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78         pOp->p4.x
3610: 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65  Advance = sqlite
3620: 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b 0a  3BtreePrevious;.
3630: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74          pOp->p4t
3640: 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45  ype = P4_ADVANCE
3650: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3660: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
3670: 20 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73      pOp->opflags
3680: 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65   = sqlite3Opcode
3690: 50 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d  Property[opcode]
36a0: 3b 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e  ;.    if( (pOp->
36b0: 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f  opflags & OPFLG_
36c0: 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f 70 2d  JUMP)!=0 && pOp-
36d0: 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 61  >p2<0 ){.      a
36e0: 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70  ssert( -1-pOp->p
36f0: 32 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c  2<pParse->nLabel
3700: 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70   );.      pOp->p
3710: 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f  2 = aLabel[-1-pO
3720: 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20  p->p2];.    }.  
3730: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
3740: 65 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d  e(p->db, pParse-
3750: 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61 72  >aLabel);.  pPar
3760: 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a  se->aLabel = 0;.
3770: 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c    pParse->nLabel
3780: 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e   = 0;.  *pMaxFun
3790: 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73  cArgs = nMaxArgs
37a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  ;.  assert( p->b
37b0: 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 70  IsReader!=0 || p
37c0: 2d 3e 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20 29  ->btreeMask==0 )
37d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
37e0: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
37f0: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
3800: 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65  ction to be inse
3810: 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rted..*/.int sql
3820: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
3830: 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ddr(Vdbe *p){.  
3840: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
3850: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
3860: 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  T );.  return p-
3870: 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  >nOp;.}../*.** T
3880: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
3890: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
38a0: 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f  o the array of o
38b0: 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65  pcodes associate
38c0: 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64  d with.** the Vd
38d0: 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
38e0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
38f0: 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
3900: 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
3910: 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20  y.** to arrange 
3920: 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65 64  for the returned
3930: 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76 65   array to be eve
3940: 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73  ntually freed us
3950: 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65  ing the .** vdbe
3960: 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66 75  FreeOpArray() fu
3970: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65  nction..**.** Be
3980: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
3990: 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20  *pnOp is set to 
39a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
39b0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65 74  tries in the ret
39c0: 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20  urned.** array. 
39d0: 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20  Also, *pnMaxArg 
39e0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61  is set to the la
39f0: 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72 72  rger of its curr
3a00: 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a  ent value and .*
3a10: 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
3a20: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 56  entries in the V
3a30: 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61  dbe.apArg[] arra
3a40: 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 78  y required to ex
3a50: 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65  ecute the .** re
3a60: 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a  turned program..
3a70: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
3a80: 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61  e3VdbeTakeOpArra
3a90: 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a  y(Vdbe *p, int *
3aa0: 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78  pnOp, int *pnMax
3ab0: 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  Arg){.  VdbeOp *
3ac0: 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20  aOp = p->aOp;.  
3ad0: 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20 21  assert( aOp && !
3ae0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
3af0: 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  led );..  /* Che
3b00: 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33 56  ck that sqlite3V
3b10: 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20 77  dbeUsesBtree() w
3b20: 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e  as not called on
3b30: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73   this VM */.  as
3b40: 73 65 72 74 28 20 70 2d 3e 62 74 72 65 65 4d 61  sert( p->btreeMa
3b50: 73 6b 3d 3d 30 20 29 3b 0a 0a 20 20 72 65 73 6f  sk==0 );..  reso
3b60: 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70  lveP2Values(p, p
3b70: 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f  nMaxArg);.  *pnO
3b80: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d  p = p->nOp;.  p-
3b90: 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75  >aOp = 0;.  retu
3ba0: 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aOp;.}../*.**
3bb0: 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73   Add a whole lis
3bc0: 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20  t of operations 
3bd0: 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
3be0: 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20   stack.  Return 
3bf0: 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f  the.** address o
3c00: 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  f the first oper
3c10: 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a  ation added..*/.
3c20: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
3c30: 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70  ddOpList(Vdbe *p
3c40: 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f  , int nOp, VdbeO
3c50: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70  pList const *aOp
3c60: 2c 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 29 7b 0a  , int iLineno){.
3c70: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73    int addr;.  as
3c80: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
3c90: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3ca0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
3cb0: 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73  + nOp > p->pPars
3cc0: 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67  e->nOpAlloc && g
3cd0: 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b  rowOpArray(p) ){
3ce0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3cf0: 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e   }.  addr = p->n
3d00: 4f 70 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  Op;.  if( ALWAYS
3d10: 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20 20 69  (nOp>0) ){.    i
3d20: 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70  nt i;.    VdbeOp
3d30: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20  List const *pIn 
3d40: 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69  = aOp;.    for(i
3d50: 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20  =0; i<nOp; i++, 
3d60: 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  pIn++){.      in
3d70: 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a  t p2 = pIn->p2;.
3d80: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
3d90: 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61  ut = &p->aOp[i+a
3da0: 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74  ddr];.      pOut
3db0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e  ->opcode = pIn->
3dc0: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f  opcode;.      pO
3dd0: 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31  ut->p1 = pIn->p1
3de0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c 30  ;.      if( p2<0
3df0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
3e00: 72 74 28 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  rt( sqlite3Opcod
3e10: 65 50 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e  eProperty[pOut->
3e20: 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f  opcode] & OPFLG_
3e30: 4a 55 4d 50 20 29 3b 0a 20 20 20 20 20 20 20 20  JUMP );.        
3e40: 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20  pOut->p2 = addr 
3e50: 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20  + ADDR(p2);.    
3e60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3e70: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a   pOut->p2 = p2;.
3e80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
3e90: 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33  ut->p3 = pIn->p3
3ea0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34  ;.      pOut->p4
3eb0: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
3ec0: 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  D;.      pOut->p
3ed0: 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  4.p = 0;.      p
3ee0: 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66  Out->p5 = 0;.#if
3ef0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3f00: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
3f10: 54 53 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a  TS.      pOut->z
3f20: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e  Comment = 0;.#en
3f30: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
3f40: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a  E_VDBE_COVERAGE.
3f50: 20 20 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63        pOut->iSrc
3f60: 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69  Line = iLineno+i
3f70: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 28 76  ;.#else.      (v
3f80: 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e  oid)iLineno;.#en
3f90: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
3fa0: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66  E_DEBUG.      if
3fb0: 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  ( p->db->flags &
3fc0: 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
3fd0: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pTrace ){.      
3fe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
3ff0: 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20  ntOp(0, i+addr, 
4000: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29  &p->aOp[i+addr])
4010: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
4020: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f  .    }.    p->nO
4030: 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20  p += nOp;.  }.  
4040: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
4050: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
4060: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31   value of the P1
4070: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
4080: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
4090: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
40a0: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
40b0: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
40c0: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
40d0: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
40e0: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
40f0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
4100: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
4110: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
4120: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
4130: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  e program..*/.vo
4140: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
4150: 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20  angeP1(Vdbe *p, 
4160: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
4170: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
4180: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33  =0 );.  if( ((u3
4190: 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29  2)p->nOp)>addr )
41a0: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
41b0: 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p1 = val;.  }
41c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
41d0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
41e0: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P2 operand for
41f0: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
4200: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
4210: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
4220: 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61  ul for setting a
4230: 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
4240: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
4250: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56  e3VdbeChangeP2(V
4260: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
4270: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
4280: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
4290: 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70  if( ((u32)p->nOp
42a0: 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d  )>addr ){.    p-
42b0: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20  >aOp[addr].p2 = 
42c0: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
42d0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
42e0: 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65  ue of the P3 ope
42f0: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
4300: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
4310: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4320: 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62  VdbeChangeP3(Vdb
4330: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
4340: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
4350: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
4360: 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e  ( ((u32)p->nOp)>
4370: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
4380: 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76 61  Op[addr].p3 = va
4390: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
43a0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
43b0: 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72 61   of the P5 opera
43c0: 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  nd for the most 
43d0: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65  recently.** adde
43e0: 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  d operation..*/.
43f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4400: 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70  ChangeP5(Vdbe *p
4410: 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73 73  , u8 val){.  ass
4420: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69  ert( p!=0 );.  i
4430: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
4440: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
4450: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  0 );.    p->aOp[
4460: 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76  p->nOp-1].p5 = v
4470: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
4480: 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f   Change the P2 o
4490: 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75  perand of instru
44a0: 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68  ction addr so th
44b0: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a  at it points to.
44c0: 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  ** the address o
44d0: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
44e0: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64  uction to be cod
44f0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
4500: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
4510: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
4520: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r){.  sqlite3Vdb
4530: 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64  eChangeP2(p, add
4540: 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 70 2d  r, p->nOp);.  p-
4550: 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65 64 4f  >pParse->iFixedO
4560: 70 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  p = p->nOp - 1;.
4570: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
4580: 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73   input FuncDef s
4590: 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65  tructure is ephe
45a0: 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65  meral, then free
45b0: 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
45c0: 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65  FuncDef is not e
45d0: 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f  phermal, then do
45e0: 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61   nothing..*/.sta
45f0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68  tic void freeEph
4600: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73  emeralFunction(s
4610: 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63  qlite3 *db, Func
4620: 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66  Def *pDef){.  if
4630: 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20 26  ( ALWAYS(pDef) &
4640: 26 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  & (pDef->funcFla
4650: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
4660: 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20  _EPHEM)!=0 ){.  
4670: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4680: 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d  db, pDef);.  }.}
4690: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  ..static void vd
46a0: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
46b0: 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69  lite3 *, Op *, i
46c0: 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  nt);../*.** Dele
46d0: 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69 66  te a P4 value if
46e0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73   necessary..*/.s
46f0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
4700: 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  4(sqlite3 *db, i
4710: 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20  nt p4type, void 
4720: 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20 29  *p4){.  if( p4 )
4730: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
4740: 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20   );.    switch( 
4750: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  p4type ){.      
4760: 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20  case P4_REAL:.  
4770: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
4780: 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  4:.      case P4
4790: 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20  _DYNAMIC:.      
47a0: 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59  case P4_INTARRAY
47b0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
47c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34  te3DbFree(db, p4
47d0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
47e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
47f0: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
4800: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   {.        if( d
4810: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
4820: 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79 49  =0 ) sqlite3KeyI
4830: 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e 66  nfoUnref((KeyInf
4840: 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20  o*)p4);.        
4850: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4860: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52       case P4_MPR
4870: 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20  INTF: {.        
4880: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
4890: 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65  reed==0 ) sqlite
48a0: 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20 20 20  3_free(p4);.    
48b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
48c0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
48d0: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
48e0: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
48f0: 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46  lFunction(db, (F
4900: 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20  uncDef*)p4);.   
4910: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4920: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4930: 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20  4_MEM: {.       
4940: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4950: 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Freed==0 ){.    
4960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
4970: 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f  ueFree((sqlite3_
4980: 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20  value*)p4);.    
4990: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
49a0: 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d       Mem *p = (M
49b0: 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20  em*)p4;.        
49c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
49d0: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
49e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
49f0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
4a00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4a10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4a20: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
4a30: 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20 20  VTAB : {.       
4a40: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4a50: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
4a60: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54  e3VtabUnlock((VT
4a70: 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20  able *)p4);.    
4a80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4a90: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
4aa0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73  /*.** Free the s
4ab0: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
4ac0: 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70  or aOp and any p
4ad0: 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74  4 values allocat
4ae0: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70  ed for the.** op
4af0: 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20  codes contained 
4b00: 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69  within. If aOp i
4b10: 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73  s not NULL it is
4b20: 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74   assumed to cont
4b30: 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72  ain .** nOp entr
4b40: 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ies. .*/.static 
4b50: 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41  void vdbeFreeOpA
4b60: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62  rray(sqlite3 *db
4b70: 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e  , Op *aOp, int n
4b80: 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29  Op){.  if( aOp )
4b90: 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  {.    Op *pOp;. 
4ba0: 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20     for(pOp=aOp; 
4bb0: 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70  pOp<&aOp[nOp]; p
4bc0: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65  Op++){.      fre
4bd0: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
4be0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
4bf0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
4c00: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
4c10: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71 6c  MMENTS.      sql
4c20: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4c30: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
4c40: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
4c50: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
4c60: 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d  Free(db, aOp);.}
4c70: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
4c80: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
4c90: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
4ca0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
4cb0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
4cc0: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
4cd0: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
4ce0: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
4cf0: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
4d00: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
4d10: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
4d20: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
4d30: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
4d40: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
4d50: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
4d60: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
4d70: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
4d80: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
4d90: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
4da0: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
4db0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
4dc0: 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69  opcode at addr i
4dd0: 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76  nto OP_Noop.*/.v
4de0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
4df0: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65  hangeToNoop(Vdbe
4e00: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
4e10: 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a    if( p->aOp ){.
4e20: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20      VdbeOp *pOp 
4e30: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
4e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
4e50: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72   = p->db;.    fr
4e60: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
4e70: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
4e80: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70  ;.    memset(pOp
4e90: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b  , 0, sizeof(pOp[
4ea0: 30 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f  0]));.    pOp->o
4eb0: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
4ec0: 0a 20 20 20 20 69 66 28 20 61 64 64 72 3d 3d 70  .    if( addr==p
4ed0: 2d 3e 6e 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f 70  ->nOp-1 ) p->nOp
4ee0: 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  --;.  }.}../*.**
4ef0: 20 52 65 6d 6f 76 65 20 74 68 65 20 6c 61 73 74   Remove the last
4f00: 20 6f 70 63 6f 64 65 20 69 6e 73 65 72 74 65 64   opcode inserted
4f10: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
4f20: 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70  dbeDeletePriorOp
4f30: 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38  code(Vdbe *p, u8
4f40: 20 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d 3e   op){.  if( (p->
4f50: 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72 73  nOp-1)>(p->pPars
4f60: 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26 20  e->iFixedOp) && 
4f70: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
4f80: 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20  .opcode==op ){. 
4f90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
4fa0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d  angeToNoop(p, p-
4fb0: 3e 6e 4f 70 2d 31 29 3b 0a 20 20 20 20 72 65 74  >nOp-1);.    ret
4fc0: 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 1;.  }else{.
4fd0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4fe0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
4ff0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
5000: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f  he P4 operand fo
5010: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
5020: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
5030: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5040: 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65  ful when a large
5050: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64   program is load
5060: 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61  ed from a.** sta
5070: 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20  tic array using 
5080: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5090: 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74  List but we want
50a0: 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65   to make a.** fe
50b0: 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20  w minor changes 
50c0: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
50d0: 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68  **.** If n>=0 th
50e0: 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e  en the P4 operan
50f0: 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65  d is dynamic, me
5100: 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70  aning that a cop
5110: 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69  y of.** the stri
5120: 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20  ng is made into 
5130: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
5140: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
5150: 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75  loc()..** A valu
5160: 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20  e of n==0 means 
5170: 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50  copy bytes of zP
5180: 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c  4 up to and incl
5190: 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72  uding the.** fir
51a0: 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49  st null byte.  I
51b0: 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20  f n>0 then copy 
51c0: 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34  n+1 bytes of zP4
51d0: 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76  ..** .** Other v
51e0: 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53  alues of n (P4_S
51f0: 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45  TATIC, P4_COLLSE
5200: 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65  Q etc.) indicate
5210: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
5220: 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20  .** to a string 
5230: 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61  or structure tha
5240: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
5250: 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65  to exist for the
5260: 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20   lifetime of.** 
5270: 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65  the Vdbe. In the
5280: 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20  se cases we can 
5290: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f  just copy the po
52a0: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inter..**.** If 
52b0: 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e  addr<0 then chan
52c0: 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  ge P4 on the mos
52d0: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
52e0: 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ted instruction.
52f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5300: 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62  VdbeChangeP4(Vdb
5310: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
5320: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
5330: 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70   int n){.  Op *p
5340: 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Op;.  sqlite3 *d
5350: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  b;.  assert( p!=
5360: 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  0 );.  db = p->d
5370: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  b;.  assert( p->
5380: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
5390: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
53a0: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d  p->aOp==0 || db-
53b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
53c0: 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56  .    if( n!=P4_V
53d0: 54 41 42 20 29 7b 0a 20 20 20 20 20 20 66 72 65  TAB ){.      fre
53e0: 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64  eP4(db, n, (void
53f0: 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29  *)*(char**)&zP4)
5400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
5410: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
5420: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20  ( p->nOp>0 );.  
5430: 61 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e  assert( addr<p->
5440: 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64  nOp );.  if( add
5450: 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20  r<0 ){.    addr 
5460: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
5470: 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  }.  pOp = &p->aO
5480: 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73 65 72  p[addr];.  asser
5490: 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
54a0: 50 34 5f 4e 4f 54 55 53 45 44 0a 20 20 20 20 20  P4_NOTUSED.     
54b0: 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65    || pOp->p4type
54c0: 3d 3d 50 34 5f 49 4e 54 33 32 0a 20 20 20 20 20  ==P4_INT32.     
54d0: 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65    || pOp->p4type
54e0: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a  ==P4_KEYINFO );.
54f0: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70    freeP4(db, pOp
5500: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
5510: 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  4.p);.  pOp->p4.
5520: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d  p = 0;.  if( n==
5530: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
5540: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
5550: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
5560: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
5570: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
5580: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
5590: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
55a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
55b0: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
55c0: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
55d0: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
55e0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
55f0: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
5600: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
5610: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
5620: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5630: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d   P4_NOTUSED;.  }
5640: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b  else if( n==P4_K
5650: 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4f  EYINFO ){.    pO
5660: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
5670: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
5680: 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e  4type = P4_KEYIN
5690: 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FO;.  }else if( 
56a0: 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20  n==P4_VTAB ){.  
56b0: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
56c0: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
56d0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56  p->p4type = P4_V
56e0: 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  TAB;.    sqlite3
56f0: 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65  VtabLock((VTable
5700: 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73   *)zP4);.    ass
5710: 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29  ert( ((VTable *)
5720: 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20  zP4)->db==p->db 
5730: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  );.  }else if( n
5740: 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  <0 ){.    pOp->p
5750: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
5760: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5770: 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  e = (signed char
5780: 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )n;.  }else{.   
5790: 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20   if( n==0 ) n = 
57a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
57b0: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
57c0: 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53  4.z = sqlite3DbS
57d0: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50  trNDup(p->db, zP
57e0: 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  4, n);.    pOp->
57f0: 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41  p4type = P4_DYNA
5800: 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  MIC;.  }.}../*.*
5810: 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20  * Set the P4 on 
5820: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
5830: 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74  y added opcode t
5840: 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f  o the KeyInfo fo
5850: 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67  r the.** index g
5860: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
5870: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
5880: 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  yInfo(Parse *pPa
5890: 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  rse, Index *pIdx
58a0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
58b0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
58c0: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
58d0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
58e0: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
58f0: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
5900: 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
5910: 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
5920: 50 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20 20  Parse, pIdx),.  
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
5950: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
5960: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
5970: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20  _COMMENTS./*.** 
5980: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
5990: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
59a0: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
59b0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
59c0: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
59d0: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
59e0: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
59f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
5a00: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
5a10: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
5a20: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
5a30: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
5a40: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
5a50: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
5a60: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
5a70: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65   void vdbeVComme
5a80: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
5a90: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
5aa0: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
5ab0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
5ac0: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
5ad0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
5ae0: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
5af0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
5b00: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
5b10: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
5b20: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
5b30: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
5b40: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
5b50: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
5b60: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
5b70: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d  Comment);.    p-
5b80: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
5b90: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
5ba0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
5bb0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
5bc0: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
5bd0: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
5be0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
5bf0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
5c00: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
5c10: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61   if( p ){.    va
5c20: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
5c30: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
5c40: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
5c50: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
5c60: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
5c70: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
5c80: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
5c90: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
5ca0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
5cb0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
5cc0: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
5cd0: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
5ce0: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f  P_Noop);.    va_
5cf0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
5d00: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
5d10: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
5d20: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
5d30: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
5d40: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
5d50: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5d60: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a  VDBE_COVERAGE./*
5d70: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
5d80: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e  e if the iSrcLin
5d90: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20  e field for the 
5da0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64  previously coded
5db0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
5dc0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5dd0: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56  eSetLineNumber(V
5de0: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e  dbe *v, int iLin
5df0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
5e00: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53  eGetOp(v,-1)->iS
5e10: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a  rcLine = iLine;.
5e20: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
5e30: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
5e40: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
5e50: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
5e60: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
5e70: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
5e80: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
5e90: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
5ea0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
5eb0: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
5ec0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
5ed0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
5ee0: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
5ef0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
5f00: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
5f10: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
5f20: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
5f30: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
5f40: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
5f50: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
5f60: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
5f70: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
5f80: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
5f90: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
5fa0: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
5fb0: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
5fc0: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
5fd0: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
5fe0: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f  ing.** after a O
5ff0: 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74  OM fault without
6000: 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b   having to check
6010: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
6020: 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74  eturn from .** t
6030: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
6040: 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20   valid pointer. 
6050: 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
6060: 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73   dummy.opcode is
6070: 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c   0,.** dummy wil
6080: 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74  l never be writt
6090: 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20  en to.  This is 
60a0: 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65  verified by code
60b0: 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a   inspection and.
60c0: 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69  ** by running wi
60d0: 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a  th Valgrind..*/.
60e0: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
60f0: 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70  dbeGetOp(Vdbe *p
6100: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f  , int addr){.  /
6110: 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20  * C89 specifies 
6120: 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e  that the constan
6130: 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62  t "dummy" will b
6140: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
6150: 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c   all.  ** zeros,
6160: 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63   which is correc
6170: 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74  t.  MSVC generat
6180: 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65  es a warning, ne
6190: 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20  vertheless. */. 
61a0: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64   static VdbeOp d
61b0: 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  ummy;  /* Ignore
61c0: 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e   the MSVC warnin
61d0: 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69  g about no initi
61e0: 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65  alizer */.  asse
61f0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
6200: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
6210: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
6220: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
6230: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73  Op - 1;.  }.  as
6240: 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26  sert( (addr>=0 &
6250: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c  & addr<p->nOp) |
6260: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
6270: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
6280: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
6290: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
62a0: 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79   (VdbeOp*)&dummy
62b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
62c0: 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64  eturn &p->aOp[ad
62d0: 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  dr];.  }.}..#if 
62e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
62f0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
6300: 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65  MMENTS)./*.** Re
6310: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
6320: 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66  value for one of
6330: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
6340: 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f  to the opcode pO
6350: 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20  p.** determined 
6360: 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a  by character c..
6370: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72  */.static int tr
6380: 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c  anslateP(char c,
6390: 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b   const Op *pOp){
63a0: 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20  .  if( c=='1' ) 
63b0: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a  return pOp->p1;.
63c0: 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72    if( c=='2' ) r
63d0: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20  eturn pOp->p2;. 
63e0: 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65   if( c=='3' ) re
63f0: 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  turn pOp->p3;.  
6400: 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74  if( c=='4' ) ret
6410: 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  urn pOp->p4.i;. 
6420: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b   return pOp->p5;
6430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
6440: 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74  e a string for t
6450: 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65  he "comment" fie
6460: 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63  ld of a VDBE opc
6470: 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a  ode listing..**.
6480: 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a  ** The Synopsis:
6490: 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e   field in commen
64a0: 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63  ts in the vdbe.c
64b0: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74   source file get
64c0: 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74  s converted.** t
64d0: 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e  o an extra strin
64e0: 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e 64  g that is append
64f0: 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ed to the sqlite
6500: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20  3OpcodeName().  
6510: 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63  In the.** absenc
6520: 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65  e of other comme
6530: 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73  nts, this synops
6540: 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  is becomes the c
6550: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70  omment on the op
6560: 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72  code..** Some tr
6570: 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73  anslation occurs
6580: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50  :.**.**       "P
6590: 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58  X"      ->  "r[X
65a0: 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40  ]".**       "PX@
65b0: 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY"   ->  "r[X..
65c0: 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78  X+Y-1]"  or "r[x
65d0: 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72 20  ]" if y is 0 or 
65e0: 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50  1.**       "PX@P
65f0: 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58  Y+1" ->  "r[X..X
6600: 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d  +Y]"    or "r[x]
6610: 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20  " if y is 0.**  
6620: 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d       "PY..PY"  -
6630: 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20  >  "r[X..Y]"    
6640: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
6650: 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  <=x.*/.static in
6660: 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74  t displayComment
6670: 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f  (.  const Op *pO
6680: 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  p,     /* The op
6690: 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65  code to be comme
66a0: 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  nted */.  const 
66b0: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20  char *zP4,   /* 
66c0: 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69  Previously obtai
66d0: 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34  ned value for P4
66e0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d   */.  char *zTem
66f0: 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  p,       /* Writ
6700: 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  e result here */
6710: 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20  .  int nTemp    
6720: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
6730: 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d  vailable in zTem
6740: 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  p[] */.){.  cons
6750: 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b  t char *zOpName;
6760: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6770: 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20  Synopsis;.  int 
6780: 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69  nOpName;.  int i
6790: 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65  i, jj;.  zOpName
67a0: 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65   = sqlite3Opcode
67b0: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
67c0: 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73  );.  nOpName = s
67d0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
67e0: 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  OpName);.  if( z
67f0: 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31  OpName[nOpName+1
6800: 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65  ] ){.    int see
6810: 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68  nCom = 0;.    ch
6820: 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70  ar c;.    zSynop
6830: 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d  sis = zOpName +=
6840: 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20   nOpName + 1;.  
6850: 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a    for(ii=jj=0; j
6860: 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20  j<nTemp-1 && (c 
6870: 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29  = zSynopsis[ii])
6880: 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  !=0; ii++){.    
6890: 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a    if( c=='P' ){.
68a0: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e          c = zSyn
68b0: 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20  opsis[++ii];.   
68c0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20       if( c=='4' 
68d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
68e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
68f0: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
6900: 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20  , "%s", zP4);.  
6910: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6920: 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20  c=='X' ){.      
6930: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6940: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
6950: 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70  Temp+jj, "%s", p
6960: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  Op->zComment);. 
6970: 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d           seenCom
6980: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
6990: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
69a0: 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74  nt v1 = translat
69b0: 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20  eP(c, pOp);.    
69c0: 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20        int v2;.  
69d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
69e0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
69f0: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64  j, zTemp+jj, "%d
6a00: 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20  ", v1);.        
6a10: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53    if( strncmp(zS
6a20: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40  ynopsis+ii+1, "@
6a30: 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20  P", 2)==0 ){.   
6a40: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33           ii += 3
6a50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  ;.            jj
6a60: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
6a70: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20  n30(zTemp+jj);. 
6a80: 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d 20             v2 = 
6a90: 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f  translateP(zSyno
6aa0: 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a  psis[ii], pOp);.
6ab0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6ac0: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
6ad0: 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d  s+ii+1,"+1",2)==
6ae0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6af0: 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20     ii += 2;.    
6b00: 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a            v2++;.
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6b20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 32            if( v2
6b30: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
6b40: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6b50: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
6b60: 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c  Temp+jj, "..%d",
6b70: 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20   v1+v2-1);.     
6b80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6b90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
6ba0: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69  ncmp(zSynopsis+i
6bb0: 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d  i+1, "..P3", 4)=
6bc0: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30  =0 && pOp->p3==0
6bd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6be0: 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20  ii += 4;.       
6bf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
6c00: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c         jj += sql
6c10: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
6c20: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65  mp+jj);.      }e
6c30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65  lse{.        zTe
6c40: 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  mp[jj++] = c;.  
6c50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6c60: 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20  if( !seenCom && 
6c70: 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f  jj<nTemp-5 && pO
6c80: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
6c90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6ca0: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
6cb0: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22  zTemp+jj, "; %s"
6cc0: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
6cd0: 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71  ;.      jj += sq
6ce0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
6cf0: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20  emp+jj);.    }. 
6d00: 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20     if( jj<nTemp 
6d10: 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b  ) zTemp[jj] = 0;
6d20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70  .  }else if( pOp
6d30: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
6d40: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6d50: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6d60: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d   "%s", pOp->zCom
6d70: 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20  ment);.    jj = 
6d80: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6d90: 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  zTemp);.  }else{
6da0: 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20  .    zTemp[0] = 
6db0: 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20  0;.    jj = 0;. 
6dc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a   }.  return jj;.
6dd0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
6de0: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 0a 23 69  TE_DEBUG */...#i
6df0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
6e00: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20  E_OMIT_EXPLAIN) 
6e10: 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  || !defined(NDEB
6e20: 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65  UG) \.     || de
6e30: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
6e40: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
6e50: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
6e60: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
6e70: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
6e80: 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65  es the P4 parame
6e90: 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64  ter for an opcod
6ea0: 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20  e..** Use zTemp 
6eb0: 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64  for any required
6ec0: 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
6ed0: 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  r space..*/.stat
6ee0: 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79  ic char *display
6ef0: 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72  P4(Op *pOp, char
6f00: 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65   *zTemp, int nTe
6f10: 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  mp){.  char *zP4
6f20: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65   = zTemp;.  asse
6f30: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
6f40: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e  .  switch( pOp->
6f50: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p4type ){.    ca
6f60: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
6f70: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  .      int i, j;
6f80: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
6f90: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
6fa0: 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
6fb0: 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
6fc0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
6fd0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
6fe0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6ff0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28 25 64  mp, zTemp, "k(%d
7000: 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  ", pKeyInfo->nFi
7010: 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20  eld);.      i = 
7020: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
7030: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  zTemp);.      fo
7040: 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66  r(j=0; j<pKeyInf
7050: 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  o->nField; j++){
7060: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
7070: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
7080: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
7090: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
70a0: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20   *zColl = pColl 
70b0: 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
70c0: 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20 20 20   "nil";.        
70d0: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
70e0: 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b 0a  trlen30(zColl);.
70f0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 36          if( n==6
7100: 20 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f 6c 6c   && memcmp(zColl
7110: 2c 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d 30 20  ,"BINARY",6)==0 
7120: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f  ){.          zCo
7130: 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 20  ll = "B";.      
7140: 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20      n = 1;.     
7150: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
7160: 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a   i+n>nTemp-6 ){.
7170: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
7180: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e  (&zTemp[i],",...
7190: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",4);.          
71a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
71b0: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69  .        zTemp[i
71c0: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
71d0: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
71e0: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29  >aSortOrder[j] )
71f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d  {.          zTem
7200: 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20  p[i++] = '-';.  
7210: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7220: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
7230: 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a 20  , zColl, n+1);. 
7240: 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20         i += n;. 
7250: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65       }.      zTe
7260: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20  mp[i++] = ')';. 
7270: 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20       zTemp[i] = 
7280: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
7290: 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20   i<nTemp );.    
72a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
72b0: 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53     case P4_COLLS
72c0: 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  EQ: {.      Coll
72d0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70  Seq *pColl = pOp
72e0: 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20  ->p4.pColl;.    
72f0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7300: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7310: 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c   "(%.20s)", pCol
7320: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
7330: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7340: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
7350: 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  F: {.      FuncD
7360: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
7370: 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  p4.pFunc;.      
7380: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7390: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
73a0: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
73b0: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
73c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
73d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
73e0: 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20  4_INT64: {.     
73f0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7400: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7410: 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34  "%lld", *pOp->p4
7420: 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72  .pI64);.      br
7430: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7440: 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a  ase P4_INT32: {.
7450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7460: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
7470: 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e  emp, "%d", pOp->
7480: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65  p4.i);.      bre
7490: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
74a0: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20  se P4_REAL: {.  
74b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
74c0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
74d0: 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70  p, "%.16g", *pOp
74e0: 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20  ->p4.pReal);.   
74f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7500: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
7510: 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d   {.      Mem *pM
7520: 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65  em = pOp->p4.pMe
7530: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  m;.      if( pMe
7540: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  m->flags & MEM_S
7550: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  tr ){.        zP
7560: 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  4 = pMem->z;.   
7570: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
7580: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  m->flags & MEM_I
7590: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
75a0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
75b0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c  Temp, zTemp, "%l
75c0: 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b  ld", pMem->u.i);
75d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
75e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
75f0: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
7600: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7610: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7620: 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d  , "%.16g", pMem-
7630: 3e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >r);.      }else
7640: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
7650: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
7660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
7670: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
7680: 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20  Temp, "NULL");. 
7690: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
76a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
76b0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
76c0: 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50  ob );.        zP
76d0: 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20  4 = "(blob)";.  
76e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
76f0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
7700: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
7710: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
7720: 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20  se P4_VTAB: {.  
7730: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
7740: 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70   *pVtab = pOp->p
7750: 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a  4.pVtab->pVtab;.
7760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7770: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
7780: 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70  emp, "vtab:%p:%p
7790: 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d  ", pVtab, pVtab-
77a0: 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20  >pModule);.     
77b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
77c0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
77d0: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
77e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
77f0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7800: 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20  , "intarray");. 
7810: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7820: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55  }.    case P4_SU
7830: 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20  BPROGRAM: {.    
7840: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7850: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7860: 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20   "program");.   
7870: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7880: 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41      case P4_ADVA
7890: 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65  NCE: {.      zTe
78a0: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
78b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
78c0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
78d0: 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34     zP4 = pOp->p4
78e0: 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  .z;.      if( zP
78f0: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  4==0 ){.        
7900: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP4 = zTemp;.   
7910: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
7920: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
7930: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a  .  }.  assert( z
7940: 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  P4!=0 );.  retur
7950: 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n zP4;.}.#endif.
7960: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74  ./*.** Declare t
7970: 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20  o the Vdbe that 
7980: 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74  the BTree object
7990: 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69   at db->aDb[i] i
79a0: 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s used..**.** Th
79b0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
79c0: 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e  ments need to kn
79d0: 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68  ow in advance th
79e0: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f  e complete set o
79f0: 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61  f.** attached da
7a00: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
7a10: 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73  l be use.  A mas
7a20: 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62  k of these datab
7a30: 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74  ases.** is maint
7a40: 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65  ained in p->btre
7a50: 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c  eMask.  The p->l
7a60: 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73  ockMask value is
7a70: 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a   the subset of.*
7a80: 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f  * p->btreeMask o
7a90: 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  f databases that
7aa0: 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
7ab0: 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lock..*/.void sq
7ac0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
7ad0: 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ee(Vdbe *p, int 
7ae0: 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e  i){.  assert( i>
7af0: 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e  =0 && i<p->db->n
7b00: 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a  Db && i<(int)siz
7b10: 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29  eof(yDbMask)*8 )
7b20: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69  ;.  assert( i<(i
7b30: 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72  nt)sizeof(p->btr
7b40: 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 70  eeMask)*8 );.  p
7b50: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 28  ->btreeMask |= (
7b60: 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a  (yDbMask)1)<<i;.
7b70: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 73 71    if( i!=1 && sq
7b80: 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62  lite3BtreeSharab
7b90: 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d  le(p->db->aDb[i]
7ba0: 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  .pBt) ){.    p->
7bb0: 6c 6f 63 6b 4d 61 73 6b 20 7c 3d 20 28 28 79 44  lockMask |= ((yD
7bc0: 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 7d  bMask)1)<<i;.  }
7bd0: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
7be0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
7bf0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
7c00: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
7c10: 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  0./*.** If SQLit
7c20: 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f  e is compiled to
7c30: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
7c40: 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74  cache mode and t
7c50: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c  o be threadsafe,
7c60: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
7c70: 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74   obtains the mut
7c80: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
7c90: 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64  th each BtShared
7ca0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68   structure.** th
7cb0: 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  at may be access
7cc0: 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
7cd0: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
7ce0: 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20  nt. In doing so 
7cf0: 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20  it also.** sets 
7d00: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
7d10: 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f  member of each o
7d20: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  f the BtShared s
7d30: 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72  tructures, ensur
7d40: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ing.** that the 
7d50: 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e  correct busy-han
7d60: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73  dler callback is
7d70: 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75   invoked if requ
7d80: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  ired..**.** If S
7d90: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72  QLite is not thr
7da0: 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73  eadsafe but does
7db0: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
7dc0: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e  cache mode, then
7dd0: 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
7de0: 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b  Enter() is invok
7df0: 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74  ed to set the Bt
7e00: 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62  Shared.db variab
7e10: 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  les.** of all of
7e20: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
7e30: 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20  ures accessible 
7e40: 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65  via the database
7e50: 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f   handle .** asso
7e60: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
7e70: 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  VM..**.** If SQL
7e80: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
7e90: 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e  dsafe and does n
7ea0: 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  ot support share
7eb0: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
7ec0: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  is.** function i
7ed0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
7ee0: 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73   The p->btreeMas
7ef0: 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74  k field is a bit
7f00: 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65  mask of all btre
7f10: 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70  es that the prep
7f20: 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65  ared .** stateme
7f30: 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75  nt p will ever u
7f40: 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68  se.  Let N be th
7f50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
7f60: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
7f70: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
7f80: 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74  g to btrees that
7f90: 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68   use shared cach
7fa0: 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e  e.  Then the run
7fb0: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20  time of.** this 
7fc0: 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20  routine is N*N. 
7fd0: 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72   But as N is rar
7fe0: 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c  ely more than 1,
7ff0: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   this should not
8000: 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  .** be a problem
8010: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8020: 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20  3VdbeEnter(Vdbe 
8030: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
8040: 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20  yDbMask mask;.  
8050: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
8060: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44  b *aDb;.  int nD
8070: 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b  b;.  if( p->lock
8080: 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e  Mask==0 ) return
8090: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  ;  /* The common
80a0: 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20   case */.  db = 
80b0: 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64  p->db;.  aDb = d
80c0: 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20  b->aDb;.  nDb = 
80d0: 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69  db->nDb;.  for(i
80e0: 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44  =0, mask=1; i<nD
80f0: 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20  b; i++, mask += 
8100: 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20 69  mask){.    if( i
8110: 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20 70  !=1 && (mask & p
8120: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20 26  ->lockMask)!=0 &
8130: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
8140: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
8150: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
8160: 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  er(aDb[i].pBt);.
8170: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
8180: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
8190: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
81a0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
81b0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
81c0: 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61  0./*.** Unlock a
81d0: 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73  ll of the btrees
81e0: 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b   previously lock
81f0: 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20  ed by a call to 
8200: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
8210: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
8220: 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62  te3VdbeLeave(Vdb
8230: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
8240: 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a    yDbMask mask;.
8250: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
8260: 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20   Db *aDb;.  int 
8270: 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f  nDb;.  if( p->lo
8280: 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75  ckMask==0 ) retu
8290: 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  rn;  /* The comm
82a0: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20  on case */.  db 
82b0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d  = p->db;.  aDb =
82c0: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20   db->aDb;.  nDb 
82d0: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72  = db->nDb;.  for
82e0: 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c  (i=0, mask=1; i<
82f0: 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b  nDb; i++, mask +
8300: 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28  = mask){.    if(
8310: 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26   i!=1 && (mask &
8320: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30   p->lockMask)!=0
8330: 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69   && ALWAYS(aDb[i
8340: 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20  ].pBt!=0) ){.   
8350: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
8360: 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29  eave(aDb[i].pBt)
8370: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
8380: 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
8390: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
83a0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
83b0: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50  E_DEBUG)./*.** P
83c0: 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70  rint a single op
83d0: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
83e0: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
83f0: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
8400: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
8410: 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20  dbePrintOp(FILE 
8420: 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f  *pOut, int pc, O
8430: 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20  p *pOp){.  char 
8440: 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74  *zP4;.  char zPt
8450: 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43  r[50];.  char zC
8460: 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69  om[100];.  stati
8470: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  c const char *zF
8480: 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d  ormat1 = "%4d %-
8490: 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20  13s %4d %4d %4d 
84a0: 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22  %-13s %.2X %s\n"
84b0: 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20  ;.  if( pOut==0 
84c0: 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b  ) pOut = stdout;
84d0: 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79  .  zP4 = display
84e0: 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69  P4(pOp, zPtr, si
84f0: 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66  zeof(zPtr));.#if
8500: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
8510: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
8520: 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d  TS.  displayComm
8530: 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43  ent(pOp, zP4, zC
8540: 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29  om, sizeof(zCom)
8550: 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b  );.#else.  zCom[
8560: 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  0] = 0;.#endif. 
8570: 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c   /* NB:  The sql
8580: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29  ite3OpcodeName()
8590: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70   function is imp
85a0: 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65  lemented by code
85b0: 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79   created.  ** by
85c0: 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
85d0: 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63  wk and mkopcodec
85e0: 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68 69  .awk scripts whi
85f0: 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a 20  ch extract the. 
8600: 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   ** information 
8610: 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20  from the vdbe.c 
8620: 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20  source text */. 
8630: 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a   fprintf(pOut, z
8640: 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20  Format1, pc, .  
8650: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64      sqlite3Opcod
8660: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
8670: 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  e), pOp->p1, pOp
8680: 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a  ->p2, pOp->p3, z
8690: 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20  P4, pOp->p5,.   
86a0: 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66     zCom.  );.  f
86b0: 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23  flush(pOut);.}.#
86c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  endif../*.** Rel
86d0: 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66  ease an array of
86e0: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a   N Mem elements.
86f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
8700: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d  eleaseMemArray(M
8710: 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  em *p, int N){. 
8720: 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20   if( p && N ){. 
8730: 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20 20     Mem *pEnd;.  
8740: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8750: 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61  p->db;.    u8 ma
8760: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62  lloc_failed = db
8770: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a  ->mallocFailed;.
8780: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
8790: 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20  tesFreed ){.    
87a0: 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d    for(pEnd=&p[N]
87b0: 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
87c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
87d0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
87e0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lloc);.      }. 
87f0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
8800: 20 7d 0a 20 20 20 20 66 6f 72 28 70 45 6e 64 3d   }.    for(pEnd=
8810: 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70  &p[N]; p<pEnd; p
8820: 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
8830: 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64  t( (&p[1])==pEnd
8840: 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31   || p[0].db==p[1
8850: 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73  ].db );.      as
8860: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
8870: 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61  eCheckMemInvaria
8880: 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20  nts(p) );..     
8890: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69   /* This block i
88a0: 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69  s really an inli
88b0: 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  ned version of s
88c0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
88d0: 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  ease().      ** 
88e0: 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e  that takes advan
88f0: 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74  tage of the fact
8900: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79   that the memory
8910: 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a   cell value is .
8920: 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73        ** being s
8930: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72  et to NULL after
8940: 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64   releasing any d
8950: 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73  ynamic resources
8960: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
8970: 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63   ** The justific
8980: 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
8990: 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68  ating code is th
89a0: 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  at according to 
89b0: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72  .      ** callgr
89c0: 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73  ind, this causes
89d0: 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20   a certain test 
89e0: 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20  case to hit the 
89f0: 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a  CPU 4.7 .      *
8a00: 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28  * percent less (
8a10: 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76  x86 linux, gcc v
8a20: 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f  ersion 4.1.2, -O
8a30: 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20  6) than if .    
8a40: 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52    ** sqlite3MemR
8a50: 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61  elease() were ca
8a60: 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20  lled from here. 
8a70: 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a  With -O2, this j
8a80: 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  umps.      ** to
8a90: 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68   6.6 percent. Th
8aa0: 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69  e test case is i
8ab0: 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f  nserting 1000 ro
8ac0: 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ws into a table 
8ad0: 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e  .      ** with n
8ae0: 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20  o indexes using 
8af0: 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65  a single prepare
8b00: 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
8b10: 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20  nt, bind() .    
8b20: 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29    ** and reset()
8b30: 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72  . Inserts are gr
8b40: 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ouped into a tra
8b50: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
8b60: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
8b70: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
8b80: 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74  M_Agg );.      t
8b90: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
8ba0: 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20  s & MEM_Dyn );. 
8bb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
8bc0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72  ->flags & MEM_Fr
8bd0: 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ame );.      tes
8be0: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
8bf0: 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a  & MEM_RowSet );.
8c00: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61        if( p->fla
8c10: 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f  gs&(MEM_Agg|MEM_
8c20: 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45  Dyn|MEM_Frame|ME
8c30: 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20  M_RowSet) ){.   
8c40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8c50: 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20  MemRelease(p);. 
8c60: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
8c70: 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20  ->zMalloc ){.   
8c80: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
8c90: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
8ca0: 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a  c);.        p->z
8cb0: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
8cc0: 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c    }..      p->fl
8cd0: 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69  ags = MEM_Undefi
8ce0: 6e 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  ned;.    }.    d
8cf0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8d00: 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b  = malloc_failed;
8d10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
8d20: 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d 65  lete a VdbeFrame
8d30: 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20   object and its 
8d40: 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72  contents. VdbeFr
8d50: 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a  ame objects are.
8d60: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
8d70: 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f  the OP_Program o
8d80: 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33  pcode in sqlite3
8d90: 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76  VdbeExec()..*/.v
8da0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
8db0: 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46  rameDelete(VdbeF
8dc0: 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rame *p){.  int 
8dd0: 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d  i;.  Mem *aMem =
8de0: 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29   VdbeFrameMem(p)
8df0: 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ;.  VdbeCursor *
8e00: 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75  *apCsr = (VdbeCu
8e10: 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d  rsor **)&aMem[p-
8e20: 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66  >nChildMem];.  f
8e30: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68  or(i=0; i<p->nCh
8e40: 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20  ildCsr; i++){.  
8e50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
8e60: 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70  eCursor(p->v, ap
8e70: 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  Csr[i]);.  }.  r
8e80: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61  eleaseMemArray(a
8e90: 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65  Mem, p->nChildMe
8ea0: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  m);.  sqlite3DbF
8eb0: 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29  ree(p->v->db, p)
8ec0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
8ed0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
8ee0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69  ./*.** Give a li
8ef0: 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f  sting of the pro
8f00: 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74  gram in the virt
8f10: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a  ual machine..**.
8f20: 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65  ** The interface
8f30: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
8f40: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
8f50: 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20  ).  But instead 
8f60: 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68  of.** running th
8f70: 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b  e code, it invok
8f80: 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  es the callback 
8f90: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e  once for each in
8fa0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
8fb0: 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73  is feature is us
8fc0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
8fd0: 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a  "EXPLAIN"..**.**
8fe0: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
8ff0: 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75  ==1, each instru
9000: 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e  ction is listed.
9010: 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70    When.** p->exp
9020: 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50  lain==2, only OP
9030: 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63  _Explain instruc
9040: 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64  tions are listed
9050: 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72   and these.** ar
9060: 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66  e shown in a dif
9070: 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20  ferent format.  
9080: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73  p->explain==2 is
9090: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
90a0: 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55  nt.** EXPLAIN QU
90b0: 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20  ERY PLAN..**.** 
90c0: 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  When p->explain=
90d0: 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61  =1, first the ma
90e0: 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69  in program is li
90f0: 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20  sted, then each 
9100: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65  of.** the trigge
9110: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72  r subprograms ar
9120: 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20  e listed one by 
9130: 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  one..*/.int sqli
9140: 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56  te3VdbeList(.  V
9150: 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20  dbe *p          
9160: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9170: 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  VDBE */.){.  int
9180: 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   nRow;          
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91a0: 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72    /* Stop when r
91b0: 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ow count reaches
91c0: 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e   this */.  int n
91d0: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62  /* Number of sub
9200: 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66  -vdbes seen so f
9210: 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72  ar */.  SubProgr
9220: 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20  am **apSub = 0; 
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9240: 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62  Array of sub-vdb
9250: 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75  es */.  Mem *pSu
9260: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
9270: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9280: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64  Memory cell hold
9290: 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   array of subpro
92a0: 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  gs */.  sqlite3 
92b0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20  *db = p->db;    
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
92d0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
92e0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
92f0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
9300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9310: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
9320: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
9330: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
9340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
9350: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
9360: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e  Mem *pMem = &p->
9370: 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20  aMem[1];        
9380: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
9390: 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20  m of result set 
93a0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
93b0: 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73  >explain );.  as
93c0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
93d0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
93e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
93f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
9400: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
9410: 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  SY || p->rc==SQL
9420: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20  ITE_NOMEM );..  
9430: 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74  /* Even though t
9440: 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
9450: 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20  not use dynamic 
9460: 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a  strings for.  **
9470: 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73   the result, res
9480: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ult columns may 
9490: 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69  become dynamic i
94a0: 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73  f the user calls
94b0: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  ** sqlite3_co
94c0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63  lumn_text16(), c
94d0: 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61  ausing a transla
94e0: 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65  tion to UTF-16 e
94f0: 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  ncoding..  */.  
9500: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
9510: 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70  pMem, 8);.  p->p
9520: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a  ResultSet = 0;..
9530: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
9540: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
9550: 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
9560: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69   if a malloc() i
9570: 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20  nside a call to 
9580: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
9590: 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20  ext() or.    ** 
95a0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
95b0: 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20  ext16() failed. 
95c0: 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   */.    db->mall
95d0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
95e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
95f0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
9600: 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   When the number
9610: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
9620: 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68  reaches nRow, th
9630: 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a  at means the.  *
9640: 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69  * listing has fi
9650: 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74  nished and sqlit
9660: 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64  e3_step() should
9670: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
9680: 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69  ONE..  ** nRow i
9690: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
96a0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
96b0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  in the main prog
96c0: 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74  ram, plus.  ** t
96d0: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75  he sum of the nu
96e0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
96f0: 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62 70  all trigger subp
9700: 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65  rograms encounte
9710: 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e  red.  ** so far.
9720: 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65    The nRow value
9730: 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61   will increase a
9740: 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 75  s new trigger su
9750: 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20  bprograms are.  
9760: 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
9770: 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65  but p->pc will e
9780: 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20  ventually catch 
9790: 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f  up to nRow..  */
97a0: 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70  .  nRow = p->nOp
97b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61  ;.  if( p->expla
97c0: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20  in==1 ){.    /* 
97d0: 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f  The first 8 memo
97e0: 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65  ry cells are use
97f0: 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  d for the result
9800: 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c   set.  So we wil
9810: 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  l.    ** command
9820: 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c  eer the 9th cell
9830: 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61   to use as stora
9840: 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20  ge for an array 
9850: 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20  of pointers.    
9860: 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73 75  ** to trigger su
9870: 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20  bprograms.  The 
9880: 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74 65  VDBE is guarante
9890: 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65  ed to have at le
98a0: 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c  ast 9.    ** cel
98b0: 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ls.  */.    asse
98c0: 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b  rt( p->nMem>9 );
98d0: 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e  .    pSub = &p->
98e0: 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28  aMem[9];.    if(
98f0: 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d   pSub->flags&MEM
9900: 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f  _Blob ){.      /
9910: 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63  * On the first c
9920: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73  all to sqlite3_s
9930: 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c  tep(), pSub will
9940: 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49   hold a NULL.  I
9950: 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  t is.      ** in
9960: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42  itialized to a B
9970: 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53 55  LOB by the P4_SU
9980: 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73  BPROGRAM process
9990: 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20  ing logic below 
99a0: 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20  */.      nSub = 
99b0: 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56  pSub->n/sizeof(V
99c0: 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53  dbe*);.      apS
99d0: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
99e0: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
99f0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
9a00: 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSub; i++){.  
9a10: 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75      nRow += apSu
9a20: 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d  b[i]->nOp;.    }
9a30: 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  .  }..  do{.    
9a40: 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d  i = p->pc++;.  }
9a50: 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26  while( i<nRow &&
9a60: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26   p->explain==2 &
9a70: 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  & p->aOp[i].opco
9a80: 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de!=OP_Explain )
9a90: 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20  ;.  if( i>=nRow 
9aa0: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
9ab0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
9ac0: 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
9ad0: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
9ae0: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
9af0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
9b00: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
9b10: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
9b20: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
9b30: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
9b40: 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
9b50: 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
9b60: 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65  tr(p->rc));.  }e
9b70: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
9b80: 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b  P4;.    Op *pOp;
9b90: 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f  .    if( i<p->nO
9ba0: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  p ){.      /* Th
9bb0: 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75  e output line nu
9bc0: 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e  mber is small en
9bd0: 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65  ough that we are
9be0: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20   still in the.  
9bf0: 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67      ** main prog
9c00: 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f  ram. */.      pO
9c10: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
9c20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9c30: 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65   /* We are curre
9c40: 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62  ntly listing sub
9c50: 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72  programs.  Figur
9c60: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20  e out which one 
9c70: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63  and.      ** pic
9c80: 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72  k up the appropr
9c90: 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a  iate opcode. */.
9ca0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
9cb0: 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a     i -= p->nOp;.
9cc0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69        for(j=0; i
9cd0: 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  >=apSub[j]->nOp;
9ce0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
9cf0: 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f   -= apSub[j]->nO
9d00: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
9d10: 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d   pOp = &apSub[j]
9d20: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a  ->aOp[i];.    }.
9d30: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
9d40: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  in==1 ){.      p
9d50: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
9d60: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
9d70: 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20  ->u.i = i;      
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
9da0: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
9db0: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
9dc0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
9dd0: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c  gs = MEM_Static|
9de0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
9df0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
9e00: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
9e10: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
9e20: 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f  opcode); /* Opco
9e30: 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  de */.      asse
9e40: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
9e50: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
9e60: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
9e70: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
9e80: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
9e90: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
9ea0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
9eb0: 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72  /* When an OP_Pr
9ec0: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20  ogram opcode is 
9ed0: 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f  encounter (the o
9ee0: 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20  nly opcode that 
9ef0: 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50  has.      ** a P
9f00: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67  4_SUBPROGRAM arg
9f10: 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74  ument), expand t
9f20: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
9f30: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72  rray of subprogr
9f40: 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70  ams.      ** kep
9f50: 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e  t in p->aMem[9].
9f60: 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65  z to hold the ne
9f70: 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75  w program - assu
9f80: 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f  ming this subpro
9f90: 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61  gram.      ** ha
9fa0: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
9fb0: 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a  en seen..      *
9fc0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  /.      if( pOp-
9fd0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
9fe0: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
9ff0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e    int nByte = (n
a000: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
a010: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
a020: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
a030: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53     for(j=0; j<nS
a040: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
a050: 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d      if( apSub[j]
a060: 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  ==pOp->p4.pProgr
a070: 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  am ) break;.    
a080: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
a090: 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c  ( j==nSub && SQL
a0a0: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
a0b0: 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c  dbeMemGrow(pSub,
a0c0: 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29   nByte, nSub!=0)
a0d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70   ){.          ap
a0e0: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
a0f0: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
a100: 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53          apSub[nS
a110: 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e  ub++] = pOp->p4.
a120: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
a130: 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20      pSub->flags 
a140: 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20  |= MEM_Blob;.   
a150: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d         pSub->n =
a160: 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62   nSub*sizeof(Sub
a170: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
a180: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a190: 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   }..    pMem->fl
a1a0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
a1b0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
a1c0: 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20  Op->p1;         
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1e0: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d   /* P1 */.    pM
a1f0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
a200: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
a210: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
a220: 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20  = pOp->p2;      
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a240: 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20      /* P2 */.   
a250: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
a260: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
a270: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
a280: 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20  .i = pOp->p3;   
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2a0: 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a         /* P3 */.
a2b0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
a2c0: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
a2d0: 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32  MemGrow(pMem, 32
a2e0: 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20 20 20  , 0) ){         
a2f0: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
a300: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
a310: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
a320: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
a330: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
a340: 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  }.    pMem->flag
a350: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
a360: 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20  Term;.    zP4 = 
a370: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70  displayP4(pOp, p
a380: 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20  Mem->z, 32);.   
a390: 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e   if( zP4!=pMem->
a3a0: 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  z ){.      sqlit
a3b0: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
a3c0: 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53  pMem, zP4, -1, S
a3d0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a  QLITE_UTF8, 0);.
a3e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a3f0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
a400: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65  !=0 );.      pMe
a410: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
a420: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
a430: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
a440: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
a450: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b      }.    pMem++
a460: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78  ;..    if( p->ex
a470: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
a480: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
a490: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34  eMemGrow(pMem, 4
a4a0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
a4b0: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
a4c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
a4d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
a4e0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
a4f0: 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e    }.      pMem->
a500: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c  flags = MEM_Str|
a510: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
a520: 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20  pMem->n = 2;.   
a530: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
a540: 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  ntf(3, pMem->z, 
a550: 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29  "%.2x", pOp->p5)
a560: 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20  ;   /* P5 */.   
a570: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
a580: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
a590: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66    pMem++;.  .#if
a5a0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a5b0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
a5c0: 54 53 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  TS.      if( sql
a5d0: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
a5e0: 70 4d 65 6d 2c 20 35 30 30 2c 20 30 29 20 29 7b  pMem, 500, 0) ){
a5f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a600: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
a610: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
a620: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
a630: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
a640: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
a650: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
a660: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  m;.      pMem->n
a670: 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e   = displayCommen
a680: 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d  t(pOp, zP4, pMem
a690: 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20 20  ->z, 500);.     
a6a0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
a6b0: 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a  ITE_UTF8;.#else.
a6c0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
a6d0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20  s = MEM_Null;   
a6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6f0: 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a      /* Comment *
a700: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  /.#endif.    }..
a710: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d      p->nResColum
a720: 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78  n = 8 - 4*(p->ex
a730: 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d  plain-1);.    p-
a740: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70  >pResultSet = &p
a750: 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70  ->aMem[1];.    p
a760: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
a770: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
a780: 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74  E_ROW;.  }.  ret
a790: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
a7a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
a7b0: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64  EXPLAIN */..#ifd
a7c0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a7d0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
a7e0: 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65  SQL that was use
a7f0: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  d to generate a 
a800: 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  VDBE program..*/
a810: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
a820: 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a  ePrintSql(Vdbe *
a830: 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p){.  const char
a840: 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70   *z = 0;.  if( p
a850: 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20  ->zSql ){.    z 
a860: 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c  = p->zSql;.  }el
a870: 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31  se if( p->nOp>=1
a880: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64   ){.    const Vd
a890: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e  beOp *pOp = &p->
a8a0: 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20  aOp[0];.    if( 
a8b0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
a8c0: 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e  Init && pOp->p4.
a8d0: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20  z!=0 ){.      z 
a8e0: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
a8f0: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
a900: 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a  3Isspace(*z) ) z
a910: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
a920: 69 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22  if( z ) printf("
a930: 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29  SQL: [%s]\n", z)
a940: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
a950: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a960: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
a970: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
a980: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a  ABLE_IOTRACE)./*
a990: 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54  .** Print an IOT
a9a0: 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f  RACE message sho
a9b0: 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74  wing SQL content
a9c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a9d0: 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28  3VdbeIOTraceSql(
a9e0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
a9f0: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
aa00: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
aa10: 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63  f( sqlite3IoTrac
aa20: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
aa30: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
aa40: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
aa50: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70  >aOp[0];.  if( p
aa60: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
aa70: 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  nit && pOp->p4.z
aa80: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  !=0 ){.    int i
aa90: 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b  , j;.    char z[
aaa0: 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  1000];.    sqlit
aab0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
aac0: 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20  of(z), z, "%s", 
aad0: 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20  pOp->p4.z);.    
aae0: 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33  for(i=0; sqlite3
aaf0: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69  Isspace(z[i]); i
ab00: 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d  ++){}.    for(j=
ab10: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
ab20: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
ab30: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b  Isspace(z[i]) ){
ab40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
ab50: 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20  -1]!=' ' ){.    
ab60: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27        z[j++] = '
ab70: 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
ab80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ab90: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
aba0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
abb0: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
abc0: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
abd0: 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b  ("SQL %s\n", z);
abe0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
abf0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52   !SQLITE_OMIT_TR
ac00: 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  ACE && SQLITE_EN
ac10: 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a  ABLE_IOTRACE */.
ac20: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
ac30: 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69 78  space from a fix
ac40: 65 64 20 73 69 7a 65 20 62 75 66 66 65 72 20 61  ed size buffer a
ac50: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
ac60: 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73  ter to.** that s
ac70: 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66 66  pace.  If insuff
ac80: 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 73 20  icient space is 
ac90: 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72  available, retur
aca0: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
acb0: 65 20 70 42 75 66 20 70 61 72 61 6d 65 74 65 72  e pBuf parameter
acc0: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
acd0: 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e 74  value of a point
ace0: 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a  er which will.**
acf0: 20 72 65 63 65 69 76 65 20 74 68 65 20 6e 65 77   receive the new
ad00: 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20 69   memory.  pBuf i
ad10: 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e  s normally NULL.
ad20: 20 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74    If pBuf is not
ad30: 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61  .** NULL, it mea
ad40: 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 73  ns that memory s
ad50: 70 61 63 65 20 68 61 73 20 61 6c 72 65 61 64 79  pace has already
ad60: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
ad70: 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69 73  and that.** this
ad80: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
ad90: 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79  not allocate any
ada0: 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68   new memory.  Wh
adb0: 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a  en pBuf is not.*
adc0: 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65  * NULL simply re
add0: 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79  turn pBuf.  Only
ade0: 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65   allocate new me
adf0: 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e 20  mory space when 
ae00: 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e  pBuf.** is NULL.
ae10: 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20  .**.** nByte is 
ae20: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
ae30: 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65 65  tes of space nee
ae40: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72  ded..**.** *ppFr
ae50: 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 76 61  om points to ava
ae60: 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64  ilable space and
ae70: 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20   pEnd points to 
ae80: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
ae90: 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63  * available spac
aea0: 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65 20 69  e.  When space i
aeb0: 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70  s allocated, *pp
aec0: 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 65 64  From is advanced
aed0: 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64   past.** the end
aee0: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   of the allocate
aef0: 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a  d space..**.** *
af00: 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e  pnByte is a coun
af10: 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ter of the numbe
af20: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
af30: 61 63 65 20 74 68 61 74 20 68 61 76 65 20 66 61  ace that have fa
af40: 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63  iled.** to alloc
af50: 61 74 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  ate.  If there i
af60: 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73  s insufficient s
af70: 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20  pace in *ppFrom 
af80: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a  to satisfy the.*
af90: 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20  * request, then 
afa0: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74  increment *pnByt
afb0: 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20  e by the amount 
afc0: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  of the request..
afd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
afe0: 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76 6f  allocSpace(.  vo
aff0: 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
b000: 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74 75     /* Where retu
b010: 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20  rn pointer will 
b020: 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69  be stored */.  i
b030: 36 34 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  64 nByte,       
b040: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b050: 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   bytes to alloca
b060: 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46  te */.  u8 **ppF
b070: 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rom,         /* 
b080: 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65  IN/OUT: Allocate
b090: 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f   from *ppFrom */
b0a0: 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20 20  .  u8 *pEnd,    
b0b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
b0c0: 65 72 20 74 6f 20 31 20 62 79 74 65 20 70 61 73  er to 1 byte pas
b0d0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70 70  t the end of *pp
b0e0: 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20  From buffer */. 
b0f0: 20 69 36 34 20 2a 70 6e 42 79 74 65 20 20 20 20   i64 *pnByte    
b100: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f        /* If allo
b110: 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  cation cannot be
b120: 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74   made, increment
b130: 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20   *pnByte */.){. 
b140: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
b150: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70  YTE_ALIGNMENT(*p
b160: 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20  pFrom) );.  if( 
b170: 70 42 75 66 20 29 20 72 65 74 75 72 6e 20 70 42  pBuf ) return pB
b180: 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f  uf;.  nByte = RO
b190: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 69  UND8(nByte);.  i
b1a0: 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42  f( &(*ppFrom)[nB
b1b0: 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a  yte] <= pEnd ){.
b1c0: 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64      pBuf = (void
b1d0: 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a  *)*ppFrom;.    *
b1e0: 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b  ppFrom += nByte;
b1f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
b200: 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a  nByte += nByte;.
b210: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 75    }.  return pBu
b220: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69  f;.}../*.** Rewi
b230: 6e 64 20 74 68 65 20 56 44 42 45 20 62 61 63 6b  nd the VDBE back
b240: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
b250: 67 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  g in preparation
b260: 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20   for.** running 
b270: 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  it..*/.void sqli
b280: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 56 64  te3VdbeRewind(Vd
b290: 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69  be *p){.#if defi
b2a0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
b2b0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42  ) || defined(VDB
b2c0: 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74  E_PROFILE).  int
b2d0: 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   i;.#endif.  ass
b2e0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
b2f0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
b300: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
b310: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20   );..  /* There 
b320: 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61  should be at lea
b330: 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20  st one opcode.. 
b340: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
b350: 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  >nOp>0 );..  /* 
b360: 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f  Set the magic to
b370: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
b380: 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
b390: 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70  an later. */.  p
b3a0: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
b3b0: 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65  AGIC_RUN;..#ifde
b3c0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
b3d0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e   for(i=1; i<p->n
b3e0: 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  Mem; i++){.    a
b3f0: 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69  ssert( p->aMem[i
b400: 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20  ].db==p->db );. 
b410: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70   }.#endif.  p->p
b420: 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20  c = -1;.  p->rc 
b430: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
b440: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
b450: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d  OE_Abort;.  p->m
b460: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
b470: 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61  C_RUN;.  p->nCha
b480: 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  nge = 0;.  p->ca
b490: 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d  cheCtr = 1;.  p-
b4a0: 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72  >minWriteFileFor
b4b0: 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e  mat = 255;.  p->
b4c0: 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
b4d0: 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69    p->nFkConstrai
b4e0: 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56  nt = 0;.#ifdef V
b4f0: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f  DBE_PROFILE.  fo
b500: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
b510: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f   i++){.    p->aO
b520: 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20  p[i].cnt = 0;.  
b530: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
b540: 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  es = 0;.  }.#end
b550: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  if.}../*.** Prep
b560: 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61  are a virtual ma
b570: 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74  chine for execut
b580: 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73  ion for the firs
b590: 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20  t time after.** 
b5a0: 63 72 65 61 74 69 6e 67 20 74 68 65 20 76 69 72  creating the vir
b5b0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54  tual machine.  T
b5c0: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
b5d0: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
b5e0: 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20  llocating stack 
b5f0: 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61  space and initia
b600: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
b610: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
b620: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
b630: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
b640: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
b650: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
b660: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
b670: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
b680: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
b690: 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
b6a0: 65 64 20 65 78 61 63 74 20 6f 6e 63 65 20 6f 6e  ed exact once on
b6b0: 20 61 20 65 61 63 68 20 76 69 72 74 75 61 6c 20   a each virtual 
b6c0: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65  machine..** Afte
b6d0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
b6e0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20  s called the VM 
b6f0: 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67  has been "packag
b700: 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64 79  ed" and is ready
b710: 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74  .** to run.  Aft
b720: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
b730: 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 74 68 65  is called, futhe
b740: 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73  r calls to .** s
b750: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b760: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  ) functions are 
b770: 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69  prohibited.  Thi
b780: 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e  s routine discon
b790: 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62  nects.** the Vdb
b7a0: 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65  e from the Parse
b7b0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c   object that hel
b7c0: 70 65 64 20 67 65 6e 65 72 61 74 65 20 69 74 20  ped generate it 
b7d0: 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74  so that the.** t
b7e0: 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20  he Vdbe becomes 
b7f0: 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65  an independent e
b800: 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20 50 61  ntity and the Pa
b810: 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62  rse object can b
b820: 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a  e.** destroyed..
b830: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71  **.** Use the sq
b840: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
b850: 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72  ) procedure to r
b860: 65 73 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c  estore a virtual
b870: 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a   machine back.**
b880: 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20   to its initial 
b890: 73 74 61 74 65 20 61 66 74 65 72 20 69 74 20 68  state after it h
b8a0: 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a  as been run..*/.
b8b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
b8c0: 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62  MakeReady(.  Vdb
b8d0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b8f0: 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72  he VDBE */.  Par
b900: 73 65 20 2a 70 50 61 72 73 65 20 20 20 20 20 20  se *pParse      
b910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
b920: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
b930: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
b940: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
b950: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
b960: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
b970: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20   */.  int nVar; 
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b990: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b9a0: 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  f parameters */.
b9b0: 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20    int nMem;     
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d   /* Number of VM
b9e0: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
b9f0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73  s */.  int nCurs
ba00: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
ba10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ba20: 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71 75 69  of cursors requi
ba30: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  red */.  int nAr
ba40: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
ba50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ba60: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69  r of arguments i
ba70: 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f  n subprograms */
ba80: 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20 20  .  int nOnce;   
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f    /* Number of O
bab0: 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69  P_Once instructi
bac0: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ons */.  int n; 
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bae0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
baf0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
bb00: 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20 20 20  *zCsr;          
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
bb20: 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20  emory available 
bb30: 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a  for allocation *
bb40: 2f 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20 20  /.  u8 *zEnd;   
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb60: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
bb70: 20 70 61 73 74 20 61 6c 6c 6f 63 61 74 65 64 20   past allocated 
bb80: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 36 34 20  memory */.  i64 
bb90: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
bba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
bbb0: 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d  w much extra mem
bbc0: 6f 72 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f  ory is needed */
bbd0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
bbe0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
bbf0: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65  >nOp>0 );.  asse
bc00: 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
bc10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
bc20: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
bc30: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
bc40: 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61  ( pParse==p->pPa
bc50: 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d  rse );.  db = p-
bc60: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
bc70: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
bc80: 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70  =0 );.  nVar = p
bc90: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e  Parse->nVar;.  n
bca0: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
bcb0: 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20  em;.  nCursor = 
bcc0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
bcd0: 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nArg = pParse->n
bce0: 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65 20  MaxArg;.  nOnce 
bcf0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b  = pParse->nOnce;
bd00: 0a 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30 20  .  if( nOnce==0 
bd10: 29 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20  ) nOnce = 1; /* 
bd20: 45 6e 73 75 72 65 20 61 74 20 6c 65 61 73 74 20  Ensure at least 
bd30: 6f 6e 65 20 62 79 74 65 20 69 6e 20 70 2d 3e 61  one byte in p->a
bd40: 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20  OnceFlag[] */.  
bd50: 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63  .  /* For each c
bd60: 75 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20  ursor required, 
bd70: 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  also allocate a 
bd80: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d  memory cell. Mem
bd90: 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28  ory.  ** cells (
bda0: 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e  nMem+1-nCursor).
bdb0: 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65  .nMem, inclusive
bdc0: 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  , will never be 
bdd0: 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65  used by.  ** the
bde0: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49   vdbe program. I
bdf0: 6e 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20  nstead they are 
be00: 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
be10: 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20   space for.  ** 
be20: 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72  VdbeCursor/BtCur
be30: 73 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e 20  sor structures. 
be40: 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  The blob of memo
be50: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
be60: 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20  th .  ** cursor 
be70: 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d  0 is stored in m
be80: 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e  emory cell nMem.
be90: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d   Memory cell (nM
bea0: 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65  em-1).  ** store
beb0: 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65  s the blob of me
bec0: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
bed0: 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65  with cursor 1, e
bee0: 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65  tc..  **.  ** Se
bef0: 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65  e also: allocate
bf00: 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  Cursor()..  */. 
bf10: 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72   nMem += nCursor
bf20: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
bf30: 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72   space for memor
bf40: 79 20 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c  y registers, SQL
bf50: 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45   variables, VDBE
bf60: 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20   cursors and .  
bf70: 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d  ** an array to m
bf80: 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74  arshal SQL funct
bf90: 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e  ion arguments in
bfa0: 2e 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20  ..  */.  zCsr = 
bfb0: 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e  (u8*)&p->aOp[p->
bfc0: 6e 4f 70 5d 3b 20 20 20 20 20 20 20 20 20 20 20  nOp];           
bfd0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 6c 69   /* Memory avali
bfe0: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74  able for allocat
bff0: 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20 3d 20  ion */.  zEnd = 
c000: 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 50 61  (u8*)&p->aOp[pPa
c010: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20  rse->nOpAlloc]; 
c020: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
c030: 61 73 74 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b  ast end of zCsr[
c040: 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50  ] */..  resolveP
c050: 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67  2Values(p, &nArg
c060: 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74  );.  p->usesStmt
c070: 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70  Journal = (u8)(p
c080: 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72  Parse->isMultiWr
c090: 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d  ite && pParse->m
c0a0: 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20  ayAbort);.  if( 
c0b0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
c0c0: 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20  && nMem<10 ){.  
c0d0: 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d    nMem = 10;.  }
c0e0: 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20  .  memset(zCsr, 
c0f0: 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20  0, zEnd-zCsr);. 
c100: 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d   zCsr += (zCsr -
c110: 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 61 73   (u8*)0)&7;.  as
c120: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
c130: 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29  _ALIGNMENT(zCsr)
c140: 20 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64   );.  p->expired
c150: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f   = 0;..  /* Memo
c160: 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73  ry for registers
c170: 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75  , parameters, cu
c180: 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c  rsor, etc, is al
c190: 6c 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a 20  located in two. 
c1a0: 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20   ** passes.  On 
c1b0: 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c 20  the first pass, 
c1c0: 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 20  we try to reuse 
c1d0: 75 6e 75 73 65 64 20 73 70 61 63 65 20 61 74 20  unused space at 
c1e0: 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66  the .  ** end of
c1f0: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
c200: 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 6e  y.  If we are un
c210: 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20  able to satisfy 
c220: 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20  all memory.  ** 
c230: 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20  requirements by 
c240: 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f  reusing the opco
c250: 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74  de array tail, t
c260: 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20  hen the second. 
c270: 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69   ** pass will fi
c280: 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20 75  ll in the rest u
c290: 73 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c 6c  sing a fresh all
c2a0: 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a  ocation.  .  **.
c2b0: 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61    ** This two-pa
c2c0: 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74  ss approach that
c2d0: 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20   reuses as much 
c2e0: 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62  memory as possib
c2f0: 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  le from.  ** the
c300: 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65 20   leftover space 
c310: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
c320: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 63  e opcode array c
c330: 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79  an significantly
c340: 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65  .  ** reduce the
c350: 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72   amount of memor
c360: 79 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 70  y held by a prep
c370: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
c380: 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20    */.  do {.    
c390: 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 70  nByte = 0;.    p
c3a0: 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70  ->aMem = allocSp
c3b0: 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 28 69 36  ace(p->aMem, (i6
c3c0: 34 29 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65  4)nMem*sizeof(Me
c3d0: 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  m), &zCsr, zEnd,
c3e0: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
c3f0: 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  >aVar = allocSpa
c400: 63 65 28 70 2d 3e 61 56 61 72 2c 20 28 69 36 34  ce(p->aVar, (i64
c410: 29 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d  )nVar*sizeof(Mem
c420: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
c430: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
c440: 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61  apArg = allocSpa
c450: 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 28 69 36  ce(p->apArg, (i6
c460: 34 29 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65  4)nArg*sizeof(Me
c470: 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  m*), &zCsr, zEnd
c480: 2c 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d  ,&nByte);.    p-
c490: 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70  >azVar = allocSp
c4a0: 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20 28 69  ace(p->azVar, (i
c4b0: 36 34 29 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63  64)nVar*sizeof(c
c4c0: 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 7a 45 6e  har*), &zCsr,zEn
c4d0: 64 2c 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  d,&nByte);.    p
c4e0: 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53  ->apCsr = allocS
c4f0: 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c 20 28  pace(p->apCsr, (
c500: 69 36 34 29 6e 43 75 72 73 6f 72 2a 73 69 7a 65  i64)nCursor*size
c510: 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 2c  of(VdbeCursor*),
c520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c530: 20 20 20 20 20 20 20 20 20 20 20 26 7a 43 73 72             &zCsr
c540: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
c550: 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  .    p->aOnceFla
c560: 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  g = allocSpace(p
c570: 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e  ->aOnceFlag, nOn
c580: 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  ce, &zCsr, zEnd,
c590: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66   &nByte);.    if
c5a0: 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  ( nByte ){.     
c5b0: 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69   p->pFree = sqli
c5c0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
c5d0: 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
c5e0: 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e  }.    zCsr = p->
c5f0: 70 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20  pFree;.    zEnd 
c600: 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a  = &zCsr[nByte];.
c610: 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20    }while( nByte 
c620: 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
c630: 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43  iled );..  p->nC
c640: 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b  ursor = nCursor;
c650: 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20  .  p->nOnceFlag 
c660: 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70  = nOnce;.  if( p
c670: 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70 2d  ->aVar ){.    p-
c680: 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e  >nVar = (ynVar)n
c690: 56 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30  Var;.    for(n=0
c6a0: 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a  ; n<nVar; n++){.
c6b0: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
c6c0: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
c6d0: 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72  l;.      p->aVar
c6e0: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
c6f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
c700: 61 7a 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e  azVar ){.    p->
c710: 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e  nzVar = pParse->
c720: 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70  nzVar;.    memcp
c730: 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72  y(p->azVar, pPar
c740: 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a  se->azVar, p->nz
c750: 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a  Var*sizeof(p->az
c760: 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65  Var[0]));.    me
c770: 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a 56  mset(pParse->azV
c780: 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e  ar, 0, pParse->n
c790: 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61 72  zVar*sizeof(pPar
c7a0: 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a  se->azVar[0]));.
c7b0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65    }.  if( p->aMe
c7c0: 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  m ){.    p->aMem
c7d0: 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  --;             
c7e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d           /* aMem
c7f0: 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e  [] goes from 1..
c800: 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e  nMem */.    p->n
c810: 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20  Mem = nMem;     
c820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
c830: 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e       not from 0.
c840: 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66  .nMem-1 */.    f
c850: 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b  or(n=1; n<=nMem;
c860: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   n++){.      p->
c870: 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aMem[n].flags = 
c880: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
c890: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
c8a0: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20  db = db;.    }. 
c8b0: 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20   }.  p->explain 
c8c0: 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  = pParse->explai
c8d0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
c8e0: 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a  Rewind(p);.}../*
c8f0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45  .** Close a VDBE
c900: 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65   cursor and rele
c910: 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f  ase all the reso
c920: 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f  urces that curso
c930: 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f  r .** happens to
c940: 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   hold..*/.void s
c950: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
c960: 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64  rsor(Vdbe *p, Vd
c970: 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  beCursor *pCx){.
c980: 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
c990: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
c9a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72    sqlite3VdbeSor
c9b0: 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20  terClose(p->db, 
c9c0: 70 43 78 29 3b 0a 20 20 69 66 28 20 70 43 78 2d  pCx);.  if( pCx-
c9d0: 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  >pBt ){.    sqli
c9e0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43  te3BtreeClose(pC
c9f0: 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20  x->pBt);.    /* 
ca00: 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  The pCx->pCursor
ca10: 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61   will be close a
ca20: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66  utomatically, if
ca30: 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20   it exists, by. 
ca40: 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61     ** the call a
ca50: 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65  bove. */.  }else
ca60: 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f   if( pCx->pCurso
ca70: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
ca80: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
ca90: 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a  (pCx->pCursor);.
caa0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
cab0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
cac0: 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e  ABLE.  if( pCx->
cad0: 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20  pVtabCursor ){. 
cae0: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f     sqlite3_vtab_
caf0: 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
cb00: 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62  sor = pCx->pVtab
cb10: 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73  Cursor;.    cons
cb20: 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
cb30: 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61   *pModule = pVta
cb40: 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e  bCursor->pVtab->
cb50: 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e  pModule;.    p->
cb60: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31  inVtabMethod = 1
cb70: 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  ;.    pModule->x
cb80: 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f  Close(pVtabCurso
cb90: 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  r);.    p->inVta
cba0: 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d  bMethod = 0;.  }
cbb0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
cbc0: 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73   Copy the values
cbd0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
cbe0: 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75  dbeFrame structu
cbf0: 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20  re to its Vdbe. 
cc00: 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c  This.** is used,
cc10: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
cc20: 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62  en a trigger sub
cc30: 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74  -program is halt
cc40: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a  ed to restore.**
cc50: 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20   control to the 
cc60: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  main program..*/
cc70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
cc80: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62  FrameRestore(Vdb
cc90: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  eFrame *pFrame){
cca0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72  .  Vdbe *v = pFr
ccb0: 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 6e  ame->v;.  v->aOn
ccc0: 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d  ceFlag = pFrame-
ccd0: 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d  >aOnceFlag;.  v-
cce0: 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72  >nOnceFlag = pFr
ccf0: 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a  ame->nOnceFlag;.
cd00: 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d    v->aOp = pFram
cd10: 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70  e->aOp;.  v->nOp
cd20: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a   = pFrame->nOp;.
cd30: 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61    v->aMem = pFra
cd40: 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e  me->aMem;.  v->n
cd50: 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d  Mem = pFrame->nM
cd60: 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d  em;.  v->apCsr =
cd70: 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a   pFrame->apCsr;.
cd80: 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70    v->nCursor = p
cd90: 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a  Frame->nCursor;.
cda0: 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77    v->db->lastRow
cdb0: 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73  id = pFrame->las
cdc0: 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68  tRowid;.  v->nCh
cdd0: 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  ange = pFrame->n
cde0: 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e  Change;.  return
cdf0: 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a   pFrame->pc;.}..
ce00: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
ce10: 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41  cursors..**.** A
ce20: 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20  lso release any 
ce30: 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68  dynamic memory h
ce40: 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e  eld by the VM in
ce50: 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d   the Vdbe.aMem m
ce60: 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61  emory .** cell a
ce70: 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65  rray. This is ne
ce80: 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d  cessary as the m
ce90: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79  emory cell array
cea0: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   may contain.** 
ceb0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65  pointers to Vdbe
cec0: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77  Frame objects, w
ced0: 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e  hich may in turn
cee0: 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72   contain pointer
cef0: 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72  s to.** open cur
cf00: 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sors..*/.static 
cf10: 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72  void closeAllCur
cf20: 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20  sors(Vdbe *p){. 
cf30: 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29   if( p->pFrame )
cf40: 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20  {.    VdbeFrame 
cf50: 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72  *pFrame;.    for
cf60: 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d  (pFrame=p->pFram
cf70: 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  e; pFrame->pPare
cf80: 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d  nt; pFrame=pFram
cf90: 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  e->pParent);.   
cfa0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
cfb0: 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29  eRestore(pFrame)
cfc0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d  ;.  }.  p->pFram
cfd0: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61  e = 0;.  p->nFra
cfe0: 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  me = 0;..  if( p
cff0: 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69  ->apCsr ){.    i
d000: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
d010: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
d020: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62   i++){.      Vdb
d030: 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d  eCursor *pC = p-
d040: 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20  >apCsr[i];.     
d050: 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20   if( pC ){.     
d060: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
d070: 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b  eeCursor(p, pC);
d080: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73  .        p->apCs
d090: 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
d0a0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
d0b0: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
d0c0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
d0d0: 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d  (&p->aMem[1], p-
d0e0: 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68  >nMem);.  }.  wh
d0f0: 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d  ile( p->pDelFram
d100: 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
d110: 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44  me *pDel = p->pD
d120: 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e  elFrame;.    p->
d130: 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c  pDelFrame = pDel
d140: 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73  ->pParent;.    s
d150: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44  qlite3VdbeFrameD
d160: 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d  elete(pDel);.  }
d170: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e  ..  /* Delete an
d180: 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61  y auxdata alloca
d190: 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68  tions made by th
d1a0: 65 20 56 4d 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e VM */.  sqlite
d1b0: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
d1c0: 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  ta(p, -1, 0);.  
d1d0: 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44  assert( p->pAuxD
d1e0: 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ata==0 );.}../*.
d1f0: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20  ** Clean up the 
d200: 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 69  VM after executi
d210: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
d220: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f  outine will auto
d230: 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20  matically close 
d240: 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73  any cursors, lis
d250: 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f  ts, and/or.** so
d260: 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65 20  rters that were 
d270: 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61  left open.  It a
d280: 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20  lso deletes the 
d290: 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72  values of.** var
d2a0: 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56  iables in the aV
d2b0: 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  ar[] array..*/.s
d2c0: 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e  tatic void Clean
d2d0: 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  up(Vdbe *p){.  s
d2e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
d2f0: 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  db;..#ifdef SQLI
d300: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78  TE_DEBUG.  /* Ex
d310: 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73  ecute assert() s
d320: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
d330: 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62  ure that the Vdb
d340: 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20  e.apCsr[] and . 
d350: 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20   ** Vdbe.aMem[] 
d360: 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65  arrays have alre
d370: 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64  ady been cleaned
d380: 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69   up.  */.  int i
d390: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72  ;.  if( p->apCsr
d3a0: 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d   ) for(i=0; i<p-
d3b0: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61  >nCursor; i++) a
d3c0: 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b  ssert( p->apCsr[
d3d0: 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  i]==0 );.  if( p
d3e0: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f  ->aMem ){.    fo
d3f0: 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65  r(i=1; i<=p->nMe
d400: 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  m; i++) assert( 
d410: 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73  p->aMem[i].flags
d420: 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20  ==MEM_Undefined 
d430: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
d440: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d450: 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
d460: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
d470: 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  ;.  p->pResultSe
d480: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
d490: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
d4a0: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
d4b0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
d4c0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53  turned by this S
d4d0: 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  QL.** statement.
d4e0: 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74   This is now set
d4f0: 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
d500: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75  , rather than du
d510: 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f  ring.** executio
d520: 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72  n of the vdbe pr
d530: 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71  ogram so that sq
d540: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
d550: 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63  nt() can.** be c
d560: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20  alled on an SQL 
d570: 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65  statement before
d580: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
d590: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d5a0: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56  VdbeSetNumCols(V
d5b0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73  dbe *p, int nRes
d5c0: 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a  Column){.  Mem *
d5d0: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  pColName;.  int 
d5e0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
d5f0: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 61 73 73   = p->db;..  ass
d600: 65 72 74 28 20 6e 52 65 73 43 6f 6c 75 6d 6e 20  ert( nResColumn 
d610: 3c 3d 20 30 78 66 66 66 66 20 29 3b 0a 20 20 72  <= 0xffff );.  r
d620: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
d630: 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
d640: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
d650: 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  E_N);.  sqlite3D
d660: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
d670: 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52  lName);.  n = nR
d680: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
d690: 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
d6a0: 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43  umn = (u16)nResC
d6b0: 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
d6c0: 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20  Name = pColName 
d6d0: 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44  = (Mem*)sqlite3D
d6e0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
d6f0: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b  sizeof(Mem)*n );
d700: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61  .  if( p->aColNa
d710: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
d720: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
d730: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65   ){.    pColName
d740: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
d750: 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  ll;.    pColName
d760: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
d770: 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20    pColName++;.  
d780: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
d790: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
d7a0: 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
d7b0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
d7c0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
d7d0: 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
d7e0: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
d7f0: 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
d800: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
d810: 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
d820: 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
d830: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
d840: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
d850: 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70  *.** The final p
d860: 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20  arameter, xDel, 
d870: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53  must be one of S
d880: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53  QLITE_DYNAMIC, S
d890: 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20  QLITE_STATIC.** 
d8a0: 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  or SQLITE_TRANSI
d8b0: 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51  ENT. If it is SQ
d8c0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68  LITE_DYNAMIC, th
d8d0: 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  en the buffer po
d8e0: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
d8f0: 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65  Name will be fre
d900: 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46  ed by sqlite3DbF
d910: 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76  ree() when the v
d920: 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64  dbe is destroyed
d930: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d940: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a  VdbeSetColName(.
d950: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d970: 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67     /* Vdbe being
d980: 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20   configured */. 
d990: 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9b0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
d9c0: 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69  lumn zName appli
d9d0: 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76  es to */.  int v
d9e0: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
da00: 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d  ne of the COLNAM
da10: 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  E_* constants */
da20: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
da30: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
da40: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
da50: 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
da60: 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f  ing name */.  vo
da70: 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  id (*xDel)(void*
da80: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
da90: 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  * Memory managem
daa0: 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72  ent strategy for
dab0: 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69   zName */.){.  i
dac0: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
dad0: 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
dae0: 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
daf0: 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
db00: 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
db10: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
db20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
db30: 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d     assert( !zNam
db40: 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54  e || xDel!=SQLIT
db50: 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20  E_DYNAMIC );.   
db60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
db70: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  OMEM;.  }.  asse
db80: 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21  rt( p->aColName!
db90: 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65  =0 );.  pColName
dba0: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65   = &(p->aColName
dbb0: 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73  [idx+var*p->nRes
dbc0: 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d  Column]);.  rc =
dbd0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
dbe0: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
dbf0: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
dc00: 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20  E_UTF8, xDel);. 
dc10: 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c   assert( rc!=0 |
dc20: 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f  | !zName || (pCo
dc30: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d  lName->flags&MEM
dc40: 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72  _Term)!=0 );.  r
dc50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
dc60: 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69  ** A read or wri
dc70: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
dc80: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
dc90: 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62   active on datab
dca0: 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
dcb0: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
dcc0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f  on is active, co
dcd0: 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72  mmit it. If ther
dce0: 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d  e is a.** write-
dcf0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
dd00: 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ning more than o
dd10: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
dd20: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
dd30: 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  * takes care of 
dd40: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
dd50: 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a  al trickery..*/.
dd60: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
dd70: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
dd80: 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  b, Vdbe *p){.  i
dd90: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61  nt i;.  int nTra
dda0: 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62  ns = 0;  /* Numb
ddb0: 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  er of databases 
ddc0: 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77  with an active w
ddd0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
dde0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
ddf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
de00: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b  needXcommit = 0;
de10: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
de20: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
de30: 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73  E.  /* With this
de40: 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33   option, sqlite3
de50: 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65  VtabSync() is de
de60: 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70  fined to be simp
de70: 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  ly .  ** SQLITE_
de80: 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75  OK so p is not u
de90: 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55  sed. .  */.  UNU
dea0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
deb0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  ;.#endif..  /* B
dec0: 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
ded0: 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20  hing else, call 
dee0: 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  the xSync() call
def0: 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a  back for any.  *
df00: 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  * virtual module
df10: 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20   tables written 
df20: 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
df30: 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f  ion. This has to
df40: 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65  .  ** be done be
df50: 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67  fore determining
df60: 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65   whether a maste
df70: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
df80: 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
df90: 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20  , as an xSync() 
dfa0: 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64  callback may add
dfb0: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
dfc0: 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68  abase.  ** to th
dfd0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
dfe0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
dff0: 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70  e3VtabSync(db, p
e000: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  );..  /* This lo
e010: 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61  op determines (a
e020: 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  ) if the commit 
e030: 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69  hook should be i
e040: 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20  nvoked and.  ** 
e050: 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74  (b) how many dat
e060: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65  abase files have
e070: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
e080: 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20  sactions, not . 
e090: 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68   ** including th
e0a0: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e  e temp database.
e0b0: 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e   (b) is importan
e0c0: 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72  t because if mor
e0d0: 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65  e than .  ** one
e0e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
e0f0: 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  as an open write
e100: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
e110: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20  master journal. 
e120: 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75   ** file is requ
e130: 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d  ired for an atom
e140: 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20  ic commit..  */ 
e150: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
e160: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
e170: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
e180: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
e190: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
e1a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
e1b0: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
e1c0: 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
e1d0: 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
e1e0: 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
e1f0: 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71  rans++;.      sq
e200: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
e210: 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
e220: 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
e230: 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74  lusiveLock(sqlit
e240: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
e250: 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
e260: 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29  3BtreeLeave(pBt)
e270: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
e280: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e290: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
e2a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
e2b0: 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
e2c0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
e2d0: 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
e2e0: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
e2f0: 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
e300: 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
e310: 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
e320: 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
e330: 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
e340: 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
e350: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
e360: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e370: 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
e380: 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  OOK;.    }.  }..
e390: 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
e3a0: 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
e3b0: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
e3c0: 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
e3d0: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
e3e0: 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
e3f0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
e400: 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
e410: 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
e420: 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
e430: 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
e440: 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
e450: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
e460: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
e470: 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
e480: 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
e490: 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
e4a0: 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
e4b0: 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20  mory: or a temp 
e4c0: 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20  file.  In .  ** 
e4d0: 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20  that case we do 
e4e0: 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
e4f0: 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
e500: 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
e510: 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63  e .  ** simple c
e520: 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20  ase then too..  
e530: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
e540: 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
e550: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
e560: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
e570: 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e  Bt)).   || nTran
e580: 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f  s<=1.  ){.    fo
e590: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
e5a0: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
e5b0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
e5c0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
e5d0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
e5e0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
e5f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e600: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
e610: 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20  eOne(pBt, 0);.  
e620: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
e630: 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69   /* Do the commi
e640: 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61  t only if all da
e650: 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66  tabases successf
e660: 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68  ully complete ph
e670: 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49  ase 1. .    ** I
e680: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72  f one of the Btr
e690: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
e6a0: 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20  () calls fails, 
e6b0: 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61  this indicates a
e6c0: 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f  n.    ** IO erro
e6d0: 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67  r while deleting
e6e0: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61   or truncating a
e6f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
e700: 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20  t is unlikely,. 
e710: 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20     ** but could 
e720: 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20  happen. In this 
e730: 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f  case abandon pro
e740: 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
e750: 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20  rn the error..  
e760: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
e770: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
e780: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
e790: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
e7a0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
e7b0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
e7c0: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
e7d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
e7e0: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
e7f0: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
e800: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
e810: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e820: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
e830: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  bCommit(db);.   
e840: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
e850: 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20   complex case - 
e860: 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69  There is a multi
e870: 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e  -file write-tran
e880: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a  saction active..
e890: 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72    ** This requir
e8a0: 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
e8b0: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75  nal file to ensu
e8c0: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
e8d0: 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69  on is.  ** commi
e8e0: 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20  tted atomicly.. 
e8f0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
e900: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
e910: 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
e920: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
e930: 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  b->pVfs;.    int
e940: 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20   needSync = 0;. 
e950: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
e960: 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
e970: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
e980: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
e990: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
e9a0: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
e9b0: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
e9c0: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
e9d0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
e9e0: 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
e9f0: 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
ea00: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
ea10: 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72  es;.    int retr
ea20: 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  yCount = 0;.    
ea30: 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a  int nMainFile;..
ea40: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
ea50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
ea60: 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
ea70: 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  nMainFile = sqli
ea80: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69  te3Strlen30(zMai
ea90: 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73  nFile);.    zMas
eaa0: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
eab0: 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58  intf(db, "%s-mjX
eac0: 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69  XXXXX9XXz", zMai
ead0: 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  nFile);.    if( 
eae0: 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74  zMaster==0 ) ret
eaf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
eb00: 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
eb10: 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20   u32 iRandom;.  
eb20: 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75      if( retryCou
eb30: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  nt ){.        if
eb40: 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30  ( retryCount>100
eb50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
eb60: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
eb70: 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74  _FULL, "MJ delet
eb80: 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
eb90: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
eba0: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
ebb0: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
ebc0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
ebd0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
ebe0: 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20  ( retryCount==1 
ebf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
ec00: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
ec10: 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64  FULL, "MJ collid
ec20: 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
ec30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ec40: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43    }.      retryC
ec50: 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  ount++;.      sq
ec60: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
ec70: 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29  (sizeof(iRandom)
ec80: 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20  , &iRandom);.   
ec90: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
eca0: 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72  ntf(13, &zMaster
ecb0: 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d  [nMainFile], "-m
ecc0: 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20  j%06X9%02X",.   
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61              (iRa
ecf0: 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66  ndom>>8)&0xfffff
ed00: 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29  f, iRandom&0xff)
ed10: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;.      /* The a
ed20: 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63  ntipenultimate c
ed30: 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
ed40: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
ed50: 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  ame must.      *
ed60: 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69  * be "9" to avoi
ed70: 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e  d name collision
ed80: 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33  s when using 8+3
ed90: 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20   filenames. */. 
eda0: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61       assert( zMa
edb0: 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c  ster[sqlite3Strl
edc0: 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d  en30(zMaster)-3]
edd0: 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73  =='9' );.      s
ede0: 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
edf0: 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61  3(zMainFile, zMa
ee00: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ster);.      rc 
ee10: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
ee20: 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
ee30: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
ee40: 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
ee50: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
ee60: 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29  LITE_OK && res )
ee70: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
ee80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ee90: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
eea0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  ter journal. */.
eeb0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
eec0: 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70  e3OsOpenMalloc(p
eed0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70  Vfs, zMaster, &p
eee0: 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20  Master, .       
eef0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
ef00: 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
ef10: 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
ef20: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
ef30: 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
ef40: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
ef50: 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20  JOURNAL, 0.     
ef60: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
ef70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ef80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ef90: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
efa0: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
efb0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20  n rc;.    }. .  
efc0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
efd0: 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61  ame of each data
efe0: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
eff0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74   transaction int
f000: 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
f010: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f020: 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  file. If an erro
f030: 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73  r occurs at this
f040: 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20   point close.   
f050: 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74   ** and delete t
f060: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
f070: 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20  l file. All the 
f080: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
f090: 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20  al files.    ** 
f0a0: 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c  still have 'null
f0b0: 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20  ' as the master 
f0c0: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  journal pointer,
f0d0: 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f   so they will ro
f0e0: 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69  ll.    ** back i
f0f0: 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20  ndependently if 
f100: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
f110: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
f120: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
f130: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
f140: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
f150: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
f160: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
f170: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
f180: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
f190: 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71  onst *zFile = sq
f1a0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
f1b0: 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20  rnalname(pBt);. 
f1c0: 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
f1d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
f1e0: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49   continue;  /* I
f1f0: 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a  gnore TEMP and :
f200: 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65  memory: database
f210: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  s */.        }. 
f220: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
f230: 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  File[0]!=0 );.  
f240: 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53        if( !needS
f250: 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42  ync && !sqlite3B
f260: 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
f270: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
f280: 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
f290: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f2a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f2b0: 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20  sWrite(pMaster, 
f2c0: 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74  zFile, sqlite3St
f2d0: 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c  rlen30(zFile)+1,
f2e0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
f2f0: 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69    offset += sqli
f300: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
f310: 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66  e)+1;.        if
f320: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f330: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
f340: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
f350: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
f360: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
f370: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
f380: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
f390: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f3a0: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
f3b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
f3c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f3d0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
f3e0: 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65  * Sync the maste
f3f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
f400: 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51  If the IOCAP_SEQ
f410: 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20  UENTIAL device. 
f420: 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65     ** flag is se
f430: 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65  t this is not re
f440: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
f450: 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
f460: 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c  .     && 0==(sql
f470: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
f480: 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73  acteristics(pMas
f490: 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  ter)&SQLITE_IOCA
f4a0: 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20  P_SEQUENTIAL).  
f4b0: 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21     && SQLITE_OK!
f4c0: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
f4d0: 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
f4e0: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
f4f0: 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
f500: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
f510: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
f520: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
f530: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
f540: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
f550: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
f560: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
f570: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
f580: 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
f590: 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
f5a0: 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
f5b0: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
f5c0: 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
f5d0: 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
f5e0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
f5f0: 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
f600: 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
f610: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
f620: 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
f630: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
f640: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
f650: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
f660: 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
f670: 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
f680: 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
f690: 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
f6a0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
f6b0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
f6c0: 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
f6d0: 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
f6e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
f6f0: 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
f700: 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
f710: 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
f720: 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
f730: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
f740: 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
f750: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
f760: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
f770: 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
f780: 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f  occurred..    */
f790: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
f7a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
f7b0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
f7c0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
f7d0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
f7e0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
f7f0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
f800: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
f810: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
f820: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
f830: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
f840: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
f850: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
f860: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
f870: 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66  E_BUSY );.    if
f880: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f890: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f8a0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
f8b0: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
f8c0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
f8d0: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
f8e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
f8f0: 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
f900: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f910: 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
f920: 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
f930: 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
f940: 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
f950: 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
f960: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
f970: 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
f980: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
f990: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
f9a0: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
f9b0: 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
f9c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
f9d0: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
f9e0: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
f9f0: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
fa00: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
fa10: 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
fa20: 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
fa30: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
fa40: 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
fa50: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
fa60: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
fa70: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
fa80: 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
fa90: 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
faa0: 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
fab0: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
fac0: 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
fad0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
fae0: 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
faf0: 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
fb00: 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
fb10: 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
fb20: 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
fb30: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
fb40: 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
fb50: 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
fb60: 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
fb70: 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
fb80: 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
fb90: 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
fba0: 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
fbb0: 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
fbc0: 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
fbd0: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
fbe0: 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
fbf0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
fc00: 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
fc10: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
fc20: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
fc30: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
fc40: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
fc50: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
fc60: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
fc70: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
fc80: 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
fc90: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
fca0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
fcb0: 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
fcc0: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
fcd0: 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
fce0: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
fcf0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
fd00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
fd10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
fd20: 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
fd30: 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74  sqlite3.nVdbeAct
fd40: 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62  ive count variab
fd50: 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
fd60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
fd70: 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
fd80: 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
fd90: 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
fda0: 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
fdb0: 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
fdc0: 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
fdd0: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
fde0: 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
fdf0: 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
fe00: 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
fe10: 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
fe20: 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
fe30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
fe40: 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
fe50: 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
fe60: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
fe70: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
fe80: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
fe90: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
fea0: 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
feb0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72  t = 0;.  int nWr
fec0: 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ite = 0;.  int n
fed0: 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20  Read = 0;.  p = 
fee0: 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69  db->pVdbe;.  whi
fef0: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
ff00: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
ff10: 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e  MAGIC_RUN && p->
ff20: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  pc>=0 ){.      c
ff30: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
ff40: 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
ff50: 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20   nWrite++;.     
ff60: 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65   if( p->bIsReade
ff70: 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20  r ) nRead++;.   
ff80: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
ff90: 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
ffa0: 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62  t( cnt==db->nVdb
ffb0: 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73  eActive );.  ass
ffc0: 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d  ert( nWrite==db-
ffd0: 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20  >nVdbeWrite );. 
ffe0: 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d   assert( nRead==
fff0: 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
10000 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
10010 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
10020 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  Cnt(x).#endif../
10030 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65  *.** If the Vdbe
10040 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
10050 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70  irst argument op
10060 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74  ened a statement
10070 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a  -transaction,.**
10080 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41   close it now. A
10090 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74  rgument eOp must
100a0 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50   be either SAVEP
100b0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72  OINT_ROLLBACK or
100c0 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  .** SAVEPOINT_RE
100d0 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20  LEASE. If it is 
100e0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
100f0 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61  CK, then the sta
10100 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
10110 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
10120 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20  back. If eOp is 
10130 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
10140 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  E, then the .** 
10150 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
10160 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
10170 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
10180 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
10190 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
101a0 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
101b0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
101c0 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   Otherwise SQLIT
101d0 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
101e0 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
101f0 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  tement(Vdbe *p, 
10200 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69  int eOp){.  sqli
10210 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20  te3 *const db = 
10220 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
10230 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
10240 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d  /* If p->iStatem
10250 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ent is greater t
10260 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
10270 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20  his Vdbe opened 
10280 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  a .  ** statemen
10290 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  t transaction th
102a0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  at should be clo
102b0 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e  sed here. The on
102c0 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a  ly exception.  *
102d0 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20  * is that an IO 
102e0 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f  error may have o
102f0 63 63 75 72 72 65 64 2c 20 63 61 75 73 69 6e 67  ccurred, causing
10300 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f   an emergency ro
10310 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20  llback..  ** In 
10320 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e  this case (db->n
10330 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61  Statement==0), a
10340 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  nd there is noth
10350 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a  ing to do..  */.
10360 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65    if( db->nState
10370 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74  ment && p->iStat
10380 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74  ement ){.    int
10390 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   i;.    const in
103a0 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  t iSavepoint = p
103b0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a  ->iStatement-1;.
103c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70  .    assert( eOp
103d0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
103e0 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56  BACK || eOp==SAV
103f0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b  EPOINT_RELEASE);
10400 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
10410 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b  >nStatement>0 );
10420 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
10430 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d  iStatement==(db-
10440 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e  >nStatement+db->
10450 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a  nSavepoint) );..
10460 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
10470 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
10480 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53       int rc2 = S
10490 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
104a0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
104b0 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
104c0 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
104d0 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
104e0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
104f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
10500 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
10510 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
10520 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
10530 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  CK, iSavepoint);
10540 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10550 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49     if( rc2==SQLI
10560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10570 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
10580 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
10590 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  Bt, SAVEPOINT_RE
105a0 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
105b0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
105c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
105d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
105e0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
105f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10600 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e  .    }.    db->n
10610 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20  Statement--;.   
10620 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
10630 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   0;..    if( rc=
10640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10650 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
10660 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
10670 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
10680 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
10690 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
106a0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61  NT_ROLLBACK, iSa
106b0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
106c0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
106d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
106e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
106f0 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
10700 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  b, SAVEPOINT_REL
10710 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
10720 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10730 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
10740 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
10750 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72  ction is being r
10760 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f  olled back, also
10770 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20   restore the .  
10780 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61    ** database ha
10790 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63  ndles deferred c
107a0 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65  onstraint counte
107b0 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  r to the value i
107c0 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20  t had when .    
107d0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
107e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
107f0 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20   opened.  */.   
10800 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
10810 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
10820 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
10830 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74  redCons = p->nSt
10840 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20  mtDefCons;.     
10850 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
10860 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  mCons = p->nStmt
10870 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20  DefImmCons;.    
10880 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
10890 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
108a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
108b0 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  led when a trans
108c0 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79  action opened by
108d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
108e0 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61  * handle associa
108f0 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20  ted with the VM 
10900 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
10910 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74  ument is about t
10920 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74  o be .** committ
10930 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ed. If there are
10940 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66   outstanding def
10950 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  erred foreign ke
10960 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  y constraint.** 
10970 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75  violations, retu
10980 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
10990 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
109a0 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
109b0 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
109c0 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69  nding FK violati
109d0 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e  ons and this fun
109e0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a  ction returns .*
109f0 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  * SQLITE_ERROR, 
10a00 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
10a10 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49  f the VM to SQLI
10a20 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
10a30 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20  REIGNKEY.** and 
10a40 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  write an error m
10a50 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68  essage to it. Th
10a60 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  en return SQLITE
10a70 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64  _ERROR..*/.#ifnd
10a80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
10a90 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73  OREIGN_KEY.int s
10aa0 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
10ab0 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64  k(Vdbe *p, int d
10ac0 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69  eferred){.  sqli
10ad0 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
10ae0 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64  .  if( (deferred
10af0 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72   && (db->nDeferr
10b00 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65  edCons+db->nDefe
10b10 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20  rredImmCons)>0) 
10b20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65  .   || (!deferre
10b30 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74  d && p->nFkConst
10b40 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20  raint>0) .  ){. 
10b50 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
10b60 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
10b70 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e  EIGNKEY;.    p->
10b80 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
10b90 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69  _Abort;.    sqli
10ba0 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
10bb0 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 46  >zErrMsg, db, "F
10bc0 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
10bd0 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a  raint failed");.
10be0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10bf0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
10c00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10c10 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
10c20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
10c30 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e   called the when
10c40 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f   a VDBE tries to
10c50 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56   halt.  If the V
10c60 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20  DBE.** has made 
10c70 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69  changes and is i
10c80 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64  n autocommit mod
10c90 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74  e, then commit t
10ca0 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  hose.** changes.
10cb0 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20    If a rollback 
10cc0 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  is needed, then 
10cd0 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  do the rollback.
10ce0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
10cf0 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  ine is the only 
10d00 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  way to move the 
10d10 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72  state of a VM fr
10d20 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47  om.** SQLITE_MAG
10d30 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45  IC_RUN to SQLITE
10d40 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74  _MAGIC_HALT.  It
10d50 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a   is harmless to.
10d60 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20  ** call this on 
10d70 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20  a VM that is in 
10d80 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  the SQLITE_MAGIC
10d90 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a  _HALT state..**.
10da0 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
10db0 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65  or code.  If the
10dc0 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f   commit could no
10dd0 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
10de0 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  se of.** lock co
10df0 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e  ntention, return
10e00 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49   SQLITE_BUSY.  I
10e10 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  f SQLITE_BUSY is
10e20 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a   returned, it.**
10e30 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65   means the close
10e40 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20   did not happen 
10e50 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
10e60 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  repeated..*/.int
10e70 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
10e80 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
10e90 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10eb0 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72  Used to store tr
10ec0 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63  ansient return c
10ed0 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  odes */.  sqlite
10ee0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
10ef0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
10f00 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
10f10 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72  logic that deter
10f20 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65  mines if a state
10f30 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61  ment or.  ** tra
10f40 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
10f50 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
10f60 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
10f70 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a  esult of the.  *
10f80 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
10f90 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
10fa0 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine. .  **.  ** 
10fb0 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
10fc0 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f  llowing errors o
10fd0 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccur:.  **.  ** 
10fe0 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d      SQLITE_NOMEM
10ff0 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
11000 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20  _IOERR.  **     
11010 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a  SQLITE_FULL.  **
11020 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45       SQLITE_INTE
11030 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  RRUPT.  **.  ** 
11040 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  Then the interna
11050 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61  l cache might ha
11060 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20  ve been left in 
11070 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a  an inconsistent.
11080 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20    ** state.  We 
11090 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  need to rollback
110a0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
110b0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74  ransaction, if t
110c0 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65  here is.  ** one
110d0 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  , or the complet
110e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  e transaction if
110f0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   there is no sta
11100 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
11110 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20  on..  */..  if( 
11120 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
11130 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
11140 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
11150 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f  .  }.  if( p->aO
11160 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73 65 74  nceFlag ) memset
11170 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30  (p->aOnceFlag, 0
11180 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b  , p->nOnceFlag);
11190 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
111a0 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  rs(p);.  if( p->
111b0 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
111c0 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74  C_RUN ){.    ret
111d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
111e0 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65   }.  checkActive
111f0 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
11200 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  /* No commit or 
11210 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20  rollback needed 
11220 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e  if the program n
11230 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72 20  ever started or 
11240 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20  if the.  ** SQL 
11250 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e  statement does n
11260 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ot read or write
11270 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
11280 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
11290 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65  c>=0 && p->bIsRe
112a0 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  ader ){.    int 
112b0 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72  mrc;   /* Primar
112c0 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  y error code fro
112d0 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69  m p->rc */.    i
112e0 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  nt eStatementOp 
112f0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53  = 0;.    int isS
11300 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20  pecialError;    
11310 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
11320 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65  o true if a 'spe
11330 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a  cial' error */..
11340 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20      /* Lock all 
11350 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74  btrees used by t
11360 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
11370 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
11380 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  nter(p);..    /*
11390 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f   Check for one o
113a0 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
113b0 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20  rors */.    mrc 
113c0 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a  = p->rc & 0xff;.
113d0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
113e0 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
113f0 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f 2a 20 54  BLOCKED );  /* T
11400 68 69 73 20 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e  his error no lon
11410 67 65 72 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ger exists */.  
11420 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72    isSpecialError
11430 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   = mrc==SQLITE_N
11440 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
11450 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  ITE_IOERR.      
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
11470 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e  | mrc==SQLITE_IN
11480 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d  TERRUPT || mrc==
11490 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
114a0 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72   if( isSpecialEr
114b0 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ror ){.      /* 
114c0 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73  If the query was
114d0 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74   read-only and t
114e0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
114f0 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
11500 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20  T, .      ** no 
11510 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65  rollback is nece
11520 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65  ssary. Otherwise
11530 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76  , at least a sav
11540 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
11550 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
11560 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
11570 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
11580 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20  database to a . 
11590 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65       ** consiste
115a0 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  nt state..      
115b0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e  **.      ** Even
115c0 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
115d0 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  t is read-only, 
115e0 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
115f0 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20  to perform.     
11600 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20   ** a statement 
11610 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  or transaction r
11620 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  ollback operatio
11630 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  n. If the error 
11640 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72  .      ** occurr
11650 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
11660 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   to the journal,
11670 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20   sub-journal or 
11680 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
11690 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f  * file as part o
116a0 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66  f an effort to f
116b0 72 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61  ree up cache spa
116c0 63 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e  ce (see function
116d0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53  .      ** pagerS
116e0 74 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72  tress() in pager
116f0 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  .c), the rollbac
11700 6b 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  k is required to
11710 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20   restore .      
11720 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
11730 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  a consistent sta
11740 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
11750 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
11760 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49  nly || mrc!=SQLI
11770 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a  TE_INTERRUPT ){.
11780 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63          if( (mrc
11790 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
117a0 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
117b0 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74  LL) && p->usesSt
117c0 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  mtJournal ){.   
117d0 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
117e0 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
117f0 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
11800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11810 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72     /* We are for
11820 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ced to roll back
11830 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e   the active tran
11840 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20  saction. Before 
11850 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  doing.          
11860 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79  ** so, abort any
11870 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
11880 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75  s this handle cu
11890 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69  rrently has acti
118a0 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
118b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
118c0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
118d0 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
118e0 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
118f0 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
11900 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
11910 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75            db->au
11920 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
11930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11940 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
11950 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74  eck for immediat
11960 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69  e foreign key vi
11970 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20  olations. */.   
11980 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
11990 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
119a0 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
119b0 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  k(p, 0);.    }. 
119c0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
119d0 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
119e0 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73   is set and this
119f0 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74   is the only act
11a00 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20  ive writer .    
11a10 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64  ** VM, then we d
11a20 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69  o either a commi
11a30 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  t or rollback of
11a40 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
11a50 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a  nsaction. .    *
11a60 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54  *.    ** Note: T
11a70 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72  his block also r
11a80 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68  uns if one of th
11a90 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
11aa0 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a   handled .    **
11ab0 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72   above has occur
11ac0 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  red. .    */.   
11ad0 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61   if( !sqlite3Vta
11ae0 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20  bInSync(db) .   
11af0 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d    && db->autoCom
11b00 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d  mit .     && db-
11b10 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d  >nVdbeWrite==(p-
11b20 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20  >readOnly==0) . 
11b30 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
11b40 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
11b50 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74   || (p->errorAct
11b60 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20  ion==OE_Fail && 
11b70 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29  !isSpecialError)
11b80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
11b90 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
11ba0 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20  kFk(p, 1);.     
11bb0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11bc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11bd0 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72    if( NEVER(p->r
11be0 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadOnly) ){.    
11bf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11c00 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
11c10 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11c20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
11c30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11c40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11c50 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
11c60 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d  GNKEY;.        }
11c70 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20  else{ .         
11c80 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d   /* The auto-com
11c90 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65  mit flag is true
11ca0 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  , the vdbe progr
11cb0 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75  am was successfu
11cc0 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
11cd0 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41  or hit an 'OR FA
11ce0 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  IL' constraint a
11cf0 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
11d00 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
11d10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65  .          ** ke
11d20 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  y constraints to
11d30 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61   hold up the tra
11d40 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d  nsaction. This m
11d50 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20  eans a commit . 
11d60 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72           ** is r
11d70 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
11d80 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43        rc = vdbeC
11d90 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20  ommit(db, p);.  
11da0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11db0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
11dc0 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e  USY && p->readOn
11dd0 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ly ){.          
11de0 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
11df0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
11e00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
11e10 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
11e20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11e30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
11e40 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
11e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
11e60 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
11e70 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20  ITE_OK);.       
11e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11e90 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
11ea0 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
11eb0 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
11ec0 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20  ImmCons = 0;.   
11ed0 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
11ee0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65   &= ~SQLITE_Defe
11ef0 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 20  rFKs;.          
11f00 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
11f10 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
11f20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11f30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11f40 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
11f50 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
11f60 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
11f70 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
11f80 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
11f90 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
11fa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
11fb0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
11fc0 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74  K || p->errorAct
11fd0 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ion==OE_Fail ){.
11fe0 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
11ff0 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
12000 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20  _RELEASE;.      
12010 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72  }else if( p->err
12020 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f  orAction==OE_Abo
12030 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53  rt ){.        eS
12040 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
12050 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
12060 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12070 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
12080 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
12090 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
120a0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  CK);.        sql
120b0 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
120c0 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
120d0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
120e0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
120f0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
12100 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20  eStatementOp is 
12110 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
12120 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
12130 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a  action needs to.
12140 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74      ** be commit
12150 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
12160 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ck. Call sqlite3
12170 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
12180 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64  nt() to.    ** d
12190 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70  o so. If this op
121a0 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  eration returns 
121b0 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
121c0 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
121d0 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72  ent.    ** error
121e0 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
121f0 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e  OK or SQLITE_CON
12200 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72  STRAINT, then pr
12210 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  omote the.    **
12220 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
12230 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20  nt error code.. 
12240 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53     */.    if( eS
12250 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20  tatementOp ){.  
12260 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12270 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
12280 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74  nt(p, eStatement
12290 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Op);.      if( r
122a0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  c ){.        if(
122b0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
122c0 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66  K || (p->rc&0xff
122d0 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  )==SQLITE_CONSTR
122e0 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  AINT ){.        
122f0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
12300 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
12310 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
12320 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
12330 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
12340 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12350 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
12360 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
12370 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
12380 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12390 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
123a0 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
123b0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
123c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
123d0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
123e0 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c  s was an INSERT,
123f0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
12400 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65  E and no stateme
12410 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  nt transaction. 
12420 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72     ** has been r
12430 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61  olled back, upda
12440 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
12450 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67  connection chang
12460 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20  e-counter. .    
12470 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68  */.    if( p->ch
12480 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20  angeCntOn ){.   
12490 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
124a0 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52  tOp!=SAVEPOINT_R
124b0 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
124c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
124d0 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e  tChanges(db, p->
124e0 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  nChange);.      
124f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
12500 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
12510 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  nges(db, 0);.   
12520 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43     }.      p->nC
12530 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  hange = 0;.    }
12540 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
12550 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20   the locks */.  
12560 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
12570 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ve(p);.  }..  /*
12580 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73   We have success
12590 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64  fully halted and
125a0 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20   closed the VM. 
125b0 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63   Record this fac
125c0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
125d0 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  c>=0 ){.    db->
125e0 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20  nVdbeActive--;. 
125f0 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
12600 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57  nly ) db->nVdbeW
12610 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20  rite--;.    if( 
12620 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64  p->bIsReader ) d
12630 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a  b->nVdbeRead--;.
12640 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
12650 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d  nVdbeActive>=db-
12660 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20  >nVdbeRead );.  
12670 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
12680 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64  dbeRead>=db->nVd
12690 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61  beWrite );.    a
126a0 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
126b0 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a  Write>=0 );.  }.
126c0 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
126d0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20  E_MAGIC_HALT;.  
126e0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
126f0 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d  nt(db);.  if( p-
12700 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
12710 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
12720 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12730 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
12740 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
12750 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c   is set to true,
12760 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20   then any locks 
12770 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20  that were held. 
12780 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f   ** by connectio
12790 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65  n db have now be
127a0 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c  en released. Cal
127b0 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74  l sqlite3Connect
127c0 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20  ionUnlocked() . 
127d0 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e   ** to invoke an
127e0 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63  y required unloc
127f0 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
12800 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ks..  */.  if( d
12810 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
12820 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
12830 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64  ectionUnlocked(d
12840 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  b);.  }..  asser
12850 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
12860 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  ve>0 || db->auto
12870 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
12880 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29  >nStatement==0 )
12890 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
128a0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f  c==SQLITE_BUSY ?
128b0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53   SQLITE_BUSY : S
128c0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f  QLITE_OK);.}.../
128d0 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68  *.** Each VDBE h
128e0 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20  olds the result 
128f0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
12900 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nt sqlite3_step(
12910 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e  ) call.** in p->
12920 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  rc.  This routin
12930 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75  e sets that resu
12940 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54  lt back to SQLIT
12950 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  E_OK..*/.void sq
12960 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74  lite3VdbeResetSt
12970 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70  epResult(Vdbe *p
12980 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  ){.  p->rc = SQL
12990 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
129a0 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20   Copy the error 
129b0 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d  code and error m
129c0 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  essage belonging
129d0 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73   to the VDBE pas
129e0 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
129f0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
12a00 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  its database han
12a10 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65  dle (so that the
12a20 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65  y will be .** re
12a30 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20  turned by calls 
12a40 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  to sqlite3_errco
12a50 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  de() and sqlite3
12a60 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a  _errmsg())..**.*
12a70 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
12a80 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74  does not clear t
12a90 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f  he VDBE error co
12aa0 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a  de or message, j
12ab0 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68  ust.** copies th
12ac0 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  em to the databa
12ad0 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
12ae0 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61  t sqlite3VdbeTra
12af0 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20  nsferError(Vdbe 
12b00 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
12b10 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
12b20 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
12b30 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
12b40 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46  {.    u8 mallocF
12b50 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c  ailed = db->mall
12b60 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 73 71  ocFailed;.    sq
12b70 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
12b80 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66  Malloc();.    if
12b90 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20  ( db->pErr==0 ) 
12ba0 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74  db->pErr = sqlit
12bb0 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a  e3ValueNew(db);.
12bc0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
12bd0 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
12be0 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c   -1, p->zErrMsg,
12bf0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
12c00 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
12c10 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
12c20 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
12c30 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
12c40 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c  led = mallocFail
12c50 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43  ed;.    db->errC
12c60 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73  ode = rc;.  }els
12c70 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  e{.    sqlite3Er
12c80 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a  ror(db, rc, 0);.
12c90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12ca0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
12cb0 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
12cc0 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49  /*.** If an SQLI
12cd0 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47  TE_CONFIG_SQLLOG
12ce0 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65   hook is registe
12cf0 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68  red and the VM h
12d00 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a  as been run, .**
12d10 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73   invoke it..*/.s
12d20 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 49  tatic void vdbeI
12d30 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65  nvokeSqllog(Vdbe
12d40 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *v){.  if( sqli
12d50 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
12d60 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63  xSqllog && v->rc
12d70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76  ==SQLITE_OK && v
12d80 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e  ->zSql && v->pc>
12d90 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
12da0 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69  zExpanded = sqli
12db0 74 65 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c  te3VdbeExpandSql
12dc0 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20  (v, v->zSql);.  
12dd0 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d    assert( v->db-
12de0 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b  >init.busy==0 );
12df0 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64  .    if( zExpand
12e00 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ed ){.      sqli
12e10 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
12e20 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20  xSqllog(.       
12e30 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
12e40 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
12e50 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e  g, v->db, zExpan
12e60 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a  ded, 1.      );.
12e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
12e80 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61  ree(v->db, zExpa
12e90 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  nded);.    }.  }
12ea0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
12eb0 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c  e vdbeInvokeSqll
12ec0 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  og(x).#endif../*
12ed0 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56  .** Clean up a V
12ee0 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
12ef0 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ion but do not d
12f00 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a  elete the VDBE j
12f10 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74  ust yet..** Writ
12f20 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
12f30 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72  ages into *pzErr
12f40 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Msg.  Return the
12f50 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a   result code..**
12f60 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
12f70 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74  outine is run, t
12f80 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62  he VDBE should b
12f90 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78  e ready to be ex
12fa0 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e  ecuted.** again.
12fb0 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61  .**.** To look a
12fc0 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79  t it another way
12fd0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
12fe0 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20  esets the state 
12ff0 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61  of the.** virtua
13000 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56  l machine from V
13010 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72  DBE_MAGIC_RUN or
13020 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
13030 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45   back to.** VDBE
13040 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a  _MAGIC_INIT..*/.
13050 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
13060 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  eset(Vdbe *p){. 
13070 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
13080 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
13090 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20  * If the VM did 
130a0 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c  not run to compl
130b0 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65  etion or if it e
130c0 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20  ncountered an.  
130d0 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69  ** error, then i
130e0 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65  t might not have
130f0 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f   been halted pro
13100 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a  perly.  So halt.
13110 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a    ** it now..  *
13120 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48  /.  sqlite3VdbeH
13130 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  alt(p);..  /* If
13140 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
13150 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61   run even partia
13160 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  lly, then transf
13170 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  er the error cod
13180 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72  e.  ** and error
13190 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68   message from th
131a0 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20  e VDBE into the 
131b0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
131c0 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20  ructure.  But.  
131d0 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68  ** if the VDBE h
131e0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74  as just been set
131f0 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20   to run but has 
13200 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65  not actually exe
13210 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69  cuted any.  ** i
13220 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c  nstructions yet,
13230 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20   leave the main 
13240 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
13250 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61  nformation uncha
13260 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nged..  */.  if(
13270 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
13280 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
13290 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  g(p);.    sqlite
132a0 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72  3VdbeTransferErr
132b0 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  or(p);.    sqlit
132c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
132d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
132e0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
132f0 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79    if( p->runOnly
13300 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65  Once ) p->expire
13310 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  d = 1;.  }else i
13320 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65  f( p->rc && p->e
13330 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a  xpired ){.    /*
13340 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61   The expired fla
13350 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65  g was set on the
13360 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65   VDBE before the
13370 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20   first call.    
13380 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ** to sqlite3_st
13390 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73  ep(). For consis
133a0 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c  tency (since sql
133b0 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a  ite3_step() was.
133c0 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20      ** called), 
133d0 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
133e0 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63   error in this c
133f0 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20  ase as well..   
13400 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
13410 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20  rror(db, p->rc, 
13420 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73  p->zErrMsg ? "%s
13430 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73  " : 0, p->zErrMs
13440 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
13450 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
13460 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
13470 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a  rrMsg = 0;.  }..
13480 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c    /* Reclaim all
13490 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
134a0 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20  the VDBE.  */.  
134b0 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f  Cleanup(p);..  /
134c0 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67  * Save profiling
134d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
134e0 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e  m this VDBE run.
134f0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42  .  */.#ifdef VDB
13500 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
13510 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
13520 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
13530 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
13540 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
13550 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
13560 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
13570 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  -- ");.      for
13580 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
13590 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
135a0 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78  rintf(out, "%02x
135b0 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  ", p->aOp[i].opc
135c0 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
135d0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
135e0 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66   "\n");.      if
135f0 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20  ( p->zSql ){.   
13600 20 20 20 20 20 63 68 61 72 20 63 2c 20 70 63 20       char c, pc 
13610 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72  = 0;.        fpr
13620 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29  intf(out, "-- ")
13630 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
13640 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b  0; (c = p->zSql[
13650 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  i])!=0; i++){.  
13660 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d          if( pc==
13670 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f  '\n' ) fprintf(o
13680 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20  ut, "-- ");.    
13690 20 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75        putc(c, ou
136a0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63  t);.          pc
136b0 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = c;.        }.
136c0 20 20 20 20 20 20 20 20 69 66 28 20 70 63 21 3d          if( pc!=
136d0 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f  '\n' ) fprintf(o
136e0 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
136f0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
13700 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
13710 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a  {.        char z
13720 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20  Hdr[100];.      
13730 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
13740 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c  tf(sizeof(zHdr),
13750 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c   zHdr, "%6u %12l
13760 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20  lu %8llu ",.    
13770 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
13780 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  .cnt,.          
13790 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
137a0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  s,.           p-
137b0 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20  >aOp[i].cnt>0 ? 
137c0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
137d0 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a  /p->aOp[i].cnt :
137e0 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   0.        );.  
137f0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
13800 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a  t, "%s", zHdr);.
13810 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13820 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20  dbePrintOp(out, 
13830 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a  i, &p->aOp[i]);.
13840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63        }.      fc
13850 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d  lose(out);.    }
13860 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
13870 3e 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20  >iCurrentTime = 
13880 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  0;.  p->magic = 
13890 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b  VDBE_MAGIC_INIT;
138a0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20  .  return p->rc 
138b0 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
138c0 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  . ./*.** Clean u
138d0 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56  p and delete a V
138e0 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
138f0 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ion.  Return an 
13900 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
13910 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
13920 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20  ode.  Write any 
13930 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
13940 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  xt into *pzErrMs
13950 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
13960 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64  3VdbeFinalize(Vd
13970 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
13980 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13990 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
139a0 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
139b0 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
139c0 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
139d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
139e0 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61  eReset(p);.    a
139f0 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e  ssert( (rc & p->
13a00 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
13a10 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
13a20 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a  3VdbeDelete(p);.
13a30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13a40 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  /*.** If paramet
13a50 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74  er iOp is less t
13a60 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69  han zero, then i
13a70 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
13a80 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20  ctor for.** all 
13a90 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70  auxiliary data p
13aa0 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c  ointers currentl
13ab0 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20  y cached by the 
13ac0 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20  VM passed as.** 
13ad0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
13ae0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  nt..**.** Or, if
13af0 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20   iOp is greater 
13b00 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
13b10 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
13b20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a  destructor is.**
13b30 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f   only invoked fo
13b40 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72  r those auxiliar
13b50 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20  y data pointers 
13b60 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75  created by the u
13b70 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ser .** function
13b80 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
13b90 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f  OP_Function opco
13ba0 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f  de at instructio
13bb0 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20  n iOp of .** VM 
13bc0 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20  pVdbe, and only 
13bd0 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  then if:.**.**  
13be0 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74    * the associat
13bf0 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ed function para
13c00 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e  meter is the 32n
13c10 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e  d or later (coun
13c20 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f  ting.**      fro
13c30 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29  m left to right)
13c40 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  , or.**.**    * 
13c50 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
13c60 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e  g bit in argumen
13c70 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20  t mask is clear 
13c80 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74  (where the first
13c90 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f  .**      functio
13ca0 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72  n parameter corr
13cb0 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20  sponds to bit 0 
13cc0 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  etc.)..*/.void s
13cd0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
13ce0 41 75 78 44 61 74 61 28 56 64 62 65 20 2a 70 56  AuxData(Vdbe *pV
13cf0 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e  dbe, int iOp, in
13d00 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44 61  t mask){.  AuxDa
13d10 74 61 20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65  ta **pp = &pVdbe
13d20 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 77 68  ->pAuxData;.  wh
13d30 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20  ile( *pp ){.    
13d40 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20  AuxData *pAux = 
13d50 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f  *pp;.    if( (iO
13d60 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41  p<0).     || (pA
13d70 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20  ux->iOp==iOp && 
13d80 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c  (pAux->iArg>31 |
13d90 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42  | !(mask & MASKB
13da0 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72 67 29  IT32(pAux->iArg)
13db0 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ))).    ){.     
13dc0 20 74 65 73 74 63 61 73 65 28 20 70 41 75 78 2d   testcase( pAux-
13dd0 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20  >iArg==31 );.   
13de0 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
13df0 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
13e00 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41  pAux->xDelete(pA
13e10 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
13e20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70   }.      *pp = p
13e30 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Aux->pNext;.    
13e40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
13e50 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75 78 29  pVdbe->db, pAux)
13e60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13e70 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e     pp= &pAux->pN
13e80 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ext;.    }.  }.}
13e90 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
13ea0 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
13eb0 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
13ec0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
13ed0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
13ee0 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62  ** except for ob
13ef0 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69  ject itself, whi
13f00 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e  ch is preserved.
13f10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
13f20 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
13f30 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
13f40 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
13f50 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56  e() is that.** V
13f60 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f  dbeDelete() also
13f70 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62   unlinks the Vdb
13f80 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
13f90 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65  of VMs associate
13fa0 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61  d with.** the da
13fb0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13fc0 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20  n and frees the 
13fd0 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a  object itself..*
13fe0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
13ff0 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71  beClearObject(sq
14000 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
14010 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61  *p){.  SubProgra
14020 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b  m *pSub, *pNext;
14030 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
14040 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20  rt( p->db==0 || 
14050 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72  p->db==db );.  r
14060 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
14070 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29  ->aVar, p->nVar)
14080 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
14090 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
140a0 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
140b0 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72  OLNAME_N);.  for
140c0 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61  (pSub=p->pProgra
140d0 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e  m; pSub; pSub=pN
140e0 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
140f0 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSub->pNext;. 
14100 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72     vdbeFreeOpArr
14110 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70  ay(db, pSub->aOp
14120 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20  , pSub->nOp);.  
14130 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
14140 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20  db, pSub);.  }. 
14150 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d   for(i=p->nzVar-
14160 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71  1; i>=0; i--) sq
14170 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14180 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20  p->azVar[i]);.  
14190 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
141a0 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e  db, p->aOp, p->n
141b0 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Op);.  sqlite3Db
141c0 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
141d0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
141e0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53  DbFree(db, p->zS
141f0 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ql);.  sqlite3Db
14200 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65  Free(db, p->pFre
14210 65 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  e);.#if defined(
14220 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52  SQLITE_ENABLE_TR
14230 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 73 71  EE_EXPLAIN).  sq
14240 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14250 70 2d 3e 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20  p->zExplain);.  
14260 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14270 2c 20 70 2d 3e 70 45 78 70 6c 61 69 6e 29 3b 0a  , p->pExplain);.
14280 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
14290 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
142a0 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73   VDBE..*/.void s
142b0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
142c0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
142d0 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
142e0 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
142f0 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d  eturn;.  db = p-
14300 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
14310 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
14320 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
14330 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65    sqlite3VdbeCle
14340 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b  arObject(db, p);
14350 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
14360 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
14370 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
14380 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
14390 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62  assert( db->pVdb
143a0 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e  e==p );.    db->
143b0 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74  pVdbe = p->pNext
143c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
143d0 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
143e0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
143f0 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d  >pPrev;.  }.  p-
14400 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
14410 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64  GIC_DEAD;.  p->d
14420 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  b = 0;.  sqlite3
14430 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
14440 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
14450 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69  e the cursor p i
14460 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20  s ready to read 
14470 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77  or write the row
14480 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20   to which it.** 
14490 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f  was last positio
144a0 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ned.  Return an 
144b0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
144c0 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f   OOM fault or I/
144d0 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65  O error.** preve
144e0 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69  nts us from posi
144f0 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73  tioning the curs
14500 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  or to its correc
14510 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t position..**.*
14520 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
14530 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
14540 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
14550 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
14560 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
14570 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20  ow.  If no move 
14580 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63  is pending, chec
14590 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
145a0 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  row has been.** 
145b0 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
145c0 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
145d0 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c  r and if it has,
145e0 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73   mark the row as
145f0 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a  .** a NULL row..
14600 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
14610 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
14620 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63  ointing to the c
14630 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74  orrect row and t
14640 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e  hat row has.** n
14650 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  ot been deleted 
14660 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
14670 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  he cursor, then 
14680 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
14690 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
146a0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
146b0 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73  rMoveto(VdbeCurs
146c0 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
146d0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
146e0 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20  ){.    int res, 
146f0 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
14700 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65 72  E_TEST.    exter
14710 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
14720 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  arch_count;.#end
14730 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  if.    assert( p
14740 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
14750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
14760 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
14770 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  (p->pCursor, 0, 
14780 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
14790 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69   0, &res);.    i
147a0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
147b0 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f  c;.    p->lastRo
147c0 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54  wid = p->movetoT
147d0 61 72 67 65 74 3b 0a 20 20 20 20 69 66 28 20 72  arget;.    if( r
147e0 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53  es!=0 ) return S
147f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
14800 50 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64  PT;.    p->rowid
14810 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66  IsValid = 1;.#if
14820 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
14830 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72      sqlite3_sear
14840 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
14850 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72  if.    p->deferr
14860 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
14870 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
14880 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
14890 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70    }else if( p->p
148a0 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 69 6e  Cursor ){.    in
148b0 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20 20  t hasMoved;.    
148c0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
148d0 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
148e0 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ved(p->pCursor, 
148f0 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20 20  &hasMoved);.    
14900 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
14910 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61 73 4d  rc;.    if( hasM
14920 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d  oved ){.      p-
14930 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
14940 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20  ACHE_STALE;.    
14950 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64 3d 3d    if( hasMoved==
14960 32 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d  2 ) p->nullRow =
14970 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
14980 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14990 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
149a0 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
149b0 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ns:.**.** sqlite
149c0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
149d0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
149e0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a  SerialTypeLen().
149f0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
14a00 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  rialLen().** sql
14a10 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
14a20 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  t().** sqlite3Vd
14a30 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a  beSerialGet().**
14a40 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
14a50 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
14a60 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
14a70 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
14a80 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
14a90 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
14aa0 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
14ab0 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
14ac0 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
14ad0 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
14ae0 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
14af0 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
14b00 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
14b10 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
14b20 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
14b30 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
14b40 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
14b50 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
14b60 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
14b70 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
14b80 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
14b90 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
14ba0 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
14bb0 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
14bc0 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
14bd0 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
14be0 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
14bf0 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
14c00 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
14c10 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
14c20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
14c30 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
14c40 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
14c50 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
14c60 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61  d data blob sepa
14c70 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
14c80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
14c90 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
14ca0 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
14cb0 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
14cc0 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
14cd0 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
14ce0 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
14cf0 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
14d00 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
14d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
14d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
14d30 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
14d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
14d50 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
14d60 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
14d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
14d80 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
14d90 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
14da0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
14db0 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
14dc0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
14dd0 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
14de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14df0 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
14e00 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
14e10 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
14e20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
14e30 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
14e40 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
14e50 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
14e60 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
14e70 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
14e80 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
14e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ea0 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
14eb0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
14ec0 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
14ed0 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
14ee0 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
14ef0 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
14f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f10 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
14f20 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
14f30 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
14f50 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
14f60 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
14f70 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f90 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
14fa0 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
14fb0 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
14fc0 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
14fd0 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
14fe0 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
14ff0 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
15000 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
15010 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
15020 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
15030 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
15040 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
15050 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
15060 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
15070 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
15080 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
15090 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
150a0 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
150b0 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
150c0 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
150d0 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
150e0 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
150f0 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
15100 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20  _format){.  int 
15110 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c  flags = pMem->fl
15120 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20  ags;.  int n;.. 
15130 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
15140 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
15150 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 0;.  }.  if( f
15160 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a  lags&MEM_Int ){.
15170 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
15180 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65  t whether to use
15190 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38   1, 2, 4, 6 or 8
151a0 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64   bytes. */.#   d
151b0 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20  efine MAX_6BYTE 
151c0 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30  ((((i64)0x000080
151d0 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20  00)<<32)-1).    
151e0 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e  i64 i = pMem->u.
151f0 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20  i;.    u64 u;.  
15200 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
15210 20 20 20 69 66 28 20 69 3c 28 2d 4d 41 58 5f 36     if( i<(-MAX_6
15220 42 59 54 45 29 20 29 20 72 65 74 75 72 6e 20 36  BYTE) ) return 6
15230 3b 0a 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69  ;.      /* Previ
15240 6f 75 73 20 74 65 73 74 20 70 72 65 76 65 6e 74  ous test prevent
15250 73 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32 33 33  s:  u = -(-92233
15260 37 32 30 33 36 38 35 34 37 37 35 38 30 38 29 20  72036854775808) 
15270 2a 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d 69 3b  */.      u = -i;
15280 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15290 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20    u = i;.    }. 
152a0 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b     if( u<=127 ){
152b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28  .      return ((
152c0 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f  i&1)==i && file_
152d0 66 6f 72 6d 61 74 3e 3d 34 29 20 3f 20 38 2b 28  format>=4) ? 8+(
152e0 75 33 32 29 75 20 3a 20 31 3b 0a 20 20 20 20 7d  u32)u : 1;.    }
152f0 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36  .    if( u<=3276
15300 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  7 ) return 2;.  
15310 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37    if( u<=8388607
15320 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20   ) return 3;.   
15330 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36   if( u<=21474836
15340 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20  47 ) return 4;. 
15350 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42     if( u<=MAX_6B
15360 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a  YTE ) return 5;.
15370 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
15380 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
15390 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65  M_Real ){.    re
153a0 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73  turn 7;.  }.  as
153b0 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e  sert( pMem->db->
153c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
153d0 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d  flags&(MEM_Str|M
153e0 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20  EM_Blob) );.  n 
153f0 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  = pMem->n;.  if(
15400 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
15410 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
15420 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  em->u.nZero;.  }
15430 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20  .  assert( n>=0 
15440 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  );.  return ((n*
15450 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
15460 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
15470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
15480 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
15490 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f  he data correspo
154a0 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  nding to the sup
154b0 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70  plied serial-typ
154c0 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  e..*/.u32 sqlite
154d0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
154e0 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  en(u32 serial_ty
154f0 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61  pe){.  if( seria
15500 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
15510 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
15520 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d  _type-12)/2;.  }
15530 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
15540 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b   const u8 aSize[
15550 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33  ] = { 0, 1, 2, 3
15560 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c  , 4, 6, 8, 8, 0,
15570 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20   0, 0, 0 };.    
15580 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72  return aSize[ser
15590 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d  ial_type];.  }.}
155a0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
155b0 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63  e on an architec
155c0 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d  ture with mixed-
155d0 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20  endian floating 
155e0 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20  .** points (ex: 
155f0 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20  ARM7) then swap 
15600 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65  the lower 4 byte
15610 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75  s with the .** u
15620 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52  pper 4 bytes.  R
15630 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
15640 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74  ..**.** For most
15650 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20   architectures, 
15660 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
15670 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20  .**.** (later): 
15680 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
15690 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d  to me that the m
156a0 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62  ixed-endian prob
156b0 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69  lem.** on ARM7 i
156c0 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20  s an issue with 
156d0 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68  GCC, not with th
156e0 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74  e ARM7 chip.  It
156f0 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65   seems.** that e
15700 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66  arly versions of
15710 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20   GCC stored the 
15720 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36  two words of a 6
15730 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69  4-bit.** float i
15740 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65  n the wrong orde
15750 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72  r.  And that err
15760 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70  or has been prop
15770 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73  agated.** ever s
15780 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65  ince.  The blame
15790 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
157a0 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68  ily with GCC, th
157b0 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67  ough..** GCC mig
157c0 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70  ht have just cop
157d0 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ying the problem
157e0 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f   from a prior co
157f0 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20  mpiler..** I am 
15800 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e  also told that n
15810 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
15820 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77   GCC that follow
15830 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
15840 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65  ABI get the byte
15850 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a   order right..**
15860 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75  .** Developers u
15870 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61  sing SQLite on a
15880 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f  n ARM7 should co
15890 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68  mpile and run th
158a0 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69  eir.** applicati
158b0 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  on using -DSQLIT
158c0 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61  E_DEBUG=1 at lea
158d0 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44  st once.  With D
158e0 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  EBUG.** enabled,
158f0 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65   some asserts be
15900 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20  low will ensure 
15910 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72  that the byte or
15920 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69  der of.** floati
15930 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
15940 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a  is correct..**.*
15950 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20  * (2007-08-30)  
15960 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68  Frank van Vugt h
15970 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20  as studied this 
15980 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a  problem closely.
15990 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20  ** and has send 
159a0 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20  his findings to 
159b0 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c  the SQLite devel
159c0 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a  opers.  Frank.**
159d0 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d   writes that som
159e0 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  e Linux kernels 
159f0 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70  offer floating p
15a00 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a  oint hardware.**
15a10 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20   emulation that 
15a20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74  uses only 32-bit
15a30 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65   mantissas inste
15a40 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a  ad of a full .**
15a50 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75   48-bits as requ
15a60 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45  ired by the IEEE
15a70 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69   standard.  (Thi
15a80 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46  s is the.** CONF
15a90 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f  IG_FPE_FASTFPE o
15aa0 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68  ption.)  On such
15ab0 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69   systems, floati
15ac0 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65  ng point.** byte
15ad0 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65   swapping become
15ae0 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74  s very complicat
15af0 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72  ed.  To avoid pr
15b00 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e  oblems,.** the n
15b10 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77  ecessary byte sw
15b20 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65  apping is carrie
15b30 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34  d out using a 64
15b40 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20  -bit integer.** 
15b50 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34  rather than a 64
15b60 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61  -bit float.  Fra
15b70 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68  nk assures us th
15b80 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  at the code here
15b90 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69  .** works for hi
15ba0 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65  m.  We, the deve
15bb0 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20  lopers, have no 
15bc0 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65  way to independe
15bd0 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74  ntly.** verify t
15be0 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73  his, but Frank s
15bf0 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61  eems to know wha
15c00 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20  t he is talking 
15c10 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74  about.** so we t
15c20 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66  rust him..*/.#if
15c30 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44  def SQLITE_MIXED
15c40 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
15c50 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66  OAT.static u64 f
15c60 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29  loatSwap(u64 in)
15c70 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  {.  union {.    
15c80 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69  u64 r;.    u32 i
15c90 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33  [2];.  } u;.  u3
15ca0 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e  2 t;..  u.r = in
15cb0 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a  ;.  t = u.i[0];.
15cc0 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31    u.i[0] = u.i[1
15cd0 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b  ];.  u.i[1] = t;
15ce0 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d  .  return u.r;.}
15cf0 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
15d00 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
15d10 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70  )  X = floatSwap
15d20 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
15d30 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
15d40 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69  anFloat(X).#endi
15d50 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  f../*.** Write t
15d60 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61  he serialized da
15d70 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20  ta blob for the 
15d80 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
15d90 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75  pMem into .** bu
15da0 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  f. It is assumed
15db0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
15dc0 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73   has allocated s
15dd0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e  ufficient space.
15de0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
15df0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
15e00 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42  ritten..**.** nB
15e10 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  uf is the amount
15e20 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69   of space left i
15e30 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61  n buf[].  The ca
15e40 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
15e50 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63  ble.** for alloc
15e60 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61  ating enough spa
15e70 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68  ce to buf[] to h
15e80 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66  old the entire f
15e90 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a  ield, exclusive.
15ea0 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e  ** of the pMem->
15eb0 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f  u.nZero bytes fo
15ec0 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c  r a MEM_Zero val
15ed0 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ue..**.** Return
15ee0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
15ef0 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72  ytes actually wr
15f00 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d  itten into buf[]
15f10 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  .  The number.**
15f20 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
15f30 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
15f40 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e  l is included in
15f50 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
15f60 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f  e only.** if tho
15f70 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65  se bytes were ze
15f80 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a  roed in buf[]..*
15f90 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  / .u32 sqlite3Vd
15fa0 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a  beSerialPut(u8 *
15fb0 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20  buf, Mem *pMem, 
15fc0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
15fd0 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20  {.  u32 len;..  
15fe0 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52  /* Integer and R
15ff0 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  eal */.  if( ser
16000 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73  ial_type<=7 && s
16010 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a  erial_type>0 ){.
16020 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75      u64 v;.    u
16030 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65  32 i;.    if( se
16040 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
16050 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
16060 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28  zeof(v)==sizeof(
16070 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20  pMem->r) );.    
16080 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d    memcpy(&v, &pM
16090 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29  em->r, sizeof(v)
160a0 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  );.      swapMix
160b0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29  edEndianFloat(v)
160c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
160d0 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69     v = pMem->u.i
160e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
160f0 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62  = i = sqlite3Vdb
16100 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
16110 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
16120 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20   while( i-- ){. 
16130 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 75       buf[i] = (u
16140 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20  8)(v&0xFF);.    
16150 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d    v >>= 8;.    }
16160 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
16170 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e  .  }..  /* Strin
16180 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69  g or blob */.  i
16190 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
161a0 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  12 ){.    assert
161b0 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d  ( pMem->n + ((pM
161c0 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
161d0 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a  Zero)?pMem->u.nZ
161e0 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20  ero:0).         
161f0 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69      == (int)sqli
16200 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
16210 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
16220 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  ) );.    len = p
16230 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63  Mem->n;.    memc
16240 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
16250 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72   len);.    retur
16260 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
16270 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e   NULL or constan
16280 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72  ts 0 or 1 */.  r
16290 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49  eturn 0;.}../* I
162a0 6e 70 75 74 20 22 78 22 20 69 73 20 61 20 73 65  nput "x" is a se
162b0 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e  quence of unsign
162c0 65 64 20 63 68 61 72 61 63 74 65 72 73 20 74 68  ed characters th
162d0 61 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a  at represent a.*
162e0 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  * big-endian int
162f0 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  eger.  Return th
16300 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74  e equivalent nat
16310 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23  ive integer.*/.#
16320 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f  define ONE_BYTE_
16330 49 4e 54 28 78 29 20 20 20 20 28 28 69 38 29 28  INT(x)    ((i8)(
16340 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54  x)[0]).#define T
16350 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  WO_BYTE_INT(x)  
16360 20 20 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b    (256*(i8)((x)[
16370 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66  0])|(x)[1]).#def
16380 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49  ine THREE_BYTE_I
16390 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a 28 69  NT(x)  (65536*(i
163a0 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b  8)((x)[0])|((x)[
163b0 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23  1]<<8)|(x)[2]).#
163c0 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45  define FOUR_BYTE
163d0 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75 33 32  _UINT(x)  (((u32
163e0 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78  )(x)[0]<<24)|((x
163f0 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32  )[1]<<16)|((x)[2
16400 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f  ]<<8)|(x)[3])../
16410 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
16420 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70   the data blob p
16430 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66  ointed to by buf
16440 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20   as serial type 
16450 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61  serial_type.** a
16460 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
16470 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65  ult in pMem.  Re
16480 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
16490 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a  of bytes read..*
164a0 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  / .u32 sqlite3Vd
164b0 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63  beSerialGet(.  c
164c0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
164d0 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
164e0 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
164f0 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
16500 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
16510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16520 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
16530 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
16540 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
16550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16560 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
16570 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
16580 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 3b  o */.){.  u64 x;
16590 0a 20 20 75 33 32 20 79 3b 0a 20 20 73 77 69 74  .  u32 y;.  swit
165a0 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
165b0 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20  ){.    case 10: 
165c0 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
165d0 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
165e0 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f      case 11:   /
165f0 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
16600 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
16610 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e   case 0: {  /* N
16620 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ULL */.      pMe
16630 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
16640 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ull;.      break
16650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
16660 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20   1: { /* 1-byte 
16670 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
16680 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
16690 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  i = ONE_BYTE_INT
166a0 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
166b0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
166c0 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
166d0 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
166e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
166f0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
16700 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65  e 2: { /* 2-byte
16710 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
16720 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
16730 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e  .i = TWO_BYTE_IN
16740 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
16750 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
16760 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
16770 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
16780 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
16790 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   2;.    }.    ca
167a0 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
167b0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
167c0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
167d0 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45  u.i = THREE_BYTE
167e0 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
167f0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
16800 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
16810 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
16820 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
16830 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 3;.    }.   
16840 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d   case 4: { /* 4-
16850 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
16860 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d  ger */.      y =
16870 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
16880 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
16890 2d 3e 75 2e 69 20 3d 20 28 69 36 34 29 2a 28 69  ->u.i = (i64)*(i
168a0 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 70 4d  nt*)&y;.      pM
168b0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
168c0 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
168d0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
168e0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
168f0 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   4;.    }.    ca
16900 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
16910 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
16920 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
16930 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  u.i = FOUR_BYTE_
16940 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28  UINT(buf+2) + ((
16950 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f  (i64)1)<<32)*TWO
16960 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
16970 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
16980 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
16990 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
169a0 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
169b0 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20    return 6;.    
169c0 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20  }.    case 6:   
169d0 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
169e0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
169f0 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45  case 7: { /* IEE
16a00 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  E floating point
16a10 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
16a20 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66  (NDEBUG) && !def
16a30 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
16a40 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
16a50 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79  .      /* Verify
16a60 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61   that integers a
16a70 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  nd floating poin
16a80 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65  t values use the
16a90 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62   same.      ** b
16aa0 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20  yte order.  Or, 
16ab0 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d  that if SQLITE_M
16ac0 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
16ad0 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20  T_FLOAT is.     
16ae0 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74   ** defined that
16af0 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
16b00 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65   point values re
16b10 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20  ally are mixed. 
16b20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a       ** endian..
16b30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
16b40 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20  tatic const u64 
16b50 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66  t1 = ((u64)0x3ff
16b60 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20  00000)<<32;.    
16b70 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64    static const d
16b80 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a  ouble r1 = 1.0;.
16b90 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74        u64 t2 = t
16ba0 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  1;.      swapMix
16bb0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32  edEndianFloat(t2
16bc0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16bd0 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a   sizeof(r1)==siz
16be0 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d  eof(t2) && memcm
16bf0 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65  p(&r1, &t2, size
16c00 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65  of(r1))==0 );.#e
16c10 6e 64 69 66 0a 20 20 20 20 20 20 78 20 3d 20 46  ndif.      x = F
16c20 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
16c30 66 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f  f);.      y = FO
16c40 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
16c50 2b 34 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  +4);.      x = (
16c60 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20  x<<32) | y;.    
16c70 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
16c80 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  e==6 ){.        
16c90 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
16ca0 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70  4*)&x;.        p
16cb0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
16cc0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 20 20 74 65  _Int;.        te
16cd0 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
16ce0 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c  i<0 );.      }el
16cf0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
16d00 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38  rt( sizeof(x)==8
16d10 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d   && sizeof(pMem-
16d20 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20  >r)==8 );.      
16d30 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
16d40 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20  nFloat(x);.     
16d50 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d     memcpy(&pMem-
16d60 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  >r, &x, sizeof(x
16d70 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  ));.        pMem
16d80 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  ->flags = sqlite
16d90 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20  3IsNaN(pMem->r) 
16da0 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d  ? MEM_Null : MEM
16db0 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  _Real;.      }. 
16dc0 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20       return 8;. 
16dd0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
16de0 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30      /* Integer 0
16df0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20   */.    case 9: 
16e00 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20  {  /* Integer 1 
16e10 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
16e20 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  .i = serial_type
16e30 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  -8;.      pMem->
16e40 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
16e50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
16e60 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
16e70 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74  lt: {.      stat
16e80 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c  ic const u16 aFl
16e90 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f  ag[] = { MEM_Blo
16ea0 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d  b|MEM_Ephem, MEM
16eb0 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d  _Str|MEM_Ephem }
16ec0 3b 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20  ;.      u32 len 
16ed0 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
16ee0 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d  2)/2;.      pMem
16ef0 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
16f00 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
16f10 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d   = len;.      pM
16f20 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20  em->xDel = 0;.  
16f30 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
16f40 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74  = aFlag[serial_t
16f50 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65  ype&1];.      re
16f60 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a  turn len;.    }.
16f70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
16f80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
16f90 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
16fa0 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63   allocate suffic
16fb0 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61  ient space for a
16fc0 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  n UnpackedRecord
16fd0 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61  .** structure la
16fe0 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65  rge enough to be
16ff0 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74   used with sqlit
17000 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
17010 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66  ck() if.** the f
17020 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
17030 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65   a pointer to Ke
17040 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
17050 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20  pKeyInfo..**.** 
17060 54 68 65 20 73 70 61 63 65 20 69 73 20 65 69 74  The space is eit
17070 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  her allocated us
17080 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  ing sqlite3DbMal
17090 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d  locRaw() or from
170a0 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75   within.** the u
170b0 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20  naligned buffer 
170c0 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73  passed via the s
170d0 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20  econd and third 
170e0 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75  arguments (presu
170f0 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73  mably.** stack s
17100 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f  pace). If the fo
17110 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72  rmer, then *ppFr
17120 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  ee is set to a p
17130 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75  ointer that shou
17140 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61  ld.** be eventua
17150 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 68 65  lly freed by the
17160 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71   caller using sq
17170 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f  lite3DbFree(). O
17180 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c  r, if the .** al
17190 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66  location comes f
171a0 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73  rom the pSpace/s
171b0 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a  zSpace buffer, *
171c0 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f  ppFree is set to
171d0 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20   NULL.** before 
171e0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
171f0 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
17200 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
17210 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e   returned..*/.Un
17220 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71  packedRecord *sq
17230 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e  lite3VdbeAllocUn
17240 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20  packedRecord(.  
17250 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
17260 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
17270 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
17280 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  f the record */.
17290 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20    char *pSpace, 
172a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172b0 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73    /* Unaligned s
172c0 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a  pace available *
172d0 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c  /.  int szSpace,
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172f0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70      /* Size of p
17300 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73  Space[] in bytes
17310 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46   */.  char **ppF
17320 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
17330 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61        /* OUT: Ca
17340 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65  ller should free
17350 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f   this pointer */
17360 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  .){.  UnpackedRe
17370 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20  cord *p;        
17380 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65        /* Unpacke
17390 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75  d record to retu
173a0 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66  rn */.  int nOff
173b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
173c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
173d0 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e  ment pSpace by n
173e0 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20  Off to align it 
173f0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
17400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17410 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17420 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
17430 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a   for *p */..  /*
17440 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66   We want to shif
17450 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53  t the pointer pS
17460 70 61 63 65 20 75 70 20 73 75 63 68 20 74 68 61  pace up such tha
17470 74 20 69 74 20 69 73 20 38 2d 62 79 74 65 20 61  t it is 8-byte a
17480 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75  ligned..  ** Thu
17490 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61  s, we need to ca
174a0 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c  lculate a value,
174b0 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30   nOff, between 0
174c0 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74   and 7, to shift
174d0 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49   .  ** it by.  I
174e0 66 20 70 53 70 61 63 65 20 69 73 20 61 6c 72 65  f pSpace is alre
174f0 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e  ady 8-byte align
17500 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20  ed, nOff should 
17510 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20  be zero..  */.  
17520 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c  nOff = (8 - (SQL
17530 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
17540 53 70 61 63 65 29 20 26 20 37 29 29 20 26 20 37  Space) & 7)) & 7
17550 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
17560 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  of(pKeyInfo->nFi
17570 65 6c 64 29 3d 3d 32 20 29 3b 0a 20 20 6e 42 79  eld)==2 );.  nBy
17580 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
17590 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
175a0 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
175b0 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
175c0 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42  eld+1);.  if( nB
175d0 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66  yte>szSpace+nOff
175e0 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70   ){.    p = (Unp
175f0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71  ackedRecord *)sq
17600 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
17610 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
17620 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72  Byte);.    *ppFr
17630 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a  ee = (char *)p;.
17640 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65 74      if( !p ) ret
17650 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
17660 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
17670 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65  dRecord*)&pSpace
17680 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46  [nOff];.    *ppF
17690 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ree = 0;.  }..  
176a0 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29  p->aMem = (Mem*)
176b0 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
176c0 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
176d0 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61  edRecord))];.  a
176e0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
176f0 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
17700 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20  ;.  p->pKeyInfo 
17710 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d  = pKeyInfo;.  p-
17720 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e  >nField = pKeyIn
17730 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a  fo->nField + 1;.
17740 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
17750 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
17760 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e  Key-byte encodin
17770 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e  g of a record in
17780 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74   pKey[], populat
17790 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b  e the .** Unpack
177a0 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
177b0 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  re indicated by 
177c0 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
177d0 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ent with the.** 
177e0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
177f0 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a  decoded record..
17800 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
17810 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
17820 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  (.  KeyInfo *pKe
17830 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e  yInfo,     /* In
17840 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
17850 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61  the record forma
17860 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  t */.  int nKey,
17870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17880 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e   Size of the bin
17890 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
178a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
178b0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69  ,      /* The bi
178c0 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
178d0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
178e0 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c  *p      /* Popul
178f0 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75  ate this structu
17900 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  re before return
17910 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ing. */.){.  con
17920 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
17930 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
17940 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
17950 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a  pKey;.  int d; .
17960 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20    u32 idx;      
17970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17980 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61    /* Offset in a
17990 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72  Key[] to read fr
179a0 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20  om */.  u16 u;  
179b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179c0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
179d0 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
179e0 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   */.  u32 szHdr;
179f0 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70  .  Mem *pMem = p
17a00 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65  ->aMem;..  p->de
17a10 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20  fault_rc = 0;.  
17a20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
17a30 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65  TE_ALIGNMENT(pMe
17a40 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65  m) );.  idx = ge
17a50 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
17a60 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a  szHdr);.  d = sz
17a70 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20  Hdr;.  u = 0;.  
17a80 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
17a90 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20   && u<p->nField 
17aa0 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20  && d<=nKey ){.  
17ab0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
17ac0 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67  e;..    idx += g
17ad0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
17ae0 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79  [idx], serial_ty
17af0 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  pe);.    pMem->e
17b00 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
17b10 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62  nc;.    pMem->db
17b20 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
17b30 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c  .    /* pMem->fl
17b40 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69  ags = 0; // sqli
17b50 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
17b60 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73  () will set this
17b70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70   for us */.    p
17b80 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  Mem->zMalloc = 0
17b90 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74  ;.    d += sqlit
17ba0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
17bb0 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c  &aKey[d], serial
17bc0 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20  _type, pMem);.  
17bd0 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b    pMem++;.    u+
17be0 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  +;.  }.  assert(
17bf0 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46   u<=pKeyInfo->nF
17c00 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d  ield + 1 );.  p-
17c10 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a  >nField = u;.}..
17c20 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
17c30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
17c40 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77  tion compares tw
17c50 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  o index or table
17c60 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20   record keys in 
17c70 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20  the same way.** 
17c80 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  as the sqlite3Vd
17c90 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
17ca0 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b  ) routine. Unlik
17cb0 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
17cc0 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66  are(),.** this f
17cd0 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c  unction deserial
17ce0 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65  izes and compare
17cf0 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74  s values using t
17d00 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  he.** sqlite3Vdb
17d10 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64  eSerialGet() and
17d20 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
17d30 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  re() functions. 
17d40 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e  It is used.** in
17d50 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
17d60 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ents to ensure t
17d70 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65  hat the optimize
17d80 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c  d code in.** sql
17d90 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
17da0 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e 73 20  mpare() returns 
17db0 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 68 65  results with the
17dc0 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65  se two primitive
17dd0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
17de0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
17df0 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e  reDebug(.  int n
17e00 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
17e10 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
17e20 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
17e30 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
17e40 70 50 4b 65 79 32 20 20 2f 2a 20 52 69 67 68 74  pPKey2  /* Right
17e50 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 75 33 32   key */.){.  u32
17e60 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
17e70 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
17e80 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
17e90 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
17ea0 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
17eb0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
17ec0 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
17ed0 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20   header element 
17ee0 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b  */.  u32 szHdr1;
17ef0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17f00 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65  r of bytes in he
17f10 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20  ader */.  int i 
17f20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
17f30 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  0;.  const unsig
17f40 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
17f50 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
17f60 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
17f70 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
17f80 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  nfo;.  Mem mem1;
17f90 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ..  pKeyInfo = p
17fa0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b  PKey2->pKeyInfo;
17fb0 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b  .  mem1.enc = pK
17fc0 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d  eyInfo->enc;.  m
17fd0 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
17fe0 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31  o->db;.  /* mem1
17ff0 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20  .flags = 0;  // 
18000 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  Will be initiali
18010 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64  zed by sqlite3Vd
18020 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f  beSerialGet() */
18030 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d  .  VVA_ONLY( mem
18040 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29  1.zMalloc = 0; )
18050 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20   /* Only needed 
18060 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74  by assert() stat
18070 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20  ements */..  /* 
18080 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f  Compilers may co
18090 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31  mplain that mem1
180a0 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61  .u.i is potentia
180b0 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  lly uninitialize
180c0 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64  d..  ** We could
180d0 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20   initialize it, 
180e0 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74  as shown here, t
180f0 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20  o silence those 
18100 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a  complaints..  **
18110 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65   But in fact, me
18120 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65  m1.u.i will neve
18130 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73  r actually be us
18140 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ed uninitialized
18150 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a  , and doing .  *
18160 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72  * the unnecessar
18170 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  y initialization
18180 20 68 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c   has a measurabl
18190 65 20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f  e negative perfo
181a0 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61  rmance.  ** impa
181b0 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72  ct, since this r
181c0 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65 72 79  outine is a very
181d0 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41   high runner.  A
181e0 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65  nd so, we choose
181f0 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20  .  ** to ignore 
18200 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  the compiler war
18210 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20  nings and leave 
18220 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e  this variable un
18230 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
18240 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69  /.  /*  mem1.u.i
18250 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65   = 0;  // not ne
18260 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69  eded, here to si
18270 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77  lence compiler w
18280 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69  arning */.  .  i
18290 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
182a0 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
182b0 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b  ;.  d1 = szHdr1;
182c0 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
182d0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79  nfo->nField+pKey
182e0 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70  Info->nXField>=p
182f0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c  PKey2->nField ||
18300 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
18310 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
18320 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  o->aSortOrder!=0
18330 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
18340 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30  eyInfo->nField>0
18350 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
18360 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f  x1<=szHdr1 || CO
18370 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f  RRUPT_DB );.  do
18380 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
18390 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20  _type1;..    /* 
183a0 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20  Read the serial 
183b0 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65  types for the ne
183c0 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61  xt element in ea
183d0 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69  ch key. */.    i
183e0 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  dx1 += getVarint
183f0 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20  32( aKey1+idx1, 
18400 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a  serial_type1 );.
18410 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
18420 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f  hat there is eno
18430 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 72 65  ugh key space re
18440 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64  maining to avoid
18450 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72  .    ** a buffer
18460 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65 20   overread.  The 
18470 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31  "d1+serial_type1
18480 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 69 6f  +2" subexpressio
18490 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c  n will.    ** al
184a0 77 61 79 73 20 62 65 20 67 72 65 61 74 65 72 20  ways be greater 
184b0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
184c0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72   the amount of r
184d0 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 61 63  equired key spac
184e0 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68  e..    ** Use th
184f0 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e  at approximation
18500 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f   to avoid the mo
18510 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c  re expensive cal
18520 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
18530 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
18540 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f  eLen() in the co
18550 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a  mmon case..    *
18560 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65 72  /.    if( d1+ser
18570 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32  ial_type1+2>(u32
18580 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64  )nKey1.     && d
18590 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  1+sqlite3VdbeSer
185a0 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
185b0 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b  l_type1)>(u32)nK
185c0 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ey1 .    ){.    
185d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
185e0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
185f0 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  he values to be 
18600 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  compared..    */
18610 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
18620 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
18630 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
18640 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
18650 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  ;..    /* Do the
18660 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
18670 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
18680 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d  te3MemCompare(&m
18690 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d  em1, &pPKey2->aM
186a0 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d  em[i], pKeyInfo-
186b0 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20  >aColl[i]);.    
186c0 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
186d0 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e     assert( mem1.
186e0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f  zMalloc==0 );  /
186f0 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65  * See comment be
18700 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  low */.      if(
18710 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
18720 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20  Order[i] ){.    
18730 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f      rc = -rc;  /
18740 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73  * Invert the res
18750 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72  ult for DESC sor
18760 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20  t order. */.    
18770 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
18780 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
18790 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64  ++;.  }while( id
187a0 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70  x1<szHdr1 && i<p
187b0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b  PKey2->nField );
187c0 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
187d0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
187e0 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
187f0 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
18800 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
18810 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
18820 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
18830 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
18840 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
18850 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
18860 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
18870 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
18880 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20  e(&mem1)..  */. 
18890 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d   assert( mem1.zM
188a0 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
188b0 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
188c0 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
188d0 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
188e0 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
188f0 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
18900 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
18910 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
18920 65 74 75 72 6e 20 74 68 65 20 74 68 65 20 64 65  eturn the the de
18930 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61  fault_rc.  ** va
18940 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  lue.  */.  retur
18950 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
18960 74 5f 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  t_rc;.}.#endif..
18970 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d  /*.** Both *pMem
18980 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e  1 and *pMem2 con
18990 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c 75  tain string valu
189a0 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20  es. Compare the 
189b0 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73  two values.** us
189c0 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ing the collatio
189d0 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  n sequence pColl
189e0 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74 75  . As usual, retu
189f0 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c 20  rn a negative , 
18a00 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
18a10 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70 4d  ive value if *pM
18a20 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  em1 is less than
18a30 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67 72  , equal to or gr
18a40 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a  eater than .** *
18a50 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69 76  pMem2, respectiv
18a60 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20  ely. Similar in 
18a70 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d 20  spirit to "rc = 
18a80 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65  (*pMem1) - (*pMe
18a90 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  m2);"..*/.static
18aa0 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72 65   int vdbeCompare
18ab0 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e  MemString(.  con
18ac0 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20  st Mem *pMem1,. 
18ad0 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
18ae0 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53  2,.  const CollS
18af0 65 71 20 2a 70 43 6f 6c 6c 0a 29 7b 0a 20 20 69  eq *pColl.){.  i
18b00 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70  f( pMem1->enc==p
18b10 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20  Coll->enc ){.   
18b20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20   /* The strings 
18b30 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74  are already in t
18b40 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64  he correct encod
18b50 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20  ing.  Call the. 
18b60 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
18b70 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63  n function direc
18b80 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  tly */.    retur
18b90 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  n pColl->xCmp(pC
18ba0 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31  oll->pUser,pMem1
18bb0 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65  ->n,pMem1->z,pMe
18bc0 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b  m2->n,pMem2->z);
18bd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
18be0 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20  t rc;.    const 
18bf0 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20  void *v1, *v2;. 
18c00 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20     int n1, n2;. 
18c10 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d     Mem c1;.    M
18c20 65 6d 20 63 32 3b 0a 20 20 20 20 6d 65 6d 73 65  em c2;.    memse
18c30 74 28 26 63 31 2c 20 30 2c 20 73 69 7a 65 6f 66  t(&c1, 0, sizeof
18c40 28 63 31 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  (c1));.    memse
18c50 74 28 26 63 32 2c 20 30 2c 20 73 69 7a 65 6f 66  t(&c2, 0, sizeof
18c60 28 63 32 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  (c2));.    sqlit
18c70 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
18c80 43 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c  Copy(&c1, pMem1,
18c90 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20   MEM_Ephem);.   
18ca0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
18cb0 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20  hallowCopy(&c2, 
18cc0 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem2, MEM_Ephem
18cd0 29 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69  );.    v1 = sqli
18ce0 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71  te3ValueText((sq
18cf0 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31  lite3_value*)&c1
18d00 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
18d10 20 20 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20     n1 = v1==0 ? 
18d20 30 20 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32  0 : c1.n;.    v2
18d30 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
18d40 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ext((sqlite3_val
18d50 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e  ue*)&c2, pColl->
18d60 65 6e 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76  enc);.    n2 = v
18d70 32 3d 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b  2==0 ? 0 : c2.n;
18d80 0a 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d  .    rc = pColl-
18d90 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
18da0 65 72 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20  er, n1, v1, n2, 
18db0 76 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  v2);.    sqlite3
18dc0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
18dd0 63 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c1);.    sqlite3
18de0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
18df0 63 32 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  c2);.    return 
18e00 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rc;.  }.}../*.**
18e10 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c   Compare the val
18e20 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79  ues contained by
18e30 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20   the two memory 
18e40 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67  cells, returning
18e50 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  .** negative, ze
18e60 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ro or positive i
18e70 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20  f pMem1 is less 
18e80 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
18e90 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68  or greater.** th
18ea0 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e  an pMem2. Sortin
18eb0 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27  g order is NULL'
18ec0 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65  s first, followe
18ed0 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e  d by numbers (in
18ee0 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65  tegers.** and re
18ef0 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65  als) sorted nume
18f00 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65  rically, followe
18f10 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 72 65  d by text ordere
18f20 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69  d by the collati
18f30 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70  ng.** sequence p
18f40 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79  Coll and finally
18f50 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20   blob's ordered 
18f60 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a  by memcmp()..**.
18f70 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75  ** Two NULL valu
18f80 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  es are considere
18f90 64 20 65 71 75 61 6c 20 62 79 20 74 68 69 73 20  d equal by this 
18fa0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
18fb0 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
18fc0 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  re(const Mem *pM
18fd0 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  em1, const Mem *
18fe0 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c  pMem2, const Col
18ff0 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20  lSeq *pColl){.  
19000 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 66 31  int rc;.  int f1
19010 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62  , f2;.  int comb
19020 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66  ined_flags;..  f
19030 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73  1 = pMem1->flags
19040 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e  ;.  f2 = pMem2->
19050 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65  flags;.  combine
19060 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b  d_flags = f1|f2;
19070 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62  .  assert( (comb
19080 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d  ined_flags & MEM
19090 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20  _RowSet)==0 );. 
190a0 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c  .  /* If one val
190b0 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69  ue is NULL, it i
190c0 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
190d0 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76  other. If both v
190e0 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e  alues.  ** are N
190f0 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20  ULL, return 0.. 
19100 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
19110 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  ed_flags&MEM_Nul
19120 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
19130 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20  (f2&MEM_Null) - 
19140 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  (f1&MEM_Null);. 
19150 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20   }..  /* If one 
19160 76 61 6c 75 65 20 69 73 20 61 20 6e 75 6d 62 65  value is a numbe
19170 72 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20  r and the other 
19180 69 73 20 6e 6f 74 2c 20 74 68 65 20 6e 75 6d 62  is not, the numb
19190 65 72 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a  er is less..  **
191a0 20 49 66 20 62 6f 74 68 20 61 72 65 20 6e 75 6d   If both are num
191b0 62 65 72 73 2c 20 63 6f 6d 70 61 72 65 20 61 73  bers, compare as
191c0 20 72 65 61 6c 73 20 69 66 20 6f 6e 65 20 69 73   reals if one is
191d0 20 61 20 72 65 61 6c 2c 20 6f 72 20 61 73 20 69   a real, or as i
191e0 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20 69 66 20  ntegers.  ** if 
191f0 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65 20  both values are 
19200 69 6e 74 65 67 65 72 73 2e 0a 20 20 2a 2f 0a 20  integers..  */. 
19210 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
19220 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  ags&(MEM_Int|MEM
19230 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 64 6f  _Real) ){.    do
19240 75 62 6c 65 20 72 31 2c 20 72 32 3b 0a 20 20 20  uble r1, r2;.   
19250 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20   if( (f1 & f2 & 
19260 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20  MEM_Int)!=0 ){. 
19270 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
19280 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69  u.i < pMem2->u.i
19290 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
192a0 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
192b0 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20  .i > pMem2->u.i 
192c0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
192d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
192e0 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45  }.    if( (f1&ME
192f0 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20  M_Real)!=0 ){.  
19300 20 20 20 20 72 31 20 3d 20 70 4d 65 6d 31 2d 3e      r1 = pMem1->
19310 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r;.    }else if(
19320 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30   (f1&MEM_Int)!=0
19330 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 28   ){.      r1 = (
19340 64 6f 75 62 6c 65 29 70 4d 65 6d 31 2d 3e 75 2e  double)pMem1->u.
19350 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
19360 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
19370 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 26    }.    if( (f2&
19380 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
19390 20 20 20 20 20 20 72 32 20 3d 20 70 4d 65 6d 32        r2 = pMem2
193a0 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ->r;.    }else i
193b0 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21  f( (f2&MEM_Int)!
193c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d  =0 ){.      r2 =
193d0 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 32 2d 3e   (double)pMem2->
193e0 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  u.i;.    }else{.
193f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
19400 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
19410 31 3c 72 32 20 29 20 72 65 74 75 72 6e 20 2d 31  1<r2 ) return -1
19420 3b 0a 20 20 20 20 69 66 28 20 72 31 3e 72 32 20  ;.    if( r1>r2 
19430 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
19440 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
19450 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
19460 20 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64   is a string and
19470 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 61 20   the other is a 
19480 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67  blob, the string
19490 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49   is less..  ** I
194a0 66 20 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e  f both are strin
194b0 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e  gs, compare usin
194c0 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  g the collating 
194d0 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  functions..  */.
194e0 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66    if( combined_f
194f0 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a  lags&MEM_Str ){.
19500 20 20 20 20 69 66 28 20 28 66 31 20 26 20 4d 45      if( (f1 & ME
19510 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20  M_Str)==0 ){.   
19520 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
19530 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20 26   }.    if( (f2 &
19540 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a   MEM_Str)==0 ){.
19550 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
19560 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
19570 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  rt( pMem1->enc==
19580 70 4d 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20 20  pMem2->enc );.  
19590 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d    assert( pMem1-
195a0 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
195b0 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  8 || .          
195c0 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51    pMem1->enc==SQ
195d0 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20  LITE_UTF16LE || 
195e0 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
195f0 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20  TE_UTF16BE );.. 
19600 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
19610 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73  ion sequence mus
19620 74 20 62 65 20 64 65 66 69 6e 65 64 20 61 74 20  t be defined at 
19630 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e  this point, even
19640 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75   if.    ** the u
19650 73 65 72 20 64 65 6c 65 74 65 73 20 74 68 65 20  ser deletes the 
19660 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
19670 63 65 20 61 66 74 65 72 20 74 68 65 20 76 64 62  ce after the vdb
19680 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20  e program is.   
19690 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68   ** compiled (th
196a0 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79  is was not alway
196b0 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20  s the case)..   
196c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
196d0 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d  !pColl || pColl-
196e0 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66  >xCmp );..    if
196f0 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
19700 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70   return vdbeComp
19710 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65  areMemString(pMe
19720 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c  m1, pMem2, pColl
19730 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
19740 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  If a NULL pointe
19750 72 20 77 61 73 20 70 61 73 73 65 64 20 61 73 20  r was passed as 
19760 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63  the collate func
19770 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75  tion, fall throu
19780 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  gh.    ** to the
19790 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75   blob case and u
197a0 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f  se memcmp().  */
197b0 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68  .  }. .  /* Both
197c0 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
197d0 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20  blobs.  Compare 
197e0 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20  using memcmp(). 
197f0 20 2a 2f 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d   */.  rc = memcm
19800 70 28 70 4d 65 6d 31 2d 3e 7a 2c 20 70 4d 65 6d  p(pMem1->z, pMem
19810 32 2d 3e 7a 2c 20 28 70 4d 65 6d 31 2d 3e 6e 3e  2->z, (pMem1->n>
19820 70 4d 65 6d 32 2d 3e 6e 29 3f 70 4d 65 6d 32 2d  pMem2->n)?pMem2-
19830 3e 6e 3a 70 4d 65 6d 31 2d 3e 6e 29 3b 0a 20 20  >n:pMem1->n);.  
19840 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
19850 20 72 63 20 3d 20 70 4d 65 6d 31 2d 3e 6e 20 2d   rc = pMem1->n -
19860 20 70 4d 65 6d 32 2d 3e 6e 3b 0a 20 20 7d 0a 20   pMem2->n;.  }. 
19870 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
19880 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
19890 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
198a0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
198b0 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70   is a serial-typ
198c0 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73  e that.** corres
198d0 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65  ponds to an inte
198e0 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73  ger - all values
198f0 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39   between 1 and 9
19900 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65   inclusive .** e
19910 78 63 65 70 74 20 37 2e 20 54 68 65 20 73 65 63  xcept 7. The sec
19920 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ond points to a 
19930 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
19940 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  g an integer val
19950 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64  ue.** serialized
19960 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65   according to se
19970 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20  rial_type. This 
19980 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61  function deseria
19990 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74  lizes.** and ret
199a0 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a  urns the value..
199b0 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76 64  */.static i64 vd
199c0 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e  beRecordDecodeIn
199d0 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  t(u32 serial_typ
199e0 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  e, const u8 *aKe
199f0 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61  y){.  u32 y;.  a
19a00 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
19a10 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70  B || (serial_typ
19a20 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74  e>=1 && serial_t
19a30 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c  ype<=9 && serial
19a40 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73  _type!=7) );.  s
19a50 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
19a60 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30  pe ){.    case 0
19a70 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20  :.    case 1:.  
19a80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
19a90 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
19aa0 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42      return ONE_B
19ab0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
19ac0 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20     case 2:.     
19ad0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
19ae0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
19af0 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45   return TWO_BYTE
19b00 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
19b10 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65  case 3:.      te
19b20 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
19b30 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
19b40 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f  turn THREE_BYTE_
19b50 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
19b60 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74  ase 4: {.      t
19b70 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
19b80 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79  &0x80 );.      y
19b90 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
19ba0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72  T(aKey);.      r
19bb0 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74  eturn (i64)*(int
19bc0 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  *)&y;.    }.    
19bd0 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20  case 5: {.      
19be0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
19bf0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
19c00 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45  return FOUR_BYTE
19c10 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20  _UINT(aKey+2) + 
19c20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54  (((i64)1)<<32)*T
19c30 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
19c40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
19c50 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34  e 6: {.      u64
19c60 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
19c70 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
19c80 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
19c90 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
19ca0 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46   x = (x<<32) | F
19cb0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
19cc0 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74  ey+4);.      ret
19cd0 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29  urn (i64)*(i64*)
19ce0 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  &x;.    }.  }.. 
19cf0 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
19d00 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a  type - 8);.}../*
19d10 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
19d20 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
19d30 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
19d40 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a   index records.*
19d50 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b  * specified by {
19d60 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
19d70 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65  d pPKey2.  It re
19d80 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65  turns a negative
19d90 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
19da0 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66  itive integer if
19db0 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
19dc0 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
19dd0 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
19de0 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65   key2.  The {nKe
19df0 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d  y1, pKey1} key m
19e00 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a  ust be a blob.**
19e10 20 63 72 65 61 74 65 64 20 62 79 20 74 68 20 4f   created by th O
19e20 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
19e30 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
19e40 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20    The pPKey2.** 
19e50 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61  key must be a pa
19e60 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73  rsed key such as
19e70 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
19e80 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72  * sqlite3VdbePar
19e90 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  seRecord..**.** 
19ea0 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b 69  If argument bSki
19eb0 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69  p is non-zero, i
19ec0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
19ed0 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
19ee0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74 65   already.** dete
19ef0 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20  rmined that the 
19f00 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20  first fields of 
19f10 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75  the keys are equ
19f20 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61  al..**.** Key1 a
19f30 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68  nd Key2 do not h
19f40 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ave to contain t
19f50 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
19f60 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c  f fields. If all
19f70 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74   .** fields that
19f80 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68 20   appear in both 
19f90 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c 20  keys are equal, 
19fa0 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  then pPKey2->def
19fb0 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72  ault_rc is .** r
19fc0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
19fd0 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
19fe0 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76 65  ption is discove
19ff0 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32 2d  red, set pPKey2-
1a000 3e 69 73 43 6f 72 72 75 70 74 20 74 6f 20 6e 6f  >isCorrupt to no
1a010 6e 2d 7a 65 72 6f 0a 2a 2a 20 61 6e 64 20 72 65  n-zero.** and re
1a020 74 75 72 6e 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  turn 0..*/.int s
1a030 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1a040 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e  Compare(.  int n
1a050 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1a060 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65   *pKey1,   /* Le
1a070 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
1a080 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1a090 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  y2,         /* R
1a0a0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ight key */.  in
1a0b0 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20  t bSkip         
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a0d0 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74   If true, skip t
1a0e0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a  he first field *
1a0f0 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20  /.){.  u32 d1;  
1a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a110 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1a120 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1a130 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
1a140 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a160 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1a170 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f  of next field to
1a180 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33   compare */.  u3
1a190 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20  2 szHdr1;       
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a1b0 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
1a1c0 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20  header in bytes 
1a1d0 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
1a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1f0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
1a200 66 20 66 69 72 73 74 20 74 79 70 65 20 69 6e 20  f first type in 
1a210 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
1a220 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
1a230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1a240 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  eturn value */. 
1a250 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b   Mem *pRhs = pPK
1a260 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20  ey2->aMem;      
1a270 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f   /* Next field o
1a280 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70  f pPKey2 to comp
1a290 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  are */.  KeyInfo
1a2a0 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b   *pKeyInfo = pPK
1a2b0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
1a2c0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1a2d0 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63  char *aKey1 = (c
1a2e0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1a2f0 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65  ar *)pKey1;.  Me
1a300 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66  m mem1;..  /* If
1a310 20 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20   bSkip is true, 
1a320 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
1a330 68 61 73 20 61 6c 72 65 61 64 79 20 64 65 74 65  has already dete
1a340 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20  rmined that the 
1a350 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65  first.  ** two e
1a360 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b  lements in the k
1a370 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46  eys are equal. F
1a380 69 78 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  ix the various s
1a390 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73  tack variables s
1a3a0 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73  o.  ** that this
1a3b0 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20   routine begins 
1a3c0 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65  comparing at the
1a3d0 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a   second field. *
1a3e0 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b  /.  if( bSkip ){
1a3f0 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20  .    u32 s1;.   
1a400 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56   idx1 = 1 + getV
1a410 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31  arint32(&aKey1[1
1a420 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64  ], s1);.    szHd
1a430 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20  r1 = aKey1[0];. 
1a440 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b     d1 = szHdr1 +
1a450 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1a460 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20  alTypeLen(s1);. 
1a470 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52     i = 1;.    pR
1a480 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hs++;.  }else{. 
1a490 20 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72     idx1 = getVar
1a4a0 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48  int32(aKey1, szH
1a4b0 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73  dr1);.    d1 = s
1a4c0 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64  zHdr1;.    if( d
1a4d0 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  1>(unsigned)nKey
1a4e0 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65  1 ){ .      pPKe
1a4f0 79 32 2d 3e 69 73 43 6f 72 72 75 70 74 20 3d 20  y2->isCorrupt = 
1a500 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
1a510 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72  PT_BKPT;.      r
1a520 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72  eturn 0;  /* Cor
1a530 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d  ruption */.    }
1a540 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a  .    i = 0;.  }.
1a550 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d  .  VVA_ONLY( mem
1a560 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29  1.zMalloc = 0; )
1a570 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20   /* Only needed 
1a580 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74  by assert() stat
1a590 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65  ements */.  asse
1a5a0 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1a5b0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b  Info->nField+pPK
1a5c0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
1a5d0 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e  XField>=pPKey2->
1a5e0 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c  nField .       |
1a5f0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1a600 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
1a610 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ->pKeyInfo->aSor
1a620 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61  tOrder!=0 );.  a
1a630 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1a640 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e  KeyInfo->nField>
1a650 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1a660 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43  dx1<=szHdr1 || C
1a670 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64  ORRUPT_DB );.  d
1a680 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  o{.    u32 seria
1a690 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20  l_type;..    /* 
1a6a0 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65  RHS is an intege
1a6b0 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68  r */.    if( pRh
1a6c0 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  s->flags & MEM_I
1a6d0 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69  nt ){.      seri
1a6e0 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
1a6f0 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73  idx1];.      tes
1a700 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
1a710 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
1a720 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
1a730 3d 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =12 ){.        r
1a740 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1a750 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1a760 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
1a770 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1a780 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
1a790 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
1a7a0 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68 73 20       double rhs 
1a7b0 3d 20 28 64 6f 75 62 6c 65 29 70 52 68 73 2d 3e  = (double)pRhs->
1a7c0 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  u.i;.        sql
1a7d0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1a7e0 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
1a7f0 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31  rial_type, &mem1
1a800 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  );.        if( m
1a810 65 6d 31 2e 72 3c 72 68 73 20 29 7b 0a 20 20 20  em1.r<rhs ){.   
1a820 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1a830 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1a840 28 20 6d 65 6d 31 2e 72 3e 72 68 73 20 29 7b 0a  ( mem1.r>rhs ){.
1a850 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b            rc = +
1a860 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1a870 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a880 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65    i64 lhs = vdbe
1a890 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28  RecordDecodeInt(
1a8a0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b  serial_type, &aK
1a8b0 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20  ey1[d1]);.      
1a8c0 20 20 69 36 34 20 72 68 73 20 3d 20 70 52 68 73    i64 rhs = pRhs
1a8d0 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69  ->u.i;.        i
1a8e0 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20  f( lhs<rhs ){.  
1a8f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1a900 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1a910 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20  f( lhs>rhs ){.  
1a920 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1a930 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a940 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1a950 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a   RHS is real */.
1a960 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
1a970 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  s->flags & MEM_R
1a980 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72  eal ){.      ser
1a990 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
1a9a0 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66  [idx1];.      if
1a9b0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
1a9c0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  2 ){.        rc 
1a9d0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1a9e0 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1a9f0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1aa00 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1aa10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 6f  else{.        do
1aa20 75 62 6c 65 20 72 68 73 20 3d 20 70 52 68 73 2d  uble rhs = pRhs-
1aa30 3e 72 3b 0a 20 20 20 20 20 20 20 20 64 6f 75 62  >r;.        doub
1aa40 6c 65 20 6c 68 73 3b 0a 20 20 20 20 20 20 20 20  le lhs;.        
1aa50 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1aa60 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1aa70 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d   serial_type, &m
1aa80 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  em1);.        if
1aa90 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
1aaa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 68   ){.          lh
1aab0 73 20 3d 20 6d 65 6d 31 2e 72 3b 0a 20 20 20 20  s = mem1.r;.    
1aac0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1aad0 20 20 20 20 20 6c 68 73 20 3d 20 28 64 6f 75 62       lhs = (doub
1aae0 6c 65 29 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20  le)mem1.u.i;.   
1aaf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1ab00 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20  f( lhs<rhs ){.  
1ab10 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1ab20 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1ab30 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20  f( lhs>rhs ){.  
1ab40 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1ab50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ab60 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1ab70 20 52 48 53 20 69 73 20 61 20 73 74 72 69 6e 67   RHS is a string
1ab80 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1ab90 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1aba0 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
1abb0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1abc0 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c  y1[idx1], serial
1abd0 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65  _type);.      te
1abe0 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1abf0 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1ac00 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1ac10 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72  <12 ){.        r
1ac20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1ac30 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c  lse if( !(serial
1ac40 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
1ac50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
1ac60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ac70 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20         mem1.n = 
1ac80 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31  (serial_type - 1
1ac90 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20  2) / 2;.        
1aca0 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65  testcase( (d1+me
1acb0 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64  m1.n)==(unsigned
1acc0 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1acd0 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1ace0 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69  mem1.n+1)==(unsi
1acf0 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1ad00 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65        if( (d1+me
1ad10 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65  m1.n) > (unsigne
1ad20 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  d)nKey1 ){.     
1ad30 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 69 73 43       pPKey2->isC
1ad40 6f 72 72 75 70 74 20 3d 20 28 75 38 29 53 51 4c  orrupt = (u8)SQL
1ad50 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ad60 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1ad70 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1ad80 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
1ad90 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
1ada0 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  lse if( pKeyInfo
1adb0 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20  ->aColl[i] ){.  
1adc0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63          mem1.enc
1add0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
1ade0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1adf0 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
1ae00 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  db;.          me
1ae10 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m1.flags = MEM_S
1ae20 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  tr;.          me
1ae30 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61  m1.z = (char*)&a
1ae40 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20  Key1[d1];.      
1ae50 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
1ae60 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 26 6d  pareMemString(&m
1ae70 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49  em1, pRhs, pKeyI
1ae80 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a  nfo->aColl[i]);.
1ae90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1aea0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d           int nCm
1aeb0 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20  p = MIN(mem1.n, 
1aec0 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
1aed0 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
1aee0 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
1aef0 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
1af00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
1af10 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20  ) rc = mem1.n - 
1af20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20  pRhs->n; .      
1af30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1af40 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1af50 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65   a blob */.    e
1af60 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
1af70 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
1af80 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e  {.      getVarin
1af90 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d  t32(&aKey1[idx1]
1afa0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1afb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1afc0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
1afd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1afe0 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28  ial_type<12 || (
1aff0 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1b000 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
1b010 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1b020 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1b030 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f   nStr = (serial_
1b040 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a  type - 12) / 2;.
1b050 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1b060 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e  ( (d1+nStr)==(un
1b070 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1b080 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1b090 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28  ( (d1+nStr+1)==(
1b0a0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1b0b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64  ;.        if( (d
1b0c0 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67  1+nStr) > (unsig
1b0d0 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ned)nKey1 ){.   
1b0e0 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 69         pPKey2->i
1b0f0 73 43 6f 72 72 75 70 74 20 3d 20 28 75 38 29 53  sCorrupt = (u8)S
1b100 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1b110 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  PT;.          re
1b120 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1b130 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70         /* Corrup
1b140 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
1b150 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1b160 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
1b170 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a  nStr, pRhs->n);.
1b180 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
1b190 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d  emcmp(&aKey1[d1]
1b1a0 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29  , pRhs->z, nCmp)
1b1b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1b1c0 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74  rc==0 ) rc = nSt
1b1d0 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20  r - pRhs->n;.   
1b1e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1b1f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1b200 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20   is null */.    
1b210 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69  else{.      seri
1b220 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
1b230 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20  idx1];.      rc 
1b240 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d  = (serial_type!=
1b250 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  0);.    }..    i
1b260 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1b270 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
1b280 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
1b290 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72  .        rc = -r
1b2a0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
1b2b0 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
1b2c0 5f 44 42 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  _DB.          ||
1b2d0 20 28 72 63 3c 30 20 26 26 20 76 64 62 65 52 65   (rc<0 && vdbeRe
1b2e0 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1b2f0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1b300 50 4b 65 79 32 29 3c 30 29 0a 20 20 20 20 20 20  PKey2)<0).      
1b310 20 20 20 20 7c 7c 20 28 72 63 3e 30 20 26 26 20      || (rc>0 && 
1b320 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1b330 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1b340 65 79 31 2c 20 70 50 4b 65 79 32 29 3e 30 29 0a  ey1, pPKey2)>0).
1b350 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4b 65            || pKe
1b360 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
1b370 63 46 61 69 6c 65 64 0a 20 20 20 20 20 20 29 3b  cFailed.      );
1b380 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
1b390 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  em1.zMalloc==0 )
1b3a0 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  ;  /* See commen
1b3b0 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  t below */.     
1b3c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b3d0 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  }..    i++;.    
1b3e0 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b  pRhs++;.    d1 +
1b3f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
1b400 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
1b410 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78  l_type);.    idx
1b420 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69  1 += sqlite3Vari
1b430 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  ntLen(serial_typ
1b440 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64  e);.  }while( id
1b450 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48  x1<(unsigned)szH
1b460 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d  dr1 && i<pPKey2-
1b470 3e 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d 28  >nField && d1<=(
1b480 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1b490 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72  ;..  /* No memor
1b4a0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  y allocation is 
1b4b0 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d  ever used on mem
1b4c0 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75  1.  Prove this u
1b4d0 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f  sing.  ** the fo
1b4e0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
1b4f0 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74  .  If the assert
1b500 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64  () fails, it ind
1b510 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65  icates a.  ** me
1b520 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20  mory leak and a 
1b530 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c  need to call sql
1b540 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
1b550 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20  se(&mem1).  */. 
1b560 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d   assert( mem1.zM
1b570 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
1b580 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
1b590 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62  ns that one or b
1b5a0 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20  oth of the keys 
1b5b0 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
1b5c0 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
1b5d0 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
1b5e0 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
1b5f0 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68  equal. Return th
1b600 65 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63  e the default_rc
1b610 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f  .  ** value.  */
1b620 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
1b630 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  PT_DB .       ||
1b640 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1b650 5f 72 63 3d 3d 76 64 62 65 52 65 63 6f 72 64 43  _rc==vdbeRecordC
1b660 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
1b670 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1b680 29 20 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  ) .  );.  return
1b690 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1b6a0 5f 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _rc;.}../*.** Th
1b6b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1b6c0 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73  n optimized vers
1b6d0 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
1b6e0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1b6f0 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74  ) .** that (a) t
1b700 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f  he first field o
1b710 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69  f pPKey2 is an i
1b720 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20  nteger, and (b) 
1b730 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d  the .** size-of-
1b740 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 74  header varint at
1b750 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70   the start of (p
1b760 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73  Key1/nKey1) fits
1b770 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   in a single.** 
1b780 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65  byte (i.e. is le
1b790 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a  ss than 128)..**
1b7a0 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e  .** To avoid con
1b7b0 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66  cerns about buff
1b7c0 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68  er overreads, th
1b7d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
1b7e0 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63  ly used.** on sc
1b7f0 68 65 6d 61 73 20 77 68 65 72 65 20 74 68 65 20  hemas where the 
1b800 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65  maximum valid he
1b810 61 64 65 72 20 73 69 7a 65 20 69 73 20 36 33 20  ader size is 63 
1b820 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a  bytes or less..*
1b830 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1b840 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
1b850 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  t(.  int nKey1, 
1b860 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1b870 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
1b880 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1b890 72 64 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20  rd *pPKey2,     
1b8a0 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
1b8b0 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20  /.  int bSkip   
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8d0 20 20 2f 2a 20 49 67 6e 6f 72 65 64 20 2a 2f 0a    /* Ignored */.
1b8e0 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  ){.  const u8 *a
1b8f0 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75  Key = &((const u
1b900 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73  8*)pKey1)[*(cons
1b910 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78  t u8*)pKey1 & 0x
1b920 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  3F];.  int seria
1b930 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74  l_type = ((const
1b940 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a   u8*)pKey1)[1];.
1b950 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32    int res;.  u32
1b960 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69   y;.  u64 x;.  i
1b970 36 34 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61  64 v = pPKey2->a
1b980 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 36  Mem[0].u.i;.  i6
1b990 34 20 6c 68 73 3b 0a 20 20 55 4e 55 53 45 44 5f  4 lhs;.  UNUSED_
1b9a0 50 41 52 41 4d 45 54 45 52 28 62 53 6b 69 70 29  PARAMETER(bSkip)
1b9b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53 6b  ;..  assert( bSk
1b9c0 69 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ip==0 );.  asser
1b9d0 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29  t( (*(u8*)pKey1)
1b9e0 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50  <=0x3F || CORRUP
1b9f0 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68  T_DB );.  switch
1ba00 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
1ba10 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f  .    case 1: { /
1ba20 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 1-byte signed 
1ba30 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1ba40 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f   lhs = ONE_BYTE_
1ba50 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1ba60 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
1ba70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1ba80 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ba90 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
1baa0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1bab0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f  .      lhs = TWO
1bac0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1bad0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1bae0 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
1baf0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1bb00 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
1bb10 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1bb20 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
1bb30 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
1bb40 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
1bb50 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
1bb60 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1bb70 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
1bb80 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
1bb90 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1bba0 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59       y = FOUR_BY
1bbb0 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1bbc0 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29       lhs = (i64)
1bbd0 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20  *(int*)&y;.     
1bbe0 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
1bbf0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1bc00 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1bc10 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
1bc20 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1bc30 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55  .      lhs = FOU
1bc40 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1bc50 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
1bc60 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
1bc70 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
1bc80 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
1bc90 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1bca0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
1bcb0 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67   { /* 8-byte sig
1bcc0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1bcd0 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59       x = FOUR_BY
1bce0 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1bcf0 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
1bd00 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
1bd10 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
1bd20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78   lhs = *(i64*)&x
1bd30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1bd40 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1bd50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1bd60 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20    case 8: .     
1bd70 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20   lhs = 0;.      
1bd80 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1bd90 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31  9:.      lhs = 1
1bda0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
1bdb0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
1bdc0 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65   could be remove
1bdd0 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  d without changi
1bde0 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ng the results o
1bdf0 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a  f running.    **
1be00 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c   this code. Incl
1be10 75 64 69 6e 67 20 69 74 20 63 61 75 73 65 73 20  uding it causes 
1be20 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20  gcc to generate 
1be30 61 20 66 61 73 74 65 72 20 73 77 69 74 63 68 20  a faster switch 
1be40 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
1be50 74 20 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e  t (since the ran
1be60 67 65 20 6f 66 20 73 77 69 74 63 68 20 74 61 72  ge of switch tar
1be70 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20  gets now starts 
1be80 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20  at zero and.    
1be90 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73  ** is contiguous
1bea0 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63  ) but does not c
1beb0 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61  ause any duplica
1bec0 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65  te code to be ge
1bed0 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28  nerated.    ** (
1bee0 61 73 20 67 63 63 20 69 73 20 63 6c 65 76 65 72  as gcc is clever
1bef0 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69   enough to combi
1bf00 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20  ne the two like 
1bf10 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20  cases). Other . 
1bf20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20     ** compilers 
1bf30 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72  might be similar
1bf40 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20  .  */ .    case 
1bf50 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20  0: case 7:.     
1bf60 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1bf70 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1bf80 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1bf90 50 4b 65 79 32 2c 20 30 29 3b 0a 0a 20 20 20 20  PKey2, 0);..    
1bfa0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
1bfb0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1bfc0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
1bfd0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1bfe0 65 79 32 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  ey2, 0);.  }..  
1bff0 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20  if( v>lhs ){.   
1c000 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1c010 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76  1;.  }else if( v
1c020 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  <lhs ){.    res 
1c030 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
1c040 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32  }else if( pPKey2
1c050 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20  ->nField>1 ){.  
1c060 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66    /* The first f
1c070 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f  ields of the two
1c080 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
1c090 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61   Compare the tra
1c0a0 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69  iling .    ** fi
1c0b0 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65  elds.  */.    re
1c0c0 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
1c0d0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65  ecordCompare(nKe
1c0e0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1c0f0 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2, 1);.  }else{.
1c100 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
1c110 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74   fields of the t
1c120 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  wo keys are equa
1c130 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  l and there are 
1c140 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20  no trailing.    
1c150 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72  ** fields. Retur
1c160 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
1c170 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61 73  t_rc in this cas
1c180 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20  e. */.    res = 
1c190 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1c1a0 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  rc;.  }..  asser
1c1b0 74 28 20 28 72 65 73 3d 3d 30 20 26 26 20 76 64  t( (res==0 && vd
1c1c0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1c1d0 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
1c1e0 31 2c 20 70 50 4b 65 79 32 29 3d 3d 30 29 0a 20  1, pPKey2)==0). 
1c1f0 20 20 20 20 20 20 7c 7c 20 28 72 65 73 3c 30 20        || (res<0 
1c200 26 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  && vdbeRecordCom
1c210 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1c220 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3c   pKey1, pPKey2)<
1c230 30 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 72 65  0).       || (re
1c240 73 3e 30 20 26 26 20 76 64 62 65 52 65 63 6f 72  s>0 && vdbeRecor
1c250 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1c260 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1c270 79 32 29 3e 30 29 0a 20 20 20 20 20 20 20 7c 7c  y2)>0).       ||
1c280 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20 29 3b   CORRUPT_DB.  );
1c290 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
1c2a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1c2b0 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69  ction is an opti
1c2c0 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  mized version of
1c2d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1c2e0 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20  rdCompare() .** 
1c2f0 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72  that (a) the fir
1c300 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  st field of pPKe
1c310 79 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  y2 is a string, 
1c320 74 68 61 74 20 28 62 29 20 74 68 65 20 66 69 72  that (b) the fir
1c330 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73  st field.** uses
1c340 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1c350 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61  equence BINARY a
1c360 6e 64 20 28 63 29 20 74 68 61 74 20 74 68 65 20  nd (c) that the 
1c370 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
1c380 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65  arint .** at the
1c390 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31   start of (pKey1
1c3a0 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20  /nKey1) fits in 
1c3b0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a  a single byte..*
1c3c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1c3d0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
1c3e0 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79  ring(.  int nKey
1c3f0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1c400 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
1c410 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1c420 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20  ecord *pPKey2,  
1c430 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
1c440 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70  y */.  int bSkip
1c450 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
1c460 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
1c470 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20  8*)pKey1;.  int 
1c480 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69  serial_type;.  i
1c490 6e 74 20 72 65 73 3b 0a 20 20 55 4e 55 53 45 44  nt res;.  UNUSED
1c4a0 5f 50 41 52 41 4d 45 54 45 52 28 62 53 6b 69 70  _PARAMETER(bSkip
1c4b0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53  );..  assert( bS
1c4c0 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 67 65 74 56  kip==0 );.  getV
1c4d0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31  arint32(&aKey1[1
1c4e0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
1c4f0 0a 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  ..  if( serial_t
1c500 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65  ype<12 ){.    re
1c510 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20  s = pPKey2->r1; 
1c520 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e       /* (pKey1/n
1c530 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65  Key1) is a numbe
1c540 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20  r or a null */. 
1c550 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72   }else if( !(ser
1c560 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29  ial_type & 0x01)
1c570 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70   ){ .    res = p
1c580 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20  PKey2->r2;      
1c590 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
1c5a0 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20   is a blob */.  
1c5b0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
1c5c0 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74  Cmp;.    int nSt
1c5d0 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72  r;.    int szHdr
1c5e0 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20   = aKey1[0];..  
1c5f0 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c    nStr = (serial
1c600 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20  _type-12) / 2;. 
1c610 20 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20     if( (szHdr + 
1c620 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b  nStr) > nKey1 ){
1c630 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 69  .      pPKey2->i
1c640 73 43 6f 72 72 75 70 74 20 3d 20 28 75 38 29 53  sCorrupt = (u8)S
1c650 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1c660 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
1c670 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70   0;    /* Corrup
1c680 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  tion */.    }.  
1c690 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50    nCmp = MIN( pP
1c6a0 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c  Key2->aMem[0].n,
1c6b0 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73   nStr );.    res
1c6c0 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
1c6d0 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d  [szHdr], pPKey2-
1c6e0 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70  >aMem[0].z, nCmp
1c6f0 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d  );..    if( res=
1c700 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  =0 ){.      res 
1c710 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d  = nStr - pPKey2-
1c720 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20  >aMem[0].n;.    
1c730 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
1c740 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b 65          if( pPKe
1c750 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a  y2->nField>1 ){.
1c760 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20            res = 
1c770 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1c780 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20  dCompare(nKey1, 
1c790 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31  pKey1, pPKey2, 1
1c7a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1c7b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  {.          res 
1c7c0 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
1c7d0 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t_rc;.        }.
1c7e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c7f0 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  res>0 ){.       
1c800 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1c810 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
1c820 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
1c830 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20  Key2->r1;.      
1c840 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
1c850 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  res>0 ){.      r
1c860 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
1c870 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c880 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1c890 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r1;.    }.  }.. 
1c8a0 20 61 73 73 65 72 74 28 20 28 72 65 73 3d 3d 30   assert( (res==0
1c8b0 20 26 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f   && vdbeRecordCo
1c8c0 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
1c8d0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29  , pKey1, pPKey2)
1c8e0 3d 3d 30 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ==0).       || (
1c8f0 72 65 73 3c 30 20 26 26 20 76 64 62 65 52 65 63  res<0 && vdbeRec
1c900 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1c910 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1c920 4b 65 79 32 29 3c 30 29 0a 20 20 20 20 20 20 20  Key2)<0).       
1c930 7c 7c 20 28 72 65 73 3e 30 20 26 26 20 76 64 62  || (res>0 && vdb
1c940 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1c950 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
1c960 2c 20 70 50 4b 65 79 32 29 3e 30 29 0a 20 20 20  , pPKey2)>0).   
1c970 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
1c980 42 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  B.  );.  return 
1c990 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  res;.}../*.** Re
1c9a0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1c9b0 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65  o an sqlite3Vdbe
1c9c0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1c9d0 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74  compatible funct
1c9e0 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20  ion.** suitable 
1c9f0 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65  for comparing se
1ca00 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73  rialized records
1ca10 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64   to the unpacked
1ca20 20 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a   record passed.*
1ca30 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  * as the only ar
1ca40 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72  gument..*/.Recor
1ca50 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33  dCompare sqlite3
1ca60 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28  VdbeFindCompare(
1ca70 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1ca80 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52  p){.  /* varintR
1ca90 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
1caa0 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f  ) and varintReco
1cab0 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
1cac0 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20  ) both assume.  
1cad0 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  ** that the size
1cae0 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
1caf0 74 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  t that occurs at
1cb00 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
1cb10 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66  ch record.  ** f
1cb20 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  its in a single 
1cb30 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32  byte (i.e. is 12
1cb40 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69  7 or less). vari
1cb50 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
1cb60 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61  nt().  ** also a
1cb70 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69  ssumes that it i
1cb80 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65  s safe to overre
1cb90 61 64 20 61 20 62 75 66 66 65 72 20 62 79 20 61  ad a buffer by a
1cba0 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a  t least the .  *
1cbb0 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62  * maximum possib
1cbc0 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20  le legal header 
1cbd0 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65  size plus 8 byte
1cbe0 73 2e 20 42 65 63 61 75 73 65 20 74 68 65 72 65  s. Because there
1cbf0 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74   is.  ** guarant
1cc00 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61  eed to be at lea
1cc10 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31  st 74 (but not 1
1cc20 33 36 29 20 62 79 74 65 73 20 6f 66 20 70 61 64  36) bytes of pad
1cc30 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65  ding following e
1cc40 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ach.  ** buffer 
1cc50 70 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74  passed to varint
1cc60 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
1cc70 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74  () this makes it
1cc80 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20   convenient to. 
1cc90 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69   ** limit the si
1cca0 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
1ccb0 20 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20   to 64 bytes in 
1ccc0 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
1ccd0 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a  first field.  **
1cce0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   is an integer..
1ccf0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61    **.  ** The ea
1cd00 73 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66  siest way to enf
1cd10 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20  orce this limit 
1cd20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f  is to consider o
1cd30 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74 68  nly records with
1cd40 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20  .  ** 13 fields 
1cd50 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20  or less. If the 
1cd60 66 69 72 73 74 20 66 69 65 6c 64 20 69 73 20 61  first field is a
1cd70 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d  n integer, the m
1cd80 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a  aximum legal.  *
1cd90 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73  * header size is
1cda0 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20   (12*5 + 1 + 1) 
1cdb0 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28  bytes.  */.  if(
1cdc0 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e   (p->pKeyInfo->n
1cdd0 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49  Field + p->pKeyI
1cde0 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31  nfo->nXField)<=1
1cdf0 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61  3 ){.    int fla
1ce00 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e  gs = p->aMem[0].
1ce10 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70  flags;.    if( p
1ce20 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ->pKeyInfo->aSor
1ce30 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20  tOrder[0] ){.   
1ce40 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20     p->r1 = 1;.  
1ce50 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a      p->r2 = -1;.
1ce60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ce70 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20   p->r1 = -1;.   
1ce80 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20     p->r2 = 1;.  
1ce90 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61    }.    if( (fla
1cea0 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b  gs & MEM_Int) ){
1ceb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
1cec0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
1ced0 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65  nt;.    }.    te
1cee0 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
1cef0 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20  MEM_Real );.    
1cf00 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
1cf10 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20  & MEM_Null );.  
1cf20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
1cf30 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  s & MEM_Blob );.
1cf40 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
1cf50 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e   (MEM_Real|MEM_N
1cf60 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d  ull|MEM_Blob))==
1cf70 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  0 && p->pKeyInfo
1cf80 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b  ->aColl[0]==0 ){
1cf90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66  .      assert( f
1cfa0 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
1cfb0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  ;.      return v
1cfc0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1cfd0 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20  String;.    }.  
1cfe0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  }..  return sqli
1cff0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1d000 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  pare;.}../*.** p
1d010 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
1d020 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
1d030 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
1d040 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
1d050 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
1d060 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
1d070 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
1d080 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
1d090 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
1d0a0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1d0b0 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
1d0c0 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
1d0d0 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
1d0e0 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69  e..**.** pCur mi
1d0f0 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20  ght be pointing 
1d100 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
1d110 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20   from a corrupt 
1d120 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1d130 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  * So the content
1d140 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
1d150 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69  ed.  Do appropri
1d160 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68  ate checks on th
1d170 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e  e content..*/.in
1d180 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
1d190 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  Rowid(sqlite3 *d
1d1a0 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  b, BtCursor *pCu
1d1b0 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a  r, i64 *rowid){.
1d1c0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
1d1d0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
1d1e0 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20  u32 szHdr;      
1d1f0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1d200 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
1d210 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f   typeRowid;    /
1d220 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * Serial type of
1d230 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
1d240 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20  u32 lenRowid;   
1d250 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1d260 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20   rowid */.  Mem 
1d270 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  m, v;..  UNUSED_
1d280 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 0a  PARAMETER(db);..
1d290 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a    /* Get the siz
1d2a0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  e of the index e
1d2b0 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69  ntry.  Only indi
1d2c0 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c  ces entries of l
1d2d0 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47  ess.  ** than 2G
1d2e0 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d  iB are support -
1d2f0 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
1d300 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65  must be database
1d310 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a   corruption..  *
1d320 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  * Any corruption
1d330 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20   is detected in 
1d340 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
1d350 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75  eCellPtr(), thou
1d360 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73  gh, so.  ** this
1d370 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79   code can safely
1d380 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65   assume that nCe
1d390 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73  llKey is 32-bits
1d3a0 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74    .  */.  assert
1d3b0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
1d3c0 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
1d3d0 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) );.  VVA_ONLY(
1d3e0 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72  rc =) sqlite3Btr
1d3f0 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
1d400 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73  &nCellKey);.  as
1d410 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
1d420 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70 43  _OK );     /* pC
1d430 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ur is always val
1d440 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61  id so KeySize ca
1d450 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61  nnot fail */.  a
1d460 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79  ssert( (nCellKey
1d470 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33   & SQLITE_MAX_U3
1d480 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65  2)==(u64)nCellKe
1d490 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  y );..  /* Read 
1d4a0 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  in the complete 
1d4b0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69  content of the i
1d4c0 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ndex entry */.  
1d4d0 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69  memset(&m, 0, si
1d4e0 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d  zeof(m));.  rc =
1d4f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
1d500 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
1d510 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
1d520 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
1d530 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1d540 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
1d550 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75  e index entry mu
1d560 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  st begin with a 
1d570 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20  header size */. 
1d580 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
1d590 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48  32((u8*)m.z, szH
1d5a0 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  dr);.  testcase(
1d5b0 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74   szHdr==3 );.  t
1d5c0 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
1d5d0 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  m.n );.  if( unl
1d5e0 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c  ikely(szHdr<3 ||
1d5f0 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29   (int)szHdr>m.n)
1d600 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
1d610 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
1d620 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
1d630 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
1d640 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
1d650 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
1d660 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
1d670 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1d680 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
1d690 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
1d6a0 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
1d6b0 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
1d6c0 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
1d6d0 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
1d6e0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
1d6f0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1d700 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
1d710 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1d720 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
1d730 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1d740 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
1d750 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
1d760 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1d770 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
1d780 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1d790 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
1d7a0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1d7b0 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
1d7c0 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
1d7d0 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
1d7e0 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
1d7f0 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
1d800 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
1d810 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
1d820 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
1d830 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
1d840 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
1d850 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d  tcase( (u32)m.n=
1d860 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20  =szHdr+lenRowid 
1d870 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
1d880 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72  y((u32)m.n<szHdr
1d890 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20  +lenRowid) ){.  
1d8a0 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
1d8b0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
1d8c0 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65  ..  /* Fetch the
1d8d0 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65   integer off the
1d8e0 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
1d8f0 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
1d900 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1d910 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
1d920 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
1d930 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
1d940 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
1d950 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1d960 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
1d970 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1d980 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
1d990 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
1d9a0 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
1d9b0 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65  d after m has be
1d9c0 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  en.  ** allocate
1d9d0 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f  d.  Free the m o
1d9e0 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
1d9f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
1da00 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f   */.idx_rowid_co
1da10 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74  rruption:.  test
1da20 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21  case( m.zMalloc!
1da30 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
1da40 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1da50 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1da60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1da70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1da80 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  e the key of the
1da90 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
1daa0 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70  t cursor pC is p
1dab0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e  ointing to again
1dac0 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
1dad0 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65  ring in pUnpacke
1dae0 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  d.  Write into *
1daf0 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
1db00 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
1db10 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
1db20 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
1db30 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1db40 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
1db50 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e   than pUnpacked.
1db60 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1db70 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
1db80 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69  *.** pUnpacked i
1db90 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64  s either created
1dba0 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64   without a rowid
1dbb0 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64   or is truncated
1dbc0 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f   so that it.** o
1dbd0 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61  mits the rowid a
1dbe0 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20  t the end.  The 
1dbf0 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
1dc00 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
1dc10 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  try.** is ignore
1dc20 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63  d as well.  Henc
1dc30 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
1dc40 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68  only compares th
1dc50 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f  e prefixes .** o
1dc60 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72  f the keys prior
1dc70 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   to the final ro
1dc80 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74  wid, not the ent
1dc90 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  ire key..*/.int 
1dca0 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
1dcb0 79 43 6f 6d 70 61 72 65 28 0a 20 20 56 64 62 65  yCompare(.  Vdbe
1dcc0 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20  Cursor *pC,     
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dce0 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f  The cursor to co
1dcf0 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
1dd00 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1dd10 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20  d *pUnpacked,   
1dd20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20      /* Unpacked 
1dd30 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a  version of key *
1dd40 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20  /.  int *res    
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd60 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
1dd70 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73  e comparison res
1dd80 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ult here */.){. 
1dd90 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
1dda0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  0;.  int rc;.  B
1ddb0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  tCursor *pCur = 
1ddc0 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d  pC->pCursor;.  M
1ddd0 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  em m;..  assert(
1dde0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1ddf0 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
1de00 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72   );.  VVA_ONLY(r
1de10 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65  c =) sqlite3Btre
1de20 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
1de30 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73  nCellKey);.  ass
1de40 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
1de50 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72  OK );    /* pCur
1de60 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
1de70 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e   so KeySize cann
1de80 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20  ot fail */.  /* 
1de90 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c  nCellKey will al
1dea0 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20  ways be between 
1deb0 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66  0 and 0xffffffff
1dec0 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
1ded0 77 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74  way.  ** that bt
1dee0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
1def0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74  ) and sqlite3Get
1df00 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69  Varint32() are i
1df10 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20  mplemented */.  
1df20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
1df30 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66  || nCellKey>0x7f
1df40 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72  ffffff ){.    *r
1df50 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
1df60 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1df70 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 65  T_BKPT;.  }.  me
1df80 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65  mset(&m, 0, size
1df90 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73  of(m));.  rc = s
1dfa0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
1dfb0 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73  mBtree(pC->pCurs
1dfc0 6f 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c  or, 0, (u32)nCel
1dfd0 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
1dfe0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
1dff0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
1e000 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
1e010 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d  eRecordCompare(m
1e020 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b  .n, m.z, pUnpack
1e030 65 64 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  ed, 0);.  sqlite
1e040 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1e050 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
1e060 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1e070 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
1e080 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f  ets the value to
1e090 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
1e0a0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
1e0b0 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63   to.** sqlite3_c
1e0c0 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20  hanges() on the 
1e0d0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1e0e0 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  'db'. .*/.void s
1e0f0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
1e100 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
1e110 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a  , int nChange){.
1e120 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e130 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
1e140 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d  >mutex) );.  db-
1e150 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e  >nChange = nChan
1e160 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c  ge;.  db->nTotal
1e170 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67  Change += nChang
1e180 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  e;.}../*.** Set 
1e190 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64  a flag in the vd
1e1a0 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  be to update the
1e1b0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
1e1c0 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c  when it is final
1e1d0 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74  ised.** or reset
1e1e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e1f0 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65  3VdbeCountChange
1e200 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d  s(Vdbe *v){.  v-
1e210 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31  >changeCntOn = 1
1e220 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
1e230 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73  every prepared s
1e240 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61  tatement associa
1e250 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
1e260 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
1e270 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a  * as expired..**
1e280 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73  .** An expired s
1e290 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74  tatement means t
1e2a0 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f  hat recompilatio
1e2b0 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
1e2c0 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65  nt is.** recomme
1e2d0 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20  nd.  Statements 
1e2e0 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e  expire when thin
1e2f0 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d  gs happen that m
1e300 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f  ake their.** pro
1e310 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20  grams obsolete. 
1e320 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64   Removing user-d
1e330 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
1e340 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a   or collating.**
1e350 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63   sequences, or c
1e360 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f  hanging an autho
1e370 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  rization functio
1e380 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20  n are the types 
1e390 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61  of.** things tha
1e3a0 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20  t make prepared 
1e3b0 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c  statements obsol
1e3c0 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ete..*/.void sql
1e3d0 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
1e3e0 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c  edStatements(sql
1e3f0 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
1e400 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20  e *p;.  for(p = 
1e410 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d  db->pVdbe; p; p=
1e420 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  p->pNext){.    p
1e430 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
1e440 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
1e450 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rn the database 
1e460 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1e470 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c  the Vdbe..*/.sql
1e480 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62  ite3 *sqlite3Vdb
1e490 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  eDb(Vdbe *v){.  
1e4a0 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a  return v->db;.}.
1e4b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1e4c0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
1e4d0 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
1e4e0 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
1e4f0 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64   the value bound
1e500 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56  .** parameter iV
1e510 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65  ar of VM v. Exce
1e520 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65  pt, if the value
1e530 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c   is an SQL NULL,
1e540 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e   return .** 0 in
1e550 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74  stead. Unless it
1e560 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20   is NULL, apply 
1e570 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e  affinity aff (on
1e580 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
1e590 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e  AFF_*.** constan
1e5a0 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ts) to the value
1e5b0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1e5c0 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  g it..**.** The 
1e5d0 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d  returned value m
1e5e0 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
1e5f0 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
1e600 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
1e610 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  e()..*/.sqlite3_
1e620 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64  value *sqlite3Vd
1e630 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28  beGetBoundValue(
1e640 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
1e650 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73  r, u8 aff){.  as
1e660 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a  sert( iVar>0 );.
1e670 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d    if( v ){.    M
1e680 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61  em *pMem = &v->a
1e690 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20  Var[iVar-1];.   
1e6a0 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66   if( 0==(pMem->f
1e6b0 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
1e6c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1e6d0 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20  3_value *pRet = 
1e6e0 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
1e6f0 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66  v->db);.      if
1e700 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
1e710 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1e720 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74  Copy((Mem *)pRet
1e730 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , pMem);.       
1e740 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70   sqlite3ValueApp
1e750 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c  lyAffinity(pRet,
1e760 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46   aff, SQLITE_UTF
1e770 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  8);.      }.    
1e780 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20    return pRet;. 
1e790 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1e7a0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
1e7b0 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72 69  nfigure SQL vari
1e7c0 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61  able iVar so tha
1e7d0 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20  t binding a new 
1e7e0 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e  value to it sign
1e7f0 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  als.** to sqlite
1e800 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74  3_reoptimize() t
1e810 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67  hat re-preparing
1e820 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d   the statement m
1e830 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ay result.** in 
1e840 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20 70  a better query p
1e850 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lan..*/.void sql
1e860 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
1e870 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  sk(Vdbe *v, int 
1e880 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28  iVar){.  assert(
1e890 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28   iVar>0 );.  if(
1e8a0 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20   iVar>32 ){.    
1e8b0 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66  v->expmask = 0xf
1e8c0 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65  fffffff;.  }else
1e8d0 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
1e8e0 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28   |= ((u32)1 << (
1e8f0 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a  iVar-1));.  }.}.
1e900 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e910 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1e920 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  E./*.** Transfer
1e930 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
1e940 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69  ext from an sqli
1e950 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67  te3_vtab.zErrMsg
1e960 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
1e970 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
1e980 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
1e990 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20  _malloc) into a 
1e9a0 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65  Vdbe.zErrMsg (te
1e9b0 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
1e9c0 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
1e9d0 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
1e9e0 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lloc)..*/.void s
1e9f0 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74  qlite3VtabImport
1ea00 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20  Errmsg(Vdbe *p, 
1ea10 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
1ea20 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  tab){.  sqlite3 
1ea30 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73  *db = p->db;.  s
1ea40 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1ea50 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
1ea60 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  p->zErrMsg = sql
1ea70 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
1ea80 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
1ea90 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1eaa0 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
1eab0 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ;.  pVtab->zErrM
1eac0 73 67 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  sg = 0;.}.#endif
1ead0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1eae0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.