/ Hex Artifact Content
Login

Artifact 68dbdc77cdc008eeabc088b8b8a60aa743ba8d2a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
02e0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74   new virtual dat
02f0: 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f  abase engine..*/
0300: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64  .Vdbe *sqlite3Vd
0310: 62 65 43 72 65 61 74 65 28 50 61 72 73 65 20 2a  beCreate(Parse *
0320: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
0330: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
0340: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  >db;.  Vdbe *p;.
0350: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
0360: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
0370: 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20 20  zeof(Vdbe) );.  
0380: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
0390: 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  n 0;.  p->db = d
03a0: 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64  b;.  if( db->pVd
03b0: 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56  be ){.    db->pV
03c0: 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  dbe->pPrev = p;.
03d0: 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d    }.  p->pNext =
03e0: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70 2d   db->pVdbe;.  p-
03f0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64 62  >pPrev = 0;.  db
0400: 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 70  ->pVdbe = p;.  p
0410: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
0420: 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e  AGIC_INIT;.  p->
0430: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
0440: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0450: 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->aLabel==0 );.
0460: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
0470: 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a 20  ->nLabel==0 );. 
0480: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
0490: 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  >nOpAlloc==0 );.
04a0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
04b0: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
04c0: 65 20 53 51 4c 20 73 74 72 69 6e 67 20 66 6f 72  e SQL string for
04d0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
04e0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
04f0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c  qlite3VdbeSetSql
0500: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
0510: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
0520: 69 6e 74 20 69 73 50 72 65 70 61 72 65 56 32 29  int isPrepareV2)
0530: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 50 72  {.  assert( isPr
0540: 65 70 61 72 65 56 32 3d 3d 31 20 7c 7c 20 69 73  epareV2==1 || is
0550: 50 72 65 70 61 72 65 56 32 3d 3d 30 20 29 3b 0a  PrepareV2==0 );.
0560: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
0570: 75 72 6e 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  urn;.#if defined
0580: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
0590: 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
05a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
05b0: 4c 4c 4f 47 29 0a 20 20 69 66 28 20 21 69 73 50  LLOG).  if( !isP
05c0: 72 65 70 61 72 65 56 32 20 29 20 72 65 74 75 72  repareV2 ) retur
05d0: 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  n;.#endif.  asse
05e0: 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29  rt( p->zSql==0 )
05f0: 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71  ;.  p->zSql = sq
0600: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
0610: 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 70  ->db, z, n);.  p
0620: 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d 20  ->isPrepareV2 = 
0630: 28 75 38 29 69 73 50 72 65 70 61 72 65 56 32 3b  (u8)isPrepareV2;
0640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0650: 20 74 68 65 20 53 51 4c 20 61 73 73 6f 63 69 61   the SQL associa
0660: 74 65 64 20 77 69 74 68 20 61 20 70 72 65 70 61  ted with a prepa
0670: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f  red statement.*/
0680: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
0690: 69 74 65 33 5f 73 71 6c 28 73 71 6c 69 74 65 33  ite3_sql(sqlite3
06a0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  _stmt *pStmt){. 
06b0: 20 56 64 62 65 20 2a 70 20 3d 20 28 56 64 62 65   Vdbe *p = (Vdbe
06c0: 20 2a 29 70 53 74 6d 74 3b 0a 20 20 72 65 74 75   *)pStmt;.  retu
06d0: 72 6e 20 28 70 20 26 26 20 70 2d 3e 69 73 50 72  rn (p && p->isPr
06e0: 65 70 61 72 65 56 32 29 20 3f 20 70 2d 3e 7a 53  epareV2) ? p->zS
06f0: 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ql : 0;.}../*.**
0700: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0710: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
0720: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
0730: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0740: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
0750: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
0760: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
0770: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 74   char *zTmp;.  t
0780: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
0790: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
07a0: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
07b0: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
07c0: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
07d0: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
07e0: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
07f0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
0800: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
0810: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
0820: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
0830: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
0840: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
0850: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
0860: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61  p;.  pB->isPrepa
0870: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65  reV2 = pA->isPre
0880: 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pareV2;.}../*.**
0890: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65   Resize the Vdbe
08a0: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68  .aOp array so th
08b0: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73  at it is at leas
08c0: 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67 65 72 20  t one op larger 
08d0: 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77 61 73 2e  than .** it was.
08e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74  .**.** If an out
08f0: 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72  -of-memory error
0900: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
0910: 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79  sizing the array
0920: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  , return.** SQLI
0930: 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69  TE_NOMEM. In thi
0940: 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20  s case Vdbe.aOp 
0950: 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f  and Vdbe.nOpAllo
0960: 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63  c remain .** unc
0970: 68 61 6e 67 65 64 20 28 74 68 69 73 20 69 73 20  hanged (this is 
0980: 73 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 63 6f  so that any opco
0990: 64 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f  des already allo
09a0: 63 61 74 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a  cated can be .**
09b0: 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c   correctly deall
09c0: 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
09d0: 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  h the rest of th
09e0: 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74  e Vdbe)..*/.stat
09f0: 69 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 72 72  ic int growOpArr
0a00: 61 79 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 56  ay(Vdbe *v){.  V
0a10: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0a20: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0a30: 72 73 65 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20  rse;.  int nNew 
0a40: 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f  = (p->nOpAlloc ?
0a50: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a   p->nOpAlloc*2 :
0a60: 20 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65   (int)(1024/size
0a70: 6f 66 28 4f 70 29 29 29 3b 0a 20 20 70 4e 65 77  of(Op)));.  pNew
0a80: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
0a90: 6c 6f 63 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f  loc(p->db, v->aO
0aa0: 70 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f  p, nNew*sizeof(O
0ab0: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  p));.  if( pNew 
0ac0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  ){.    p->nOpAll
0ad0: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
0ae0: 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20  llocSize(p->db, 
0af0: 70 4e 65 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29  pNew)/sizeof(Op)
0b00: 3b 0a 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70  ;.    v->aOp = p
0b10: 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  New;.  }.  retur
0b20: 6e 20 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45  n (pNew ? SQLITE
0b30: 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d  _OK : SQLITE_NOM
0b40: 45 4d 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  EM);.}..#ifdef S
0b50: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
0b60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
0b70: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74  ust a convenient
0b80: 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
0b90: 62 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20  breakpoint that 
0ba0: 77 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74  will.** fire aft
0bb0: 65 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69  er each opcode i
0bc0: 73 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64  s inserted and d
0bd0: 69 73 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a  isplayed using.*
0be0: 2a 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61  * "PRAGMA vdbe_a
0bf0: 64 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a  ddoptrace=on"..*
0c00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
0c10: 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f  st_addop_breakpo
0c20: 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  int(void){.  sta
0c30: 74 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  tic int n = 0;. 
0c40: 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   n++;.}.#endif..
0c50: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
0c60: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74  instruction to t
0c70: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72  he list of instr
0c80: 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20  uctions current 
0c90: 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20  in the.** VDBE. 
0ca0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
0cb0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69  ess of the new i
0cc0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
0cd0: 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a  * Parameters:.**
0ce0: 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20  .**    p        
0cf0: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
0d00: 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a  o the VDBE.**.**
0d10: 20 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20      op          
0d20: 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66      The opcode f
0d30: 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  or this instruct
0d40: 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c  ion.**.**    p1,
0d50: 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65   p2, p3      Ope
0d60: 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20  rands.**.** Use 
0d70: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
0d80: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75  esolveLabel() fu
0d90: 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e  nction to fix an
0da0: 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20   address and.** 
0db0: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43  the sqlite3VdbeC
0dc0: 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69  hangeP4() functi
0dd0: 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  on to change the
0de0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
0df0: 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a  .** operand..*/.
0e00: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
0e10: 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69  ddOp3(Vdbe *p, i
0e20: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
0e30: 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a  nt p2, int p3){.
0e40: 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f    int i;.  VdbeO
0e50: 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70  p *pOp;..  i = p
0e60: 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->nOp;.  assert(
0e70: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
0e80: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
0e90: 61 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20  assert( op>0 && 
0ea0: 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28  op<0xff );.  if(
0eb0: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
0ec0: 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69  lloc<=i ){.    i
0ed0: 66 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  f( growOpArray(p
0ee0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
0ef0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
0f00: 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70   p->nOp++;.  pOp
0f10: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
0f20: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28   pOp->opcode = (
0f30: 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35  u8)op;.  pOp->p5
0f40: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20   = 0;.  pOp->p1 
0f50: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20  = p1;.  pOp->p2 
0f60: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  = p2;.  pOp->p3 
0f70: 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  = p3;.  pOp->p4.
0f80: 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34  p = 0;.  pOp->p4
0f90: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
0fa0: 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  D;.#ifdef SQLITE
0fb0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
0fc0: 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e  COMMENTS.  pOp->
0fd0: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65  zComment = 0;.#e
0fe0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
0ff0: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1000: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1010: 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
1020: 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  ace ){.    int j
1030: 6a 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65  j, kk;.    Parse
1040: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
1050: 61 72 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a  arse;.    for(jj
1060: 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49 54 45  =kk=0; jj<SQLITE
1070: 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b  _N_COLCACHE; jj+
1080: 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1090: 20 79 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20   yColCache *x = 
10a0: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
10b0: 65 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 69 66  e + jj;.      if
10c0: 28 20 78 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72  ( x->iLevel>pPar
10d0: 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20  se->iCacheLevel 
10e0: 7c 7c 20 78 2d 3e 69 52 65 67 3d 3d 30 20 29 20  || x->iReg==0 ) 
10f0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1100: 70 72 69 6e 74 66 28 22 20 72 5b 25 64 5d 3d 7b  printf(" r[%d]={
1110: 25 64 3a 25 64 7d 22 2c 20 78 2d 3e 69 52 65 67  %d:%d}", x->iReg
1120: 2c 20 78 2d 3e 69 54 61 62 6c 65 2c 20 78 2d 3e  , x->iTable, x->
1130: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
1140: 6b 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  kk++;.    }.    
1150: 69 66 28 20 6b 6b 20 29 20 70 72 69 6e 74 66 28  if( kk ) printf(
1160: 22 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  "\n");.    sqlit
1170: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
1180: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
1190: 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f  .    test_addop_
11a0: 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20  breakpoint();.  
11b0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
11c0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70  VDBE_PROFILE.  p
11d0: 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  Op->cycles = 0;.
11e0: 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a    pOp->cnt = 0;.
11f0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1200: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
1210: 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69  GE.  pOp->iSrcLi
1220: 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ne = 0;.#endif. 
1230: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74   return i;.}.int
1240: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1250: 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p0(Vdbe *p, int 
1260: 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  op){.  return sq
1270: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1280: 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b  p, op, 0, 0, 0);
1290: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
12a0: 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70  beAddOp1(Vdbe *p
12b0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
12c0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
12d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
12e0: 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a   op, p1, 0, 0);.
12f0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1300: 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c  eAddOp2(Vdbe *p,
1310: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
1320: 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75   int p2){.  retu
1330: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1340: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
1350: 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  p2, 0);.}.../*.*
1360: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
1370: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
1380: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
1390: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
13a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13b0: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
13c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
13d0: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
13e0: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
13f0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1400: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
1410: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
1420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1430: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1440: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1450: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1460: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1470: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1480: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1490: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
14a0: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
14b0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
14c0: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
14d0: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
14e0: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
14f0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1500: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1510: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1520: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1530: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1540: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
1550: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1560: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50  ./*.** Add an OP
1570: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63  _ParseSchema opc
1580: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
1590: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74  ne is broken out
15a0: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
15b0: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e  VdbeAddOp4() sin
15c0: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61  ce it needs to a
15d0: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72  lso needs to mar
15e0: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20  k all btrees.** 
15f0: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75  as having been u
1600: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  sed..**.** The z
1610: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73  Where string mus
1620: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
1630: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
1640: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54  3_malloc()..** T
1650: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1660: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
1670: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
1680: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64   memory..*/.void
1690: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
16a0: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62  arseSchemaOp(Vdb
16b0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63  e *p, int iDb, c
16c0: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20  har *zWhere){.  
16d0: 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64  int j;.  int add
16e0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
16f0: 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73  ddOp3(p, OP_Pars
1700: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
1710: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
1720: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1730: 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44  dr, zWhere, P4_D
1740: 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a  YNAMIC);.  for(j
1750: 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62  =0; j<p->db->nDb
1760: 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64  ; j++) sqlite3Vd
1770: 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a  beUsesBtree(p, j
1780: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
1790: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
17a0: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
17b0: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
17c0: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
17d0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
17e0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
17f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1800: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1810: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1830: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1840: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1850: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1860: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
1870: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
1880: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1890: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
18a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
18b0: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
18c0: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
18d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18e0: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
18f0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
1900: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1910: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1920: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1930: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1940: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1950: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
1960: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32  TR(p4), P4_INT32
1970: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
1980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1990: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
19a0: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
19b0: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
19c0: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
19d0: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
19e0: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
19f0: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
1a00: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
1a10: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
1a20: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
1a30: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
1a40: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
1a50: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
1a60: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
1a70: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
1a80: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
1a90: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
1aa0: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
1ab0: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
1ac0: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
1ad0: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
1ae0: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
1af0: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
1b00: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
1b10: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
1b20: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
1b30: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
1b40: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
1b50: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
1b60: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
1b70: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
1b80: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
1b90: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
1ba0: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
1bb0: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
1bc0: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
1bd0: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
1be0: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
1bf0: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
1c00: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
1c10: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29  keLabel(Vdbe *v)
1c20: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76  {.  Parse *p = v
1c30: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
1c40: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b  i = p->nLabel++;
1c50: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
1c60: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1c70: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69  INIT );.  if( (i
1c80: 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (i-1))==0 ){.
1c90: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1ca0: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1cb0: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1cc0: 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20  >aLabel, .      
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28   (i*2+1)*sizeof(
1d00: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
1d10: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61    }.  if( p->aLa
1d20: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
1d30: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
1d40: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b  }.  return -1-i;
1d50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
1d60: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62  e label "x" to b
1d70: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  e the address of
1d80: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
1d90: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69  ction to.** be i
1da0: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61  nserted.  The pa
1db0: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74  rameter "x" must
1dc0: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
1dd0: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
1de0: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
1df0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1e00: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
1e10: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1e20: 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  bel(Vdbe *v, int
1e30: 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20   x){.  Parse *p 
1e40: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
1e50: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
1e60: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
1e70: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1e80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   );.  assert( j<
1e90: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69  p->nLabel );.  i
1ea0: 66 28 20 6a 3e 3d 30 20 26 26 20 70 2d 3e 61 4c  f( j>=0 && p->aL
1eb0: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
1ec0: 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f  Label[j] = v->nO
1ed0: 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 46 69 78  p;.  }.  p->iFix
1ee0: 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f 70 20 2d 20  edOp = v->nOp - 
1ef0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  1;.}../*.** Mark
1f00: 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65   the VDBE as one
1f10: 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62   that can only b
1f20: 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a  e run one time..
1f30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1f40: 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56  dbeRunOnlyOnce(V
1f50: 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75  dbe *p){.  p->ru
1f60: 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d  nOnlyOnce = 1;.}
1f70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1f80: 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65 33  DEBUG /* sqlite3
1f90: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
1fa0: 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   logic */../*.**
1fb0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
1fc0: 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e  ype and function
1fd0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 74 65   are used to ite
1fe0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c  rate through all
1ff0: 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20 61   opcodes.** in a
2000: 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67 72   Vdbe main progr
2010: 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20 74  am and each of t
2020: 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20  he sub-programs 
2030: 28 74 72 69 67 67 65 72 73 29 20 69 74 20 6d 61  (triggers) it ma
2040: 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69 72  y .** invoke dir
2050: 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63  ectly or indirec
2060: 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  tly. It should b
2070: 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77  e used as follow
2080: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70  s:.**.**   Op *p
2090: 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70 49  Op;.**   VdbeOpI
20a0: 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a  ter sIter;.**.**
20b0: 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72     memset(&sIter
20c0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65  , 0, sizeof(sIte
20d0: 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72 2e  r));.**   sIter.
20e0: 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20 20  v = v;          
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79 70    // v is of typ
2110: 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77 68  e Vdbe* .**   wh
2120: 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74  ile( (pOp = opIt
2130: 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 20  erNext(&sIter)) 
2140: 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20  ){.**     // Do 
2150: 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 70  something with p
2160: 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 73  Op.**   }.**   s
2170: 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
2180: 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29  db, sIter.apSub)
2190: 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65 66  ;.** .*/.typedef
21a0: 20 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74   struct VdbeOpIt
21b0: 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a 73  er VdbeOpIter;.s
21c0: 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65 72  truct VdbeOpIter
21d0: 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20   {.  Vdbe *v;   
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72 61  /* Vdbe to itera
2200: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6f  te through the o
2210: 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20 53  pcodes of */.  S
2220: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
2230: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72  b;        /* Arr
2240: 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d  ay of subprogram
2250: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 3b  s */.  int nSub;
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2270: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
2280: 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75 62 20  ntries in apSub 
2290: 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 20  */.  int iAddr; 
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
22c0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
22d0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
22e0: 74 20 69 53 75 62 3b 20 20 20 20 20 20 20 20 20  t iSub;         
22f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d 20           /* 0 = 
2300: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31 20  main program, 1 
2310: 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f 67  = first sub-prog
2320: 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73  ram etc. */.};.s
2330: 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65 72  tatic Op *opIter
2340: 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65 72 20  Next(VdbeOpIter 
2350: 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  *p){.  Vdbe *v =
2360: 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52 65   p->v;.  Op *pRe
2370: 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f 70  t = 0;.  Op *aOp
2380: 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20  ;.  int nOp;..  
2390: 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e  if( p->iSub<=p->
23a0: 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66 28  nSub ){..    if(
23b0: 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a 20   p->iSub==0 ){. 
23c0: 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61 4f       aOp = v->aO
23d0: 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 76  p;.      nOp = v
23e0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65  ->nOp;.    }else
23f0: 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70 2d  {.      aOp = p-
2400: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
2410: 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f  ]->aOp;.      nO
2420: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
2430: 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20  iSub-1]->nOp;.  
2440: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2450: 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b 0a  p->iAddr<nOp );.
2460: 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f 70  .    pRet = &aOp
2470: 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20 20  [p->iAddr];.    
2480: 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20 20  p->iAddr++;.    
2490: 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f  if( p->iAddr==nO
24a0: 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 53  p ){.      p->iS
24b0: 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69  ub++;.      p->i
24c0: 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Addr = 0;.    }.
24d0: 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d    .    if( pRet-
24e0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
24f0: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
2500: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e  int nByte = (p->
2510: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
2520: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
2530: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
2540: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53  for(j=0; j<p->nS
2550: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
2560: 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b 6a    if( p->apSub[j
2570: 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f  ]==pRet->p4.pPro
2580: 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  gram ) break;.  
2590: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
25a0: 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20 20  j==p->nSub ){.  
25b0: 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20 3d        p->apSub =
25c0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
25d0: 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20 70  cOrFree(v->db, p
25e0: 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29 3b  ->apSub, nByte);
25f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 2d  .        if( !p-
2600: 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20  >apSub ){.      
2610: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
2620: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2630: 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 5b         p->apSub[
2640: 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52 65  p->nSub++] = pRe
2650: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  t->p4.pProgram;.
2660: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2670: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
2680: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
2690: 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
26a0: 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64  e program stored
26b0: 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f 63   in the VM assoc
26c0: 69 61 74 65 64 20 77 69 74 68 20 70 50 61 72 73  iated with pPars
26d0: 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61  e may.** throw a
26e0: 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f  n ABORT exceptio
26f0: 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65 20 73  n (causing the s
2700: 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  tatement, but no
2710: 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  t entire transac
2720: 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 6f  tion.** to be ro
2730: 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69 73  lled back). This
2740: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72   condition is tr
2750: 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 70  ue if the main p
2760: 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a  rogram or any.**
2770: 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 6f   sub-programs co
2780: 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74 68  ntains any of th
2790: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
27a0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20  **   *  OP_Halt 
27b0: 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43  with P1=SQLITE_C
27c0: 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32  ONSTRAINT and P2
27d0: 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20  =OE_Abort..**   
27e0: 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c  *  OP_HaltIfNull
27f0: 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f   with P1=SQLITE_
2800: 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50  CONSTRAINT and P
2810: 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20  2=OE_Abort..**  
2820: 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a   *  OP_Destroy.*
2830: 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61 74  *   *  OP_VUpdat
2840: 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65  e.**   *  OP_VRe
2850: 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  name.**   *  OP_
2860: 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20 50  FkCounter with P
2870: 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65 20  2==0 (immediate 
2880: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
2890: 74 72 61 69 6e 74 29 0a 2a 2a 0a 2a 2a 20 54 68  traint).**.** Th
28a0: 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  en check that th
28b0: 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73 65  e value of Parse
28c0: 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72 75  .mayAbort is tru
28d0: 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54  e if an.** ABORT
28e0: 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c 20   may be thrown, 
28f0: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
2900: 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20  se. Return true 
2910: 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61  if it does.** ma
2920: 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  tch, or false ot
2930: 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66 75  herwise. This fu
2940: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64  nction is intend
2950: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61 73  ed to be used as
2960: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20 61  .** part of an a
2970: 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20  ssert statement 
2980: 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e  in the compiler.
2990: 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a   Similar to:.**.
29a0: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  **   assert( sql
29b0: 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61  ite3VdbeAssertMa
29c0: 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e 70  yAbort(pParse->p
29d0: 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61  Vdbe, pParse->ma
29e0: 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e  yAbort) );.*/.in
29f0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  t sqlite3VdbeAss
2a00: 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62 65  ertMayAbort(Vdbe
2a10: 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72   *v, int mayAbor
2a20: 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62 6f  t){.  int hasAbo
2a30: 72 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f  rt = 0;.  Op *pO
2a40: 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20  p;.  VdbeOpIter 
2a50: 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  sIter;.  memset(
2a60: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
2a70: 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74  f(sIter));.  sIt
2a80: 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69  er.v = v;..  whi
2a90: 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65  le( (pOp = opIte
2aa0: 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21 3d  rNext(&sIter))!=
2ab0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63  0 ){.    int opc
2ac0: 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64  ode = pOp->opcod
2ad0: 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  e;.    if( opcod
2ae0: 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c  e==OP_Destroy ||
2af0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
2b00: 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ate || opcode==O
2b10: 50 5f 56 52 65 6e 61 6d 65 20 0a 23 69 66 6e 64  P_VRename .#ifnd
2b20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
2b30: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 20  OREIGN_KEY.     
2b40: 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  || (opcode==OP_F
2b50: 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 2d  kCounter && pOp-
2b60: 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1==0 && pOp->p
2b70: 32 3d 3d 31 29 20 0a 23 65 6e 64 69 66 0a 20 20  2==1) .#endif.  
2b80: 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d     || ((opcode==
2b90: 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64  OP_Halt || opcod
2ba0: 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c  e==OP_HaltIfNull
2bb0: 29 20 0a 20 20 20 20 20 20 26 26 20 28 28 70 4f  ) .      && ((pO
2bc0: 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53 51 4c  p->p1&0xff)==SQL
2bd0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26  ITE_CONSTRAINT &
2be0: 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62  & pOp->p2==OE_Ab
2bf0: 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ort)).    ){.   
2c00: 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b     hasAbort = 1;
2c10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2c20: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2c30: 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73  3DbFree(v->db, s
2c40: 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20  Iter.apSub);..  
2c50: 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  /* Return true i
2c60: 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41  f hasAbort==mayA
2c70: 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61  bort. Or if a ma
2c80: 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
2c90: 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d  urred..  ** If m
2ca0: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68  alloc failed, th
2cb0: 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c  en the while() l
2cc0: 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f  oop above may no
2cd0: 74 20 68 61 76 65 20 69 74 65 72 61 74 65 64 0a  t have iterated.
2ce0: 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c    ** through all
2cf0: 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73   opcodes and has
2d00: 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74  Abort may be set
2d10: 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65   incorrectly. Re
2d20: 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66  turn.  ** true f
2d30: 6f 72 20 74 68 69 73 20 63 61 73 65 20 74 6f 20  or this case to 
2d40: 70 72 65 76 65 6e 74 20 74 68 65 20 61 73 73 65  prevent the asse
2d50: 72 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c  rt() in the call
2d60: 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66  ers frame.  ** f
2d70: 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f  rom failing.  */
2d80: 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64  .  return ( v->d
2d90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2da0: 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79  || hasAbort==may
2db0: 41 62 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69  Abort );.}.#endi
2dc0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
2dd0: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41  G - the sqlite3A
2de0: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
2df0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a  function */../*.
2e00: 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  ** Loop through 
2e10: 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b  the program look
2e20: 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65  ing for P2 value
2e30: 73 20 74 68 61 74 20 61 72 65 20 6e 65 67 61 74  s that are negat
2e40: 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69  ive.** on jump i
2e50: 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61  nstructions.  Ea
2e60: 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69 73  ch such value is
2e70: 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c   a label.  Resol
2e80: 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20  ve the.** label 
2e90: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  by setting the P
2ea0: 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63  2 value to its c
2eb0: 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20  orrect non-zero 
2ec0: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  value..**.** Thi
2ed0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2ee0: 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61  led once after a
2ef0: 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20  ll opcodes have 
2f00: 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  been inserted..*
2f10: 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70  *.** Variable *p
2f20: 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20 73  MaxFuncArgs is s
2f30: 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  et to the maximu
2f40: 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50  m value of any P
2f50: 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74  2 argument .** t
2f60: 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  o an OP_Function
2f70: 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20  , OP_AggStep or 
2f80: 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64  OP_VFilter opcod
2f90: 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  e. This is used 
2fa0: 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  by .** sqlite3Vd
2fb0: 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f  beMakeReady() to
2fc0: 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61   size the Vdbe.a
2fd0: 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a  pArg[] array..**
2fe0: 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61  .** The Op.opfla
2ff0: 67 73 20 66 69 65 6c 64 20 69 73 20 73 65 74 20  gs field is set 
3000: 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a  on all opcodes..
3010: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
3020: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56  esolveP2Values(V
3030: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61  dbe *p, int *pMa
3040: 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e  xFuncArgs){.  in
3050: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41  t i;.  int nMaxA
3060: 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41  rgs = *pMaxFuncA
3070: 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a  rgs;.  Op *pOp;.
3080: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
3090: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = p->pParse;.  i
30a0: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61  nt *aLabel = pPa
30b0: 72 73 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70  rse->aLabel;.  p
30c0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
30d0: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
30e0: 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d   0;.  for(pOp=p-
30f0: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
3100: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
3110: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f  ++){.    u8 opco
3120: 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  de = pOp->opcode
3130: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20  ;..    /* NOTE: 
3140: 42 65 20 73 75 72 65 20 74 6f 20 75 70 64 61 74  Be sure to updat
3150: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
3160: 77 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72  when adding or r
3170: 65 6d 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 63  emoving.    ** c
3180: 61 73 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73  ases from this s
3190: 77 69 74 63 68 21 20 2a 2f 0a 20 20 20 20 73 77  witch! */.    sw
31a0: 69 74 63 68 28 20 6f 70 63 6f 64 65 20 29 7b 0a  itch( opcode ){.
31b0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 46 75        case OP_Fu
31c0: 6e 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20 63 61  nction:.      ca
31d0: 73 65 20 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b  se OP_AggStep: {
31e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
31f0: 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20  ->p5>nMaxArgs ) 
3200: 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e  nMaxArgs = pOp->
3210: 70 35 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  p5;.        brea
3220: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3230: 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63   case OP_Transac
3240: 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  tion: {.        
3250: 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29  if( pOp->p2!=0 )
3260: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30   p->readOnly = 0
3270: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c  ;.        /* fal
3280: 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20  l thru */.      
3290: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
32a0: 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20  AutoCommit:.    
32b0: 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f    case OP_Savepo
32c0: 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70  int: {.        p
32d0: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b  ->bIsReader = 1;
32e0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
32f0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
3300: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
3310: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68        case OP_Ch
3320: 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66  eckpoint:.#endif
3330: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56  .      case OP_V
3340: 61 63 75 75 6d 3a 0a 20 20 20 20 20 20 63 61 73  acuum:.      cas
3350: 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65  e OP_JournalMode
3360: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72  : {.        p->r
3370: 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20  eadOnly = 0;.   
3380: 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65       p->bIsReade
3390: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62  r = 1;.        b
33a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
33b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33c0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
33d0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70       case OP_VUp
33e0: 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  date: {.        
33f0: 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78  if( pOp->p2>nMax
3400: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
3410: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
3420: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3430: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
3440: 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20  VFilter: {.     
3450: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
3460: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
3470: 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20   - i >= 3 );.   
3480: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
3490: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
34a0: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
34b0: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70     n = pOp[-1].p
34c0: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  1;.        if( n
34d0: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
34e0: 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20  Args = n;.      
34f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3500: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61  .#endif.      ca
3510: 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20  se OP_Next:.    
3520: 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66    case OP_NextIf
3530: 4f 70 65 6e 3a 0a 20 20 20 20 20 20 63 61 73 65  Open:.      case
3540: 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20   OP_SorterNext: 
3550: 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  {.        pOp->p
3560: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
3570: 69 74 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20  ite3BtreeNext;. 
3580: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79         pOp->p4ty
3590: 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b  pe = P4_ADVANCE;
35a0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
35b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
35c0: 73 65 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20  se OP_Prev:.    
35d0: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66    case OP_PrevIf
35e0: 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  Open: {.        
35f0: 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
3600: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
3610: 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20  revious;.       
3620: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
3630: 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20  4_ADVANCE;.     
3640: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3650: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70  }.    }..    pOp
3660: 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69  ->opflags = sqli
3670: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
3680: 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69  y[opcode];.    i
3690: 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73  f( (pOp->opflags
36a0: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d   & OPFLG_JUMP)!=
36b0: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29  0 && pOp->p2<0 )
36c0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
36d0: 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 50 61 72 73  -1-pOp->p2<pPars
36e0: 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20  e->nLabel );.   
36f0: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61     pOp->p2 = aLa
3700: 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b  bel[-1-pOp->p2];
3710: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
3720: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
3730: 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c  , pParse->aLabel
3740: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61  );.  pParse->aLa
3750: 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  bel = 0;.  pPars
3760: 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  e->nLabel = 0;. 
3770: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d   *pMaxFuncArgs =
3780: 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73   nMaxArgs;.  ass
3790: 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65  ert( p->bIsReade
37a0: 72 21 3d 30 20 7c 7c 20 70 2d 3e 62 74 72 65 65  r!=0 || p->btree
37b0: 4d 61 73 6b 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  Mask==0 );.}../*
37c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
37d0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
37e0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
37f0: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  o be inserted..*
3800: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
3810: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62  eCurrentAddr(Vdb
3820: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
3830: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
3840: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
3850: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d  return p->nOp;.}
3860: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
3870: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
3880: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
3890: 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20  rray of opcodes 
38a0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
38b0: 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 73 73  ** the Vdbe pass
38c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
38d0: 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20  argument. It is 
38e0: 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
38f0: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f  onsibility.** to
3900: 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65   arrange for the
3910: 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20   returned array 
3920: 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  to be eventually
3930: 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 68 65   freed using the
3940: 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41   .** vdbeFreeOpA
3950: 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e  rray() function.
3960: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
3970: 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69  turning, *pnOp i
3980: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
3990: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
39a0: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  n the returned.*
39b0: 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a  * array. Also, *
39c0: 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74 20  pnMaxArg is set 
39d0: 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  to the larger of
39e0: 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
39f0: 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e  ue and .** the n
3a00: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
3a10: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41   in the Vdbe.apA
3a20: 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69  rg[] array requi
3a30: 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74  red to execute t
3a40: 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  he .** returned 
3a50: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65  program..*/.Vdbe
3a60: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54  Op *sqlite3VdbeT
3a70: 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  akeOpArray(Vdbe 
3a80: 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69  *p, int *pnOp, i
3a90: 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20  nt *pnMaxArg){. 
3aa0: 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70   VdbeOp *aOp = p
3ab0: 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->aOp;.  assert(
3ac0: 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e   aOp && !p->db->
3ad0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
3ae0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
3af0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
3b00: 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20  Btree() was not 
3b10: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56  called on this V
3b20: 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  M */.  assert( p
3b30: 2d 3e 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20 29  ->btreeMask==0 )
3b40: 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  ;..  resolveP2Va
3b50: 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67  lues(p, pnMaxArg
3b60: 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e  );.  *pnOp = p->
3b70: 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20  nOp;.  p->aOp = 
3b80: 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b  0;.  return aOp;
3b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
3ba0: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
3bb0: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
3bc0: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
3bd0: 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
3be0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66  address of the f
3bf0: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61  irst operation a
3c00: 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dded..*/.int sql
3c10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3c20: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  t(Vdbe *p, int n
3c30: 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63  Op, VdbeOpList c
3c40: 6f 6e 73 74 20 2a 61 4f 70 2c 20 69 6e 74 20 69  onst *aOp, int i
3c50: 4c 69 6e 65 6e 6f 29 7b 0a 20 20 69 6e 74 20 61  Lineno){.  int a
3c60: 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ddr;.  assert( p
3c70: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3c80: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
3c90: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
3ca0: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
3cb0: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
3cc0: 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 72 65  ray(p) ){.    re
3cd0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64  turn 0;.  }.  ad
3ce0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  dr = p->nOp;.  i
3cf0: 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29  f( ALWAYS(nOp>0)
3d00: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
3d10: 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f     VdbeOpList co
3d20: 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a  nst *pIn = aOp;.
3d30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
3d40: 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b  Op; i++, pIn++){
3d50: 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20  .      int p2 = 
3d60: 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56  pIn->p2;.      V
3d70: 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70  dbeOp *pOut = &p
3d80: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20  ->aOp[i+addr];. 
3d90: 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64       pOut->opcod
3da0: 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b  e = pIn->opcode;
3db0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20  .      pOut->p1 
3dc0: 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20  = pIn->p1;.     
3dd0: 20 69 66 28 20 70 32 3c 30 20 29 7b 0a 20 20 20   if( p2<0 ){.   
3de0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
3df0: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
3e00: 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 5d  ty[pOut->opcode]
3e10: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 20 29 3b   & OPFLG_JUMP );
3e20: 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  .        pOut->p
3e30: 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28  2 = addr + ADDR(
3e40: 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  p2);.      }else
3e50: 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  {.        pOut->
3e60: 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d  p2 = p2;.      }
3e70: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20  .      pOut->p3 
3e80: 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20  = pIn->p3;.     
3e90: 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20   pOut->p4type = 
3ea0: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
3eb0: 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30    pOut->p4.p = 0
3ec0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35  ;.      pOut->p5
3ed0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
3ee0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
3ef0: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
3f00: 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74    pOut->zComment
3f10: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
3f20: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
3f30: 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20 70  COVERAGE.      p
3f40: 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20  Out->iSrcLine = 
3f50: 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65  iLineno+i;.#else
3f60: 0a 20 20 20 20 20 20 28 76 6f 69 64 29 69 4c 69  .      (void)iLi
3f70: 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66  neno;.#endif.#if
3f80: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3f90: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 64 62  .      if( p->db
3fa0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
3fb0: 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
3fc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3fd0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
3fe0: 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70   i+addr, &p->aOp
3ff0: 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20  [i+addr]);.     
4000: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
4010: 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f      p->nOp += nO
4020: 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
4030: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
4040: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
4050: 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e  of the P1 operan
4060: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
4070: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
4080: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4090: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
40a0: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
40b0: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
40c0: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
40d0: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
40e0: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
40f0: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
4100: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
4110: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
4120: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
4130: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
4140: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
4150: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
4160: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
4170: 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f   if( ((u32)p->nO
4180: 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70  p)>addr ){.    p
4190: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d  ->aOp[addr].p1 =
41a0: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
41b0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
41c0: 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70  lue of the P2 op
41d0: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
41e0: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
41f0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
4200: 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20  e is useful for 
4210: 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64  setting a jump d
4220: 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  estination..*/.v
4230: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
4240: 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c  hangeP2(Vdbe *p,
4250: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
4260: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
4270: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75  !=0 );.  if( ((u
4280: 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20  32)p->nOp)>addr 
4290: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
42a0: 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20  dr].p2 = val;.  
42b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
42c0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
42d0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f  he P3 operand fo
42e0: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
42f0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
4300: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
4310: 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75  ngeP3(Vdbe *p, u
4320: 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  32 addr, int val
4330: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
4340: 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32  0 );.  if( ((u32
4350: 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b  )p->nOp)>addr ){
4360: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72  .    p->aOp[addr
4370: 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p3 = val;.  }.
4380: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
4390: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
43a0: 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P5 operand for 
43b0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
43c0: 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61  y.** added opera
43d0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
43e0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
43f0: 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61  5(Vdbe *p, u8 va
4400: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
4410: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
4420: 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Op ){.    assert
4430: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20  ( p->nOp>0 );.  
4440: 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d    p->aOp[p->nOp-
4450: 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d  1].p5 = val;.  }
4460: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
4470: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
4480: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  of instruction a
4490: 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ddr so that it p
44a0: 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
44b0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
44c0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
44d0: 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a  to be coded..*/.
44e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
44f0: 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70  JumpHere(Vdbe *p
4500: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73  , int addr){.  s
4510: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4520: 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e  P2(p, addr, p->n
4530: 4f 70 29 3b 0a 20 20 70 2d 3e 70 50 61 72 73 65  Op);.  p->pParse
4540: 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e  ->iFixedOp = p->
4550: 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nOp - 1;.}.../*.
4560: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
4570: 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
4580: 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20  e is ephemeral, 
4590: 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49  then free it.  I
45a0: 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66  f.** the FuncDef
45b0: 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c   is not ephermal
45c0: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e  , then do nothin
45d0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
45e0: 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46  d freeEphemeralF
45f0: 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  unction(sqlite3 
4600: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44  *db, FuncDef *pD
4610: 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59  ef){.  if( ALWAY
4620: 53 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66  S(pDef) && (pDef
4630: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
4640: 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29  LITE_FUNC_EPHEM)
4650: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
4660: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65  e3DbFree(db, pDe
4670: 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  f);.  }.}..stati
4680: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
4690: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
46a0: 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  , Op *, int);../
46b0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34  *.** Delete a P4
46c0: 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73   value if necess
46d0: 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
46e0: 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74  oid freeP4(sqlit
46f0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79  e3 *db, int p4ty
4700: 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20  pe, void *p4){. 
4710: 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61   if( p4 ){.    a
4720: 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20  ssert( db );.   
4730: 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20   switch( p4type 
4740: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  ){.      case P4
4750: 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73  _REAL:.      cas
4760: 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20  e P4_INT64:.    
4770: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49    case P4_DYNAMI
4780: 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  C:.      case P4
4790: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
47a0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
47b0: 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20  ee(db, p4);.    
47c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
47d0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
47e0: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
47f0: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
4800: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71  tesFreed==0 ) sq
4810: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
4820: 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b  f((KeyInfo*)p4);
4830: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4840: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4850: 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b  se P4_MPRINTF: {
4860: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
4870: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4880: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
4890: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
48a0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
48b0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
48c0: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65  F: {.        fre
48d0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
48e0: 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a  on(db, (FuncDef*
48f0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
4900: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4910: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
4920: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4930: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4940: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
4950: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
4960: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
4970: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  p4);.        }el
4980: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65  se{.          Me
4990: 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b  m *p = (Mem*)p4;
49a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
49b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
49c0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
49d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
49e0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
49f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
4a00: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4a10: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
4a20: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4a30: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4a40: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
4a50: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
4a60: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4a70: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4a80: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
4a90: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
4aa0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
4ab0: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
4ac0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
4ad0: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
4ae0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
4af0: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
4b00: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
4b10: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
4b20: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
4b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
4b40: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
4b50: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
4b60: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
4b70: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
4b80: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
4b90: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
4ba0: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
4bb0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
4bc0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
4bd0: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66  p->p4.p);.#ifdef
4be0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
4bf0: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
4c00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4c10: 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f  ree(db, pOp->zCo
4c20: 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20  mment);.#endif  
4c30: 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20     .    }.  }.  
4c40: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4c50: 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , aOp);.}../*.**
4c60: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f   Link the SubPro
4c70: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73  gram object pass
4c80: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
4c90: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74   argument into t
4ca0: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73  he linked.** lis
4cb0: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72  t at Vdbe.pSubPr
4cc0: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74  ogram. This list
4cd0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65   is used to dele
4ce0: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72  te all sub-progr
4cf0: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68  am.** objects wh
4d00: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20  en the VM is no 
4d10: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
4d20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4d30: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
4d40: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  am(Vdbe *pVdbe, 
4d50: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a  SubProgram *p){.
4d60: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64    p->pNext = pVd
4d70: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  be->pProgram;.  
4d80: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20  pVdbe->pProgram 
4d90: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = p;.}../*.** Ch
4da0: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20  ange the opcode 
4db0: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f  at addr into OP_
4dc0: 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  Noop.*/.void sql
4dd0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
4de0: 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  Noop(Vdbe *p, in
4df0: 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20 70  t addr){.  if( p
4e00: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62  ->aOp ){.    Vdb
4e10: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
4e20: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71  Op[addr];.    sq
4e30: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
4e40: 62 3b 0a 20 20 20 20 66 72 65 65 50 34 28 64 62  b;.    freeP4(db
4e50: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
4e60: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d  Op->p4.p);.    m
4e70: 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69  emset(pOp, 0, si
4e80: 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20  zeof(pOp[0]));. 
4e90: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
4ea0: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 66   OP_Noop;.    if
4eb0: 28 20 61 64 64 72 3d 3d 70 2d 3e 6e 4f 70 2d 31  ( addr==p->nOp-1
4ec0: 20 29 20 70 2d 3e 6e 4f 70 2d 2d 3b 0a 20 20 7d   ) p->nOp--;.  }
4ed0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
4ee0: 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65   the last opcode
4ef0: 20 69 6e 73 65 72 74 65 64 0a 2a 2f 0a 69 6e 74   inserted.*/.int
4f00: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
4f10: 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64  tePriorOpcode(Vd
4f20: 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20  be *p, u8 op){. 
4f30: 20 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e   if( (p->nOp-1)>
4f40: 28 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78  (p->pParse->iFix
4f50: 65 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f 70 5b  edOp) && p->aOp[
4f60: 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65  p->nOp-1].opcode
4f70: 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  ==op ){.    sqli
4f80: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
4f90: 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29  oop(p, p->nOp-1)
4fa0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
4fb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
4fc0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
4fd0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
4fe0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f  alue of the P4 o
4ff0: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
5000: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
5010: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
5020: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
5030: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
5040: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
5050: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
5060: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
5070: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
5080: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
5090: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
50a0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
50b0: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
50c0: 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  f n>=0 then the 
50d0: 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79  P4 operand is dy
50e0: 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74  namic, meaning t
50f0: 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a  hat a copy of.**
5100: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d   the string is m
5110: 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ade into memory 
5120: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
5130: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
5140: 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d  ** A value of n=
5150: 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79  =0 means copy by
5160: 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f  tes of zP4 up to
5170: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74   and including t
5180: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c  he.** first null
5190: 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74   byte.  If n>0 t
51a0: 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74  hen copy n+1 byt
51b0: 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a  es of zP4..** .*
51c0: 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  * Other values o
51d0: 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20  f n (P4_STATIC, 
51e0: 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29  P4_COLLSEQ etc.)
51f0: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a   indicate that z
5200: 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  P4 points.** to 
5210: 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75  a string or stru
5220: 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75  cture that is gu
5230: 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73  aranteed to exis
5240: 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69  t for the lifeti
5250: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62  me of.** the Vdb
5260: 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  e. In these case
5270: 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f  s we can just co
5280: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a  py the pointer..
5290: 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20  **.** If addr<0 
52a0: 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f  then change P4 o
52b0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
52c0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73  tly inserted ins
52d0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
52e0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
52f0: 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69  ngeP4(Vdbe *p, i
5300: 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63  nt addr, const c
5310: 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29  har *zP4, int n)
5320: 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73  {.  Op *pOp;.  s
5330: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73  qlite3 *db;.  as
5340: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
5350: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
5360: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
5370: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
5380: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d  );.  if( p->aOp=
5390: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
53a0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66  Failed ){.    if
53b0: 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 7b 0a  ( n!=P4_VTAB ){.
53c0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
53d0: 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61   n, (void*)*(cha
53e0: 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d  r**)&zP4);.    }
53f0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
5400: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
5410: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
5420: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a   addr<p->nOp );.
5430: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
5440: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
5450: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70  p - 1;.  }.  pOp
5460: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
5470: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
5480: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55  >p4type==P4_NOTU
5490: 53 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f  SED.       || pO
54a0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
54b0: 54 33 32 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f  T32.       || pO
54c0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45  p->p4type==P4_KE
54d0: 59 49 4e 46 4f 20 29 3b 0a 20 20 66 72 65 65 50  YINFO );.  freeP
54e0: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
54f0: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
5500: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
5510: 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33    if( n==P4_INT3
5520: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65  2 ){.    /* Note
5530: 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73  : this cast is s
5540: 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  afe, because the
5550: 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69   origin data poi
5560: 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20  nt was an int.  
5570: 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61    ** that was ca
5580: 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63  st to a (const c
5590: 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70  har *). */.    p
55a0: 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54  Op->p4.i = SQLIT
55b0: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34  E_PTR_TO_INT(zP4
55c0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
55d0: 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20  pe = P4_INT32;. 
55e0: 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d   }else if( zP4==
55f0: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  0 ){.    pOp->p4
5600: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d  .p = 0;.    pOp-
5610: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
5620: 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  USED;.  }else if
5630: 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  ( n==P4_KEYINFO 
5640: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
5650: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
5660: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5670: 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d   P4_KEYINFO;.  }
5680: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56  else if( n==P4_V
5690: 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  TAB ){.    pOp->
56a0: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
56b0: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
56c0: 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20  pe = P4_VTAB;.  
56d0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63    sqlite3VtabLoc
56e0: 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29  k((VTable *)zP4)
56f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
5700: 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64  VTable *)zP4)->d
5710: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65  b==p->db );.  }e
5720: 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20  lse if( n<0 ){. 
5730: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
5740: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
5750: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
5760: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d  gned char)n;.  }
5770: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d  else{.    if( n=
5780: 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33  =0 ) n = sqlite3
5790: 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20  Strlen30(zP4);. 
57a0: 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73     pOp->p4.z = s
57b0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
57c0: 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a  p->db, zP4, n);.
57d0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
57e0: 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20  = P4_DYNAMIC;.  
57f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
5800: 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  he P4 on the mos
5810: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
5820: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 4b   opcode to the K
5830: 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a  eyInfo for the.*
5840: 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a  * index given..*
5850: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5860: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 50  beSetP4KeyInfo(P
5870: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
5880: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56 64  dex *pIdx){.  Vd
5890: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
58a0: 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
58b0: 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   v!=0 );.  asser
58c0: 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20  t( pIdx!=0 );.  
58d0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
58e0: 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP4(v, -1, (char
58f0: 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
5900: 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  OfIndex(pParse, 
5910: 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20 20  pIdx),.         
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
5930: 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66  KEYINFO);.}..#if
5940: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5950: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
5960: 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  TS./*.** Change 
5970: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  the comment on t
5980: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
5990: 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69   coded instructi
59a0: 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72  on.  Or.** inser
59b0: 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64  t a No-op and ad
59c0: 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f  d the comment to
59d0: 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75   that new instru
59e0: 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20  ction.  This.** 
59f0: 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65  makes the code e
5a00: 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75  asier to read du
5a10: 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20  ring debugging. 
5a20: 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61   None of this ha
5a30: 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72  ppens.** in a pr
5a40: 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a  oduction build..
5a50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
5a60: 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65  dbeVComment(Vdbe
5a70: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
5a80: 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73  *zFormat, va_lis
5a90: 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28  t ap){.  assert(
5aa0: 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e   p->nOp>0 || p->
5ab0: 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  aOp==0 );.  asse
5ac0: 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  rt( p->aOp==0 ||
5ad0: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5ae0: 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c  ].zComment==0 ||
5af0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
5b00: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
5b10: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65  >nOp ){.    asse
5b20: 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20  rt( p->aOp );.  
5b30: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5b40: 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d  p->db, p->aOp[p-
5b50: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
5b60: 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d  );.    p->aOp[p-
5b70: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
5b80: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
5b90: 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61  tf(p->db, zForma
5ba0: 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  t, ap);.  }.}.vo
5bb0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
5bc0: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
5bd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
5be0: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
5bf0: 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20  ist ap;.  if( p 
5c00: 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  ){.    va_start(
5c10: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
5c20: 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70    vdbeVComment(p
5c30: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
5c40: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
5c50: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
5c60: 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e  e3VdbeNoopCommen
5c70: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
5c80: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
5c90: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
5ca0: 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ap;.  if( p ){. 
5cb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5cc0: 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29  dOp0(p, OP_Noop)
5cd0: 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ;.    va_start(a
5ce0: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
5cf0: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c   vdbeVComment(p,
5d00: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
5d10: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
5d20: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20   }.}.#endif  /* 
5d30: 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65  NDEBUG */..#ifde
5d40: 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f  f SQLITE_VDBE_CO
5d50: 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74  VERAGE./*.** Set
5d60: 20 74 68 65 20 76 61 6c 75 65 20 69 66 20 74 68   the value if th
5d70: 65 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64  e iSrcLine field
5d80: 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
5d90: 73 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75  sly coded instru
5da0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
5db0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e  qlite3VdbeSetLin
5dc0: 65 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c  eNumber(Vdbe *v,
5dd0: 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73   int iLine){.  s
5de0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
5df0: 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20  v,-1)->iSrcLine 
5e00: 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69  = iLine;.}.#endi
5e10: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45  f /* SQLITE_VDBE
5e20: 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a  _COVERAGE */../*
5e30: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
5e40: 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65  pcode for a give
5e50: 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74  n address.  If t
5e60: 68 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31  he address is -1
5e70: 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e  , then.** return
5e80: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
5e90: 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f  ly inserted opco
5ea0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  de..**.** If a m
5eb0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
5ec0: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
5ed0: 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  red prior to the
5ee0: 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73   calling of this
5ef0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  .** routine, the
5f00: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
5f10: 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69   dummy VdbeOp wi
5f20: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
5f30: 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20   That opcode.** 
5f40: 69 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20  is readable but 
5f50: 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68  not writable, th
5f60: 6f 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20  ough it is cast 
5f70: 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61  to a writable va
5f80: 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  lue..** The retu
5f90: 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70  rn of a dummy op
5fa0: 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20  code allows the 
5fb0: 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65  call to continue
5fc0: 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20   functioning.** 
5fd0: 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61 75 6c  after a OOM faul
5fe0: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
5ff0: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65   to check to see
6000: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66   if the return f
6010: 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  rom .** this rou
6020: 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20  tine is a valid 
6030: 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65  pointer.  But be
6040: 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e  cause the dummy.
6050: 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20  opcode is 0,.** 
6060: 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72  dummy will never
6070: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
6080: 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65   This is verifie
6090: 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63  d by code inspec
60a0: 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72  tion and.** by r
60b0: 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67  unning with Valg
60c0: 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  rind..*/.VdbeOp 
60d0: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
60e0: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
60f0: 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73  ddr){.  /* C89 s
6100: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68  pecifies that th
6110: 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d  e constant "dumm
6120: 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69  y" will be initi
6130: 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20  alized to all.  
6140: 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20  ** zeros, which 
6150: 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56  is correct.  MSV
6160: 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61  C generates a wa
6170: 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c  rning, neverthel
6180: 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ess. */.  static
6190: 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20   VdbeOp dummy;  
61a0: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53  /* Ignore the MS
61b0: 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74  VC warning about
61c0: 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20   no initializer 
61d0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
61e0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
61f0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
6200: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
6210: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
6220: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
6230: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
6240: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
6250: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6260: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
6270: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
6280: 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f     return (VdbeO
6290: 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c  p*)&dummy;.  }el
62a0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
62b0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
62c0: 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
62d0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45  (SQLITE_ENABLE_E
62e0: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29  XPLAIN_COMMENTS)
62f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
6300: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
6310: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61  or one of the pa
6320: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20  rameters to the 
6330: 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65  opcode pOp.** de
6340: 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72  termined by char
6350: 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74  acter c..*/.stat
6360: 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65  ic int translate
6370: 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20  P(char c, const 
6380: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20  Op *pOp){.  if( 
6390: 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20  c=='1' ) return 
63a0: 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63  pOp->p1;.  if( c
63b0: 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70  =='2' ) return p
63c0: 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d  Op->p2;.  if( c=
63d0: 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='3' ) return pO
63e0: 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p3;.  if( c==
63f0: 27 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '4' ) return pOp
6400: 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e  ->p4.i;.  return
6410: 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a   pOp->p5;.}../*.
6420: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
6430: 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d  ing for the "com
6440: 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61  ment" field of a
6450: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73   VDBE opcode lis
6460: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
6470: 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20  Synopsis: field 
6480: 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  in comments in t
6490: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
64a0: 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65   file gets conve
64b0: 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78  rted.** to an ex
64c0: 74 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  tra string that 
64d0: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
64e0: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
64f0: 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a  Name().  In the.
6500: 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74  ** absence of ot
6510: 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68  her comments, th
6520: 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f  is synopsis beco
6530: 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  mes the comment 
6540: 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a  on the opcode..*
6550: 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69  * Some translati
6560: 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a  on occurs:.**.**
6570: 20 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20         "PX"     
6580: 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20   ->  "r[X]".**  
6590: 20 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d       "PX@PY"   -
65a0: 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22  >  "r[X..X+Y-1]"
65b0: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
65c0: 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20   is 0 or 1.**   
65d0: 20 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e      "PX@PY+1" ->
65e0: 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20    "r[X..X+Y]"   
65f0: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
6600: 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50  is 0.**       "P
6610: 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58  Y..PY"  ->  "r[X
6620: 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72  ..Y]"      or "r
6630: 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a  [x]" if y<=x.*/.
6640: 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c  static int displ
6650: 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e  ayComment(.  con
6660: 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20  st Op *pOp,     
6670: 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f  /* The opcode to
6680: 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f   be commented */
6690: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
66a0: 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  P4,   /* Previou
66b0: 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c  sly obtained val
66c0: 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63  ue for P4 */.  c
66d0: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20  har *zTemp,     
66e0: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
66f0: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  t here */.  int 
6700: 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f  nTemp          /
6710: 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c  * Space availabl
6720: 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a  e in zTemp[] */.
6730: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
6740: 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  *zOpName;.  cons
6750: 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69  t char *zSynopsi
6760: 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65  s;.  int nOpName
6770: 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a  ;.  int ii, jj;.
6780: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69    zOpName = sqli
6790: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
67a0: 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f  p->opcode);.  nO
67b0: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  pName = sqlite3S
67c0: 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29  trlen30(zOpName)
67d0: 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b  ;.  if( zOpName[
67e0: 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20  nOpName+1] ){.  
67f0: 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20    int seenCom = 
6800: 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20  0;.    char c;. 
6810: 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a     zSynopsis = z
6820: 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d  OpName += nOpNam
6830: 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f 72 28 69  e + 1;.    for(i
6840: 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70  i=jj=0; jj<nTemp
6850: 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f  -1 && (c = zSyno
6860: 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69  psis[ii])!=0; ii
6870: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  ++){.      if( c
6880: 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20  =='P' ){.       
6890: 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b   c = zSynopsis[+
68a0: 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii];.        if
68b0: 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20  ( c=='4' ){.    
68c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
68d0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
68e0: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
68f0: 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d   zP4);.        }
6900: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20  else if( c=='X' 
6910: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
6920: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6930: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
6940: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
6950: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  mment);.        
6960: 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20    seenCom = 1;. 
6970: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6980: 20 20 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d          int v1 =
6990: 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70   translateP(c, p
69a0: 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Op);.          i
69b0: 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20  nt v2;.         
69c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
69d0: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
69e0: 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b  p+jj, "%d", v1);
69f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
6a00: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
6a10: 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d  +ii+1, "@P", 2)=
6a20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6a30: 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20    ii += 3;.     
6a40: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c         jj += sql
6a50: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
6a60: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20  mp+jj);.        
6a70: 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61      v2 = transla
6a80: 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69  teP(zSynopsis[ii
6a90: 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20  ], pOp);.       
6aa0: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
6ab0: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
6ac0: 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20  "+1",2)==0 ){.  
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
6ae0: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 2;.           
6af0: 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20     v2++;.       
6b00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6b10: 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20     if( v2>1 ){. 
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
6b30: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6b40: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
6b50: 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d  , "..%d", v1+v2-
6b60: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
6b70: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
6b80: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53  e if( strncmp(zS
6b90: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e  ynopsis+ii+1, ".
6ba0: 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70  .P3", 4)==0 && p
6bb0: 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20  Op->p3==0 ){.   
6bc0: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34           ii += 4
6bd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6be0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6bf0: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
6c00: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
6c10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6c20: 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b        zTemp[jj++
6c30: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = c;.      }. 
6c40: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65     }.    if( !se
6c50: 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d  enCom && jj<nTem
6c60: 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d  p-5 && pOp->zCom
6c70: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ment ){.      sq
6c80: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6c90: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
6ca0: 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e  j, "; %s", pOp->
6cb0: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20  zComment);.     
6cc0: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
6cd0: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
6ce0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6cf0: 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70  jj<nTemp ) zTemp
6d00: 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  [jj] = 0;.  }els
6d10: 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e if( pOp->zComm
6d20: 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
6d30: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6d40: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20  p, zTemp, "%s", 
6d50: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
6d60: 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33      jj = sqlite3
6d70: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
6d80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54  .  }else{.    zT
6d90: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
6da0: 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  jj = 0;.  }.  re
6db0: 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69  turn jj;.}.#endi
6dc0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
6dd0: 47 20 2a 2f 0a 0a 0a 23 69 66 20 21 64 65 66 69  G */...#if !defi
6de0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6df0: 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66  EXPLAIN) || !def
6e00: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20  ined(NDEBUG) \. 
6e10: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56      || defined(V
6e20: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
6e30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
6e40: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  EBUG)./*.** Comp
6e50: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
6e60: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
6e70: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
6e80: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
6e90: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
6ea0: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
6eb0: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
6ec0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
6ed0: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
6ee0: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
6ef0: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
6f00: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
6f10: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  p;.  assert( nTe
6f20: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74  mp>=20 );.  swit
6f30: 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ch( pOp->p4type 
6f40: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  ){.    case P4_K
6f50: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
6f60: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20  int i, j;.      
6f70: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
6f80: 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  o = pOp->p4.pKey
6f90: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65  Info;.      asse
6fa0: 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
6fb0: 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
6fc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6fd0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
6fe0: 6d 70 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79  mp, "k(%d", pKey
6ff0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
7000: 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33       i = sqlite3
7010: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
7020: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
7030: 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  j<pKeyInfo->nFie
7040: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
7050: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
7060: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
7070: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63  ll[j];.        c
7080: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
7090: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
70a0: 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b  ->zName : "nil";
70b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
70c0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
70d0: 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20  (zColl);.       
70e0: 20 69 66 28 20 6e 3d 3d 36 20 26 26 20 6d 65 6d   if( n==6 && mem
70f0: 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52  cmp(zColl,"BINAR
7100: 59 22 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Y",6)==0 ){.    
7110: 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 42        zColl = "B
7120: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d  ";.          n =
7130: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
7140: 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54        if( i+n>nT
7150: 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20  emp-6 ){.       
7160: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70     memcpy(&zTemp
7170: 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20  [i],",...",4);. 
7180: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7190: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
71a0: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
71b0: 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ,';.        if( 
71c0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
71d0: 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20  rder[j] ){.     
71e0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
71f0: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d  = '-';.        }
7200: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
7210: 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c  &zTemp[i], zColl
7220: 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , n+1);.        
7230: 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  i += n;.      }.
7240: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
7250: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
7260: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
7270: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
7280: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p );.      break
7290: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
72a0: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P4_COLLSEQ: {. 
72b0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
72c0: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  oll = pOp->p4.pC
72d0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oll;.      sqlit
72e0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
72f0: 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e 32 30  p, zTemp, "(%.20
7300: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
7310: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
7320: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7330: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
7340: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
7350: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  f = pOp->p4.pFun
7360: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
7370: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
7380: 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22   zTemp, "%s(%d)"
7390: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70  , pDef->zName, p
73a0: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
73b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
73c0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
73d0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
73e0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
73f0: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
7400: 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b   *pOp->p4.pI64);
7410: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7420: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
7430: 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73  INT32: {.      s
7440: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7450: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
7460: 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a  d", pOp->p4.i);.
7470: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7480: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52   }.    case P4_R
7490: 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  EAL: {.      sql
74a0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
74b0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31  emp, zTemp, "%.1
74c0: 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52  6g", *pOp->p4.pR
74d0: 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eal);.      brea
74e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
74f0: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
7500: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f    Mem *pMem = pO
7510: 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20  p->p4.pMem;.    
7520: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
7530: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
7540: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65         zP4 = pMe
7550: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  m->z;.      }els
7560: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
7570: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
7580: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
7590: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
75a0: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d  Temp, "%lld", pM
75b0: 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20  em->u.i);.      
75c0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
75d0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
75e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
75f0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7600: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36  mp, zTemp, "%.16
7610: 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20  g", pMem->r);.  
7620: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
7630: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
7640: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
7650: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7660: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
7670: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 7d 65  NULL");.      }e
7680: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
7690: 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  ert( pMem->flags
76a0: 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
76b0: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62         zP4 = "(b
76c0: 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20  lob)";.      }. 
76d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
76e0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
76f0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
7700: 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56  LE.    case P4_V
7710: 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TAB: {.      sql
7720: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
7730: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62   = pOp->p4.pVtab
7740: 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73  ->pVtab;.      s
7750: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7760: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76  nTemp, zTemp, "v
7770: 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61  tab:%p:%p", pVta
7780: 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  b, pVtab->pModul
7790: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
77a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
77b0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
77c0: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
77d0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
77e0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61  mp, zTemp, "inta
77f0: 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72  rray");.      br
7800: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7810: 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  ase P4_SUBPROGRA
7820: 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  M: {.      sqlit
7830: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7840: 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67 72  p, zTemp, "progr
7850: 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  am");.      brea
7860: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7870: 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a  e P4_ADVANCE: {.
7880: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
7890: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
78a0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
78b0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20  lt: {.      zP4 
78c0: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
78d0: 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b     if( zP4==0 ){
78e0: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a  .        zP4 = z
78f0: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54  Temp;.        zT
7900: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
7910: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
7920: 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29  assert( zP4!=0 )
7930: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a  ;.  return zP4;.
7940: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7950: 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56  Declare to the V
7960: 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72  dbe that the BTr
7970: 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d  ee object at db-
7980: 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e  >aDb[i] is used.
7990: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61  .**.** The prepa
79a0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e  red statements n
79b0: 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61  eed to know in a
79c0: 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c  dvance the compl
79d0: 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74  ete set of.** at
79e0: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
79f0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
7a00: 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68  e.  A mask of th
7a10: 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a  ese databases.**
7a20: 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69   is maintained i
7a30: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20  n p->btreeMask. 
7a40: 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b   The p->lockMask
7a50: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75   value is the su
7a60: 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74  bset of.** p->bt
7a70: 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62  reeMask of datab
7a80: 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72  ases that will r
7a90: 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a  equire a lock..*
7aa0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
7ab0: 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65  beUsesBtree(Vdbe
7ac0: 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61   *p, int i){.  a
7ad0: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
7ae0: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69  <p->db->nDb && i
7af0: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62  <(int)sizeof(yDb
7b00: 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73  Mask)*8 );.  ass
7b10: 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65  ert( i<(int)size
7b20: 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  of(p->btreeMask)
7b30: 2a 38 20 29 3b 0a 20 20 70 2d 3e 62 74 72 65 65  *8 );.  p->btree
7b40: 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73  Mask |= ((yDbMas
7b50: 6b 29 31 29 3c 3c 69 3b 0a 20 20 69 66 28 20 69  k)1)<<i;.  if( i
7b60: 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42 74  !=1 && sqlite3Bt
7b70: 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64  reeSharable(p->d
7b80: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29  b->aDb[i].pBt) )
7b90: 7b 0a 20 20 20 20 70 2d 3e 6c 6f 63 6b 4d 61 73  {.    p->lockMas
7ba0: 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31  k |= ((yDbMask)1
7bb0: 29 3c 3c 69 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  )<<i;.  }.}..#if
7bc0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7bd0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
7be0: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
7bf0: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
7c00: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f   If SQLite is co
7c10: 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72  mpiled to suppor
7c20: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
7c30: 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68  ode and to be th
7c40: 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69  readsafe,.** thi
7c50: 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e  s routine obtain
7c60: 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  s the mutex asso
7c70: 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
7c80: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
7c90: 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20  ure.** that may 
7ca0: 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74  be accessed by t
7cb0: 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
7cc0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20  an argument. In 
7cd0: 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f  doing so it also
7ce0: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53  .** sets the BtS
7cf0: 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20  hared.db member 
7d00: 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42  of each of the B
7d10: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
7d20: 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20  es, ensuring.** 
7d30: 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  that the correct
7d40: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
7d50: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65  llback is invoke
7d60: 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a  d if required..*
7d70: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
7d80: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
7d90: 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72   but does suppor
7da0: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
7db0: 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c  ode, then.** sql
7dc0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
7dd0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73   is invoked to s
7de0: 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  et the BtShared.
7df0: 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  db variables.** 
7e00: 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72  of all of BtShar
7e10: 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63  ed structures ac
7e20: 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65  cessible via the
7e30: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
7e40: 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20   .** associated 
7e50: 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a  with the VM..**.
7e60: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
7e70: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61  not threadsafe a
7e80: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  nd does not supp
7e90: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
7ea0: 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66   mode, this.** f
7eb0: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
7ec0: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d  op..**.** The p-
7ed0: 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64  >btreeMask field
7ee0: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66   is a bitmask of
7ef0: 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74   all btrees that
7f00: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a   the prepared .*
7f10: 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69  * statement p wi
7f20: 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65  ll ever use.  Le
7f30: 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65  t N be the numbe
7f40: 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e  r of bits in p->
7f50: 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72  btreeMask.** cor
7f60: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74  responding to bt
7f70: 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68  rees that use sh
7f80: 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65  ared cache.  The
7f90: 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66  n the runtime of
7fa0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
7fb0: 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73   is N*N.  But as
7fc0: 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72   N is rarely mor
7fd0: 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73  e than 1, this s
7fe0: 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20  hould not.** be 
7ff0: 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f  a problem..*/.vo
8000: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  id sqlite3VdbeEn
8010: 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ter(Vdbe *p){.  
8020: 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b  int i;.  yDbMask
8030: 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33   mask;.  sqlite3
8040: 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b   *db;.  Db *aDb;
8050: 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66  .  int nDb;.  if
8060: 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30  ( p->lockMask==0
8070: 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54   ) return;  /* T
8080: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
8090: 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  /.  db = p->db;.
80a0: 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b    aDb = db->aDb;
80b0: 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62  .  nDb = db->nDb
80c0: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73  ;.  for(i=0, mas
80d0: 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c  k=1; i<nDb; i++,
80e0: 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a   mask += mask){.
80f0: 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20      if( i!=1 && 
8100: 28 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d  (mask & p->lockM
8110: 61 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41 59  ask)!=0 && ALWAY
8120: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
8130: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8140: 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b  3BtreeEnter(aDb[
8150: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
8160: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
8170: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8180: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
8190: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
81a0: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
81b0: 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74   Unlock all of t
81c0: 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f  he btrees previo
81d0: 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61  usly locked by a
81e0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
81f0: 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a  VdbeEnter()..*/.
8200: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8210: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
8220: 20 20 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61    int i;.  yDbMa
8230: 73 6b 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74  sk mask;.  sqlit
8240: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
8250: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
8260: 69 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d  if( p->lockMask=
8270: 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
8280: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
8290: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   */.  db = p->db
82a0: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  aDb = db->aD
82b0: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e  b;.  nDb = db->n
82c0: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d  Db;.  for(i=0, m
82d0: 61 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b  ask=1; i<nDb; i+
82e0: 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29  +, mask += mask)
82f0: 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26  {.    if( i!=1 &
8300: 26 20 28 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63  & (mask & p->loc
8310: 6b 4d 61 73 6b 29 21 3d 30 20 26 26 20 41 4c 57  kMask)!=0 && ALW
8320: 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d  AYS(aDb[i].pBt!=
8330: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
8340: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44  te3BtreeLeave(aD
8350: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d  b[i].pBt);.    }
8360: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
8370: 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  if defined(VDBE_
8380: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
8390: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
83a0: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  )./*.** Print a 
83b0: 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20  single opcode.  
83c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
83d0: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
83e0: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  ng only..*/.void
83f0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
8400: 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  tOp(FILE *pOut, 
8410: 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29  int pc, Op *pOp)
8420: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20  {.  char *zP4;. 
8430: 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a   char zPtr[50];.
8440: 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d    char zCom[100]
8450: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
8460: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20   char *zFormat1 
8470: 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64  = "%4d %-13s %4d
8480: 20 25 34 64 20 25 34 64 20 25 2d 31 33 73 20 25   %4d %4d %-13s %
8490: 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28  .2X %s\n";.  if(
84a0: 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20   pOut==0 ) pOut 
84b0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20  = stdout;.  zP4 
84c0: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
84d0: 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50   zPtr, sizeof(zP
84e0: 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  tr));.#ifdef SQL
84f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
8500: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69  IN_COMMENTS.  di
8510: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
8520: 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a  , zP4, zCom, siz
8530: 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73  eof(zCom));.#els
8540: 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b  e.  zCom[0] = 0;
8550: 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a  .#endif.  /* NB:
8560: 20 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63    The sqlite3Opc
8570: 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69  odeName() functi
8580: 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
8590: 64 20 62 79 20 63 6f 64 65 20 63 72 65 61 74 65  d by code create
85a0: 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b  d.  ** by the mk
85b0: 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20  opcodeh.awk and 
85c0: 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63  mkopcodec.awk sc
85d0: 72 69 70 74 73 20 77 68 69 63 68 20 65 78 74 72  ripts which extr
85e0: 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66  act the.  ** inf
85f0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
8600: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
8610: 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74  text */.  fprint
8620: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
8630: 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c  , pc, .      sql
8640: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
8650: 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70  Op->opcode), pOp
8660: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  ->p1, pOp->p2, p
8670: 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70  Op->p3, zP4, pOp
8680: 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d  ->p5,.      zCom
8690: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
86a0: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
86b0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
86c0: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
86d0: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
86e0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
86f0: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
8700: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
8710: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
8720: 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74  *pEnd;.    sqlit
8730: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
8740: 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61      u8 malloc_fa
8750: 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
8760: 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28  cFailed;.    if(
8770: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
8780: 64 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  d ){.      for(p
8790: 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e  End=&p[N]; p<pEn
87a0: 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; p++){.       
87b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
87c0: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
87d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
87e0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
87f0: 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20  for(pEnd=&p[N]; 
8800: 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20  p<pEnd; p++){.  
8810: 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b      assert( (&p[
8820: 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30  1])==pEnd || p[0
8830: 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b  ].db==p[1].db );
8840: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
8850: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
8860: 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20  emInvariants(p) 
8870: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
8880: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
8890: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
88a0: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
88b0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
88c0: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
88d0: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
88e0: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
88f0: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
8900: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
8910: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
8920: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
8930: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
8940: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
8950: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
8960: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
8970: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
8980: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
8990: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
89a0: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
89b0: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
89c0: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
89d0: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
89e0: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
89f0: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
8a00: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
8a10: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
8a20: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
8a30: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
8a40: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
8a50: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
8a60: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
8a70: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
8a80: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
8a90: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
8aa0: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
8ab0: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
8ac0: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
8ad0: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
8ae0: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
8af0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
8b00: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
8b10: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
8b20: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
8b30: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
8b40: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
8b50: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
8b60: 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20 29  lags & MEM_Agg )
8b70: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8b80: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
8b90: 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74 65  _Dyn );.      te
8ba0: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
8bb0: 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29 3b 0a   & MEM_Frame );.
8bc0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8bd0: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  p->flags & MEM_R
8be0: 6f 77 53 65 74 20 29 3b 0a 20 20 20 20 20 20 69  owSet );.      i
8bf0: 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d  f( p->flags&(MEM
8c00: 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  _Agg|MEM_Dyn|MEM
8c10: 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65  _Frame|MEM_RowSe
8c20: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  t) ){.        sq
8c30: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
8c40: 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65  ase(p);.      }e
8c50: 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c  lse if( p->zMall
8c60: 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  oc ){.        sq
8c70: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8c80: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
8c90: 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20       p->zMalloc 
8ca0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
8cb0: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d      p->flags = M
8cc0: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20  EM_Undefined;.  
8cd0: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c    }.    db->mall
8ce0: 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f  ocFailed = mallo
8cf0: 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a  c_failed;.  }.}.
8d00: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
8d10: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
8d20: 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74   and its content
8d30: 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a  s. VdbeFrame obj
8d40: 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ects are.** allo
8d50: 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  cated by the OP_
8d60: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
8d70: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  n sqlite3VdbeExe
8d80: 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c()..*/.void sql
8d90: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
8da0: 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ete(VdbeFrame *p
8db0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65  ){.  int i;.  Me
8dc0: 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72  m *aMem = VdbeFr
8dd0: 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62  ameMem(p);.  Vdb
8de0: 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20  eCursor **apCsr 
8df0: 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  = (VdbeCursor **
8e00: 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64  )&aMem[p->nChild
8e10: 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Mem];.  for(i=0;
8e20: 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b   i<p->nChildCsr;
8e30: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
8e40: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
8e50: 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29  (p->v, apCsr[i])
8e60: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
8e70: 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d  emArray(aMem, p-
8e80: 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73  >nChildMem);.  s
8e90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
8ea0: 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69  v->db, p);.}..#i
8eb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8ec0: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
8ed0: 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f  Give a listing o
8ee0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e  f the program in
8ef0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
8f00: 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hine..**.** The 
8f10: 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65  interface is the
8f20: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
8f30: 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74  VdbeExec().  But
8f40: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72   instead of.** r
8f50: 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c  unning the code,
8f60: 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20   it invokes the 
8f70: 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f  callback once fo
8f80: 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  r each instructi
8f90: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74  on..** This feat
8fa0: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ure is used to i
8fb0: 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49  mplement "EXPLAI
8fc0: 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  N"..**.** When p
8fd0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61  ->explain==1, ea
8fe0: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ch instruction i
8ff0: 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a  s listed.  When.
9000: 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  ** p->explain==2
9010: 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69  , only OP_Explai
9020: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61  n instructions a
9030: 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68  re listed and th
9040: 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e  ese.** are shown
9050: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
9060: 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c  format.  p->expl
9070: 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74  ain==2 is used t
9080: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45  o implement.** E
9090: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
90a0: 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d  N..**.** When p-
90b0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72  >explain==1, fir
90c0: 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  st the main prog
90d0: 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74  ram is listed, t
90e0: 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74  hen each of.** t
90f0: 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70 72  he trigger subpr
9100: 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65  ograms are liste
9110: 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f  d one by one..*/
9120: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
9130: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
9160: 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20  .){.  int nRow; 
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
9190: 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e  op when row coun
91a0: 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20 2a  t reaches this *
91b0: 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30  /.  int nSub = 0
91c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
91d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
91e0: 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  er of sub-vdbes 
91f0: 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
9200: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70   SubProgram **ap
9210: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
9220: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
9230: 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20  f sub-vdbes */. 
9240: 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20   Mem *pSub = 0; 
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9260: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
9270: 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20  cell hold array 
9280: 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20  of subprogs */. 
9290: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
92a0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
92b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
92c0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
92d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
9300: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
9310: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9320: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
9330: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
9340: 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ode */.  Mem *pM
9350: 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  em = &p->aMem[1]
9360: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
9370: 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65   First Mem of re
9380: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61  sult set */..  a
9390: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
93a0: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
93b0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
93c0: 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73  GIC_RUN );.  ass
93d0: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
93e0: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
93f0: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70  SQLITE_BUSY || p
9400: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
9410: 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  EM );..  /* Even
9420: 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63   though this opc
9430: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ode does not use
9440: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73   dynamic strings
9450: 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65   for.  ** the re
9460: 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c  sult, result col
9470: 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20  umns may become 
9480: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
9490: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
94a0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
94b0: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
94c0: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
94d0: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
94e0: 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
94f0: 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38  MemArray(pMem, 8
9500: 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  );.  p->pResultS
9510: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  et = 0;..  if( p
9520: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
9530: 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  EM ){.    /* Thi
9540: 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d  s happens if a m
9550: 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61  alloc() inside a
9560: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
9570: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f  _column_text() o
9580: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
9590: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
95a0: 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20   failed.  */.   
95b0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
95c0: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
95d0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
95e0: 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74    }..  /* When t
95f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
9600: 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73  put rows reaches
9610: 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e   nRow, that mean
9620: 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69  s the.  ** listi
9630: 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ng has finished 
9640: 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70  and sqlite3_step
9650: 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  () should return
9660: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
9670: 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73  ** nRow is the s
9680: 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  um of the number
9690: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
96a0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c  main program, pl
96b0: 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20  us.  ** the sum 
96c0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
96d0: 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69   rows in all tri
96e0: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
96f0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
9700: 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e  * so far.  The n
9710: 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69  Row value will i
9720: 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74  ncrease as new t
9730: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
9740: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f  ms are.  ** enco
9750: 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e  untered, but p->
9760: 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  pc will eventual
9770: 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e  ly catch up to n
9780: 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77  Row..  */.  nRow
9790: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28   = p->nOp;.  if(
97a0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
97b0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
97c0: 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  st 8 memory cell
97d0: 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74  s are used for t
97e0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
97f0: 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a  So we will.    *
9800: 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65  * commandeer the
9810: 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65   9th cell to use
9820: 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20   as storage for 
9830: 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
9840: 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ters.    ** to t
9850: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
9860: 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73  ms.  The VDBE is
9870: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68   guaranteed to h
9880: 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20  ave at least 9. 
9890: 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f     ** cells.  */
98a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
98b0: 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53  nMem>9 );.    pS
98c0: 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d  ub = &p->aMem[9]
98d0: 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  ;.    if( pSub->
98e0: 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29  flags&MEM_Blob )
98f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68  {.      /* On th
9900: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
9910: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20  sqlite3_step(), 
9920: 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61  pSub will hold a
9930: 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20   NULL.  It is.  
9940: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
9950: 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20  ed to a BLOB by 
9960: 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  the P4_SUBPROGRA
9970: 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  M processing log
9980: 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  ic below */.    
9990: 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e    nSub = pSub->n
99a0: 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a  /sizeof(Vdbe*);.
99b0: 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53        apSub = (S
99c0: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75  ubProgram **)pSu
99d0: 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b->z;.    }.    
99e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b  for(i=0; i<nSub;
99f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f   i++){.      nRo
9a00: 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e  w += apSub[i]->n
9a10: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  Op;.    }.  }.. 
9a20: 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e   do{.    i = p->
9a30: 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  pc++;.  }while( 
9a40: 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70  i<nRow && p->exp
9a50: 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f  lain==2 && p->aO
9a60: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
9a70: 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28  Explain );.  if(
9a80: 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20   i>=nRow ){.    
9a90: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
9aa0: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
9ab0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
9ac0: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
9ad0: 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20  terrupted ){.   
9ae0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
9af0: 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72  INTERRUPT;.    r
9b00: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
9b10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
9b20: 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
9b30: 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71  sg, db, "%s", sq
9b40: 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72  lite3ErrStr(p->r
9b50: 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  c));.  }else{.  
9b60: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20    char *zP4;.   
9b70: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66   Op *pOp;.    if
9b80: 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  ( i<p->nOp ){.  
9b90: 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
9ba0: 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73  t line number is
9bb0: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68   small enough th
9bc0: 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  at we are still 
9bd0: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
9be0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f  main program. */
9bf0: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d  .      pOp = &p-
9c00: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  >aOp[i];.    }el
9c10: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  se{.      /* We 
9c20: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69  are currently li
9c30: 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d  sting subprogram
9c40: 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77  s.  Figure out w
9c50: 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20  hich one and.   
9c60: 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68     ** pick up th
9c70: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70  e appropriate op
9c80: 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  code. */.      i
9c90: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d  nt j;.      i -=
9ca0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66   p->nOp;.      f
9cb0: 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62  or(j=0; i>=apSub
9cc0: 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a  [j]->nOp; j++){.
9cd0: 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53          i -= apS
9ce0: 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[j]->nOp;.    
9cf0: 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20    }.      pOp = 
9d00: 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69  &apSub[j]->aOp[i
9d10: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ];.    }.    if(
9d20: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
9d30: 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  {.      pMem->fl
9d40: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
9d50: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
9d60: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f     /* Program co
9d90: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  unter */.      p
9da0: 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20  Mem++;.  .      
9db0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
9dc0: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72  M_Static|MEM_Str
9dd0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
9de0: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
9df0: 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  *)sqlite3OpcodeN
9e00: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
9e10: 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20  ; /* Opcode */. 
9e20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
9e30: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
9e40: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
9e50: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
9e60: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
9e70: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
9e80: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
9e90: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ;..      /* When
9ea0: 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f   an OP_Program o
9eb0: 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74  pcode is encount
9ec0: 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63  er (the only opc
9ed0: 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20  ode that has.   
9ee0: 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52     ** a P4_SUBPR
9ef0: 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c  OGRAM argument),
9f00: 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65   expand the size
9f10: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66   of the array of
9f20: 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20   subprograms.   
9f30: 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d     ** kept in p-
9f40: 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f  >aMem[9].z to ho
9f50: 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72  ld the new progr
9f60: 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68  am - assuming th
9f70: 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20  is subprogram.  
9f80: 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61      ** has not a
9f90: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e  lready been seen
9fa0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
9fb0: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
9fc0: 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  ==P4_SUBPROGRAM 
9fd0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
9fe0: 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a  Byte = (nSub+1)*
9ff0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
a000: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  m*);.        int
a010: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
a020: 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b  j=0; j<nSub; j++
a030: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
a040: 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e   apSub[j]==pOp->
a050: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72  p4.pProgram ) br
a060: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
a070: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53         if( j==nS
a080: 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  ub && SQLITE_OK=
a090: 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47  =sqlite3VdbeMemG
a0a0: 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c  row(pSub, nByte,
a0b0: 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20 20 20   nSub!=0) ){.   
a0c0: 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28         apSub = (
a0d0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
a0e0: 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20  ub->z;.         
a0f0: 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d   apSub[nSub++] =
a100: 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61   pOp->p4.pProgra
a110: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  m;.          pSu
a120: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  b->flags |= MEM_
a130: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20  Blob;.          
a140: 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73  pSub->n = nSub*s
a150: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
a160: 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  *);.        }.  
a170: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
a180: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
a190: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
a1a0: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b  ->u.i = pOp->p1;
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
a1d0: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
a1e0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
a1f0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
a200: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
a210: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a230: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  P2 */.    pMem++
a240: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
a250: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
a260: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
a270: 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20  p->p3;          
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a290: 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P3 */.    pMe
a2a0: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71  m++;..    if( sq
a2b0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
a2c0: 28 70 4d 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b  (pMem, 32, 0) ){
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a2e0: 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  4 */.      asser
a2f0: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
a300: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
a310: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
a320: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
a330: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
a340: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
a350: 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79     zP4 = display
a360: 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c  P4(pOp, pMem->z,
a370: 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50   32);.    if( zP
a380: 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20  4!=pMem->z ){.  
a390: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
a3a0: 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a  emSetStr(pMem, z
a3b0: 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  P4, -1, SQLITE_U
a3c0: 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  TF8, 0);.    }el
a3d0: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
a3e0: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
a3f0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
a400: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
a410: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
a420: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
a430: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20  TE_UTF8;.    }. 
a440: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
a450: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
a460: 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  1 ){.      if( s
a470: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
a480: 77 28 70 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b  w(pMem, 4, 0) ){
a490: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a4a0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
a4b0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
a4c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
a4d0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
a4e0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
a4f0: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
a500: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  m;.      pMem->n
a510: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
a520: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20  te3_snprintf(3, 
a530: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c  pMem->z, "%.2x",
a540: 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20   pOp->p5);   /* 
a550: 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P5 */.      pMem
a560: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
a570: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
a580: 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c  +;.  .#ifdef SQL
a590: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
a5a0: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
a5b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
a5c0: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 35  eMemGrow(pMem, 5
a5d0: 30 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  00, 0) ){.      
a5e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
a5f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
a600: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
a610: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
a620: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
a630: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
a640: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
a650: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70    pMem->n = disp
a660: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
a670: 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30  zP4, pMem->z, 50
a680: 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0);.      pMem->
a690: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
a6a0: 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70  8;.#else.      p
a6b0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
a6c0: 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  _Null;          
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a6e0: 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69  Comment */.#endi
a6f0: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  f.    }..    p->
a700: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
a710: 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   4*(p->explain-1
a720: 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c  );.    p->pResul
a730: 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  tSet = &p->aMem[
a740: 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  1];.    p->rc = 
a750: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
a760: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
a770: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
a780: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
a790: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
a7a0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
a7b0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
a7c0: 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61  rint the SQL tha
a7d0: 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65  t was used to ge
a7e0: 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72  nerate a VDBE pr
a7f0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
a800: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53  qlite3VdbePrintS
a810: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63  ql(Vdbe *p){.  c
a820: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30  onst char *z = 0
a830: 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20  ;.  if( p->zSql 
a840: 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53  ){.    z = p->zS
a850: 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ql;.  }else if( 
a860: 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20  p->nOp>=1 ){.   
a870: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70   const VdbeOp *p
a880: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
a890: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
a8a0: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26  code==OP_Init &&
a8b0: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
a8c0: 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e  .      z = pOp->
a8d0: 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c  p4.z;.      whil
a8e0: 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  e( sqlite3Isspac
a8f0: 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
a900: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29   }.  }.  if( z )
a910: 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25   printf("SQL: [%
a920: 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e  s]\n", z);.}.#en
a930: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
a940: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
a950: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
a960: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
a970: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69  TRACE)./*.** Pri
a980: 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65  nt an IOTRACE me
a990: 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51  ssage showing SQ
a9a0: 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f  L content..*/.vo
a9b0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f  id sqlite3VdbeIO
a9c0: 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70  TraceSql(Vdbe *p
a9d0: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
a9e0: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
a9f0: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69  *pOp;.  if( sqli
aa00: 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20  te3IoTrace==0 ) 
aa10: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f  return;.  if( nO
aa20: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
aa30: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
aa40: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
aa50: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
aa60: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
aa70: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
aa80: 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a    char z[1000];.
aa90: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
aaa0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
aab0: 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  z, "%s", pOp->p4
aac0: 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  .z);.    for(i=0
aad0: 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ; sqlite3Isspace
aae0: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
aaf0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
ab00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
ab10: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
ab20: 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  (z[i]) ){.      
ab30: 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20    if( z[i-1]!=' 
ab40: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
ab50: 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [j++] = ' ';.   
ab60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
ab70: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b  se{.        z[j+
ab80: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20  +] = z[i];.     
ab90: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
aba0: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
abb0: 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25  e3IoTrace("SQL %
abc0: 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  s\n", z);.  }.}.
abd0: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
abe0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20  E_OMIT_TRACE && 
abf0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
ac00: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TRACE */../*.** 
ac10: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
ac20: 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65  rom a fixed size
ac30: 20 62 75 66 66 65 72 20 61 6e 64 20 72 65 74 75   buffer and retu
ac40: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
ac50: 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20 20  ** that space.  
ac60: 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20  If insufficient 
ac70: 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
ac80: 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  le, return NULL.
ac90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20  .**.** The pBuf 
aca0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
acb0: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   initial value o
acc0: 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63  f a pointer whic
acd0: 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76  h will.** receiv
ace0: 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79  e the new memory
acf0: 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61  .  pBuf is norma
ad00: 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42  lly NULL.  If pB
ad10: 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c  uf is not.** NUL
ad20: 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
ad30: 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61   memory space ha
ad40: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
ad50: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61  llocated and tha
ad60: 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  t.** this routin
ad70: 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c  e should not all
ad80: 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65  ocate any new me
ad90: 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66  mory.  When pBuf
ada0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20   is not.** NULL 
adb0: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42  simply return pB
adc0: 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61  uf.  Only alloca
add0: 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70  te new memory sp
ade0: 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a  ace when pBuf.**
adf0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
ae00: 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d  nByte is the num
ae10: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
ae20: 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a  space needed..**
ae30: 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e  .** *ppFrom poin
ae40: 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20  ts to available 
ae50: 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70  space and pEnd p
ae60: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64  oints to the end
ae70: 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c   of the.** avail
ae80: 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68 65  able space.  Whe
ae90: 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63  n space is alloc
aea0: 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73  ated, *ppFrom is
aeb0: 20 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a 2a   advanced past.*
aec0: 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
aed0: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
aee0: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20  ..**.** *pnByte 
aef0: 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20  is a counter of 
af00: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
af10: 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 68 61  tes of space tha
af20: 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a  t have failed.**
af30: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49   to allocate.  I
af40: 66 20 74 68 65 72 65 20 69 73 20 69 6e 73 75 66  f there is insuf
af50: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e  ficient space in
af60: 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69   *ppFrom to sati
af70: 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  sfy the.** reque
af80: 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  st, then increme
af90: 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68  nt *pnByte by th
afa0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
afb0: 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74  request..*/.stat
afc0: 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70  ic void *allocSp
afd0: 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75  ace(.  void *pBu
afe0: 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  f,          /* W
aff0: 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e  here return poin
b000: 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  ter will be stor
b010: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ed */.  int nByt
b020: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
b030: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
b040: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
b050: 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20   u8 **ppFrom,   
b060: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
b070: 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a   Allocate from *
b080: 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a  ppFrom */.  u8 *
b090: 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  pEnd,           
b0a0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31   /* Pointer to 1
b0b0: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65   byte past the e
b0c0: 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75  nd of *ppFrom bu
b0d0: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ffer */.  int *p
b0e0: 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 2f  nByte          /
b0f0: 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  * If allocation 
b100: 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20  cannot be made, 
b110: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74  increment *pnByt
b120: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
b130: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
b140: 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20  GNMENT(*ppFrom) 
b150: 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29 20  );.  if( pBuf ) 
b160: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e  return pBuf;.  n
b170: 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42  Byte = ROUND8(nB
b180: 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a 70  yte);.  if( &(*p
b190: 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d  pFrom)[nByte] <=
b1a0: 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42 75   pEnd ){.    pBu
b1b0: 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46 72  f = (void*)*ppFr
b1c0: 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20  om;.    *ppFrom 
b1d0: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73  += nByte;.  }els
b1e0: 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b  e{.    *pnByte +
b1f0: 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72  = nByte;.  }.  r
b200: 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f  eturn pBuf;.}../
b210: 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20  *.** Rewind the 
b220: 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65  VDBE back to the
b230: 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72   beginning in pr
b240: 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a  eparation for.**
b250: 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a   running it..*/.
b260: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
b270: 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b  Rewind(Vdbe *p){
b280: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
b290: 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
b2a0: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
b2b0: 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e  LE).  int i;.#en
b2c0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21  dif.  assert( p!
b2d0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b2e0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
b2f0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20  AGIC_INIT );..  
b300: 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  /* There should 
b310: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
b320: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  opcode..  */.  a
b330: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
b340: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
b350: 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d   magic to VDBE_M
b360: 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20  AGIC_RUN sooner 
b370: 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
b380: 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63  r. */.  p->magic
b390: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
b3a0: 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  N;..#ifdef SQLIT
b3b0: 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d  E_DEBUG.  for(i=
b3c0: 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  1; i<p->nMem; i+
b3d0: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
b3e0: 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70  p->aMem[i].db==p
b3f0: 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ->db );.  }.#end
b400: 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b  if.  p->pc = -1;
b410: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
b420: 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72  E_OK;.  p->error
b430: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
b440: 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  t;.  p->magic = 
b450: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
b460: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
b470: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
b480: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
b490: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
b4a0: 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d  55;.  p->iStatem
b4b0: 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46  ent = 0;.  p->nF
b4c0: 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b  kConstraint = 0;
b4d0: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
b4e0: 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20  FILE.  for(i=0; 
b4f0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
b500: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
b510: 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f  t = 0;.    p->aO
b520: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
b530: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
b540: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
b550: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
b560: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72  or execution for
b570: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
b580: 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e  after.** creatin
b590: 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  g the virtual ma
b5a0: 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76  chine.  This inv
b5b0: 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63  olves things suc
b5c0: 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69  h.** as allocati
b5d0: 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61  ng stack space a
b5e0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
b5f0: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
b600: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
b610: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
b620: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
b630: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
b640: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
b650: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
b660: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
b670: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
b680: 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63  y be called exac
b690: 74 20 6f 6e 63 65 20 6f 6e 20 61 20 65 61 63 68  t once on a each
b6a0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
b6b0: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  ..** After this 
b6c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
b6d0: 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
b6e0: 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64  n "packaged" and
b6f0: 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20   is ready.** to 
b700: 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73  run.  After this
b710: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
b720: 65 64 2c 20 66 75 74 68 65 72 20 63 61 6c 6c 73  ed, futher calls
b730: 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
b740: 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74  dbeAddOp() funct
b750: 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69  ions are prohibi
b760: 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ted.  This routi
b770: 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a  ne disconnects.*
b780: 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  * the Vdbe from 
b790: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
b7a0: 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e   that helped gen
b7b0: 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74  erate it so that
b7c0: 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65   the.** the Vdbe
b7d0: 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65   becomes an inde
b7e0: 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61  pendent entity a
b7f0: 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  nd the Parse obj
b800: 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65  ect can be.** de
b810: 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55  stroyed..**.** U
b820: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
b830: 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65  beRewind() proce
b840: 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20  dure to restore 
b850: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
b860: 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73  e back.** to its
b870: 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61   initial state a
b880: 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  fter it has been
b890: 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   run..*/.void sq
b8a0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
b8b0: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
b8e0: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
b8f0: 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  rse             
b900: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
b910: 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
b920: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b940: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
b950: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
b960: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
b970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b980: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d   Number of param
b990: 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  eters */.  int n
b9a0: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
b9b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b9c0: 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79  ber of VM memory
b9d0: 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
b9e0: 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20  int nCursor;    
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
ba10: 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ors required */.
ba20: 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
ba50: 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72  guments in subpr
ba60: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
ba70: 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20  nOnce;          
ba80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ba90: 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20  mber of OP_Once 
baa0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a  instructions */.
bab0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bad0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
bae0: 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20   */.  u8 *zCsr; 
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb00: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61       /* Memory a
bb10: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
bb20: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  ocation */.  u8 
bb30: 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *zEnd;          
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
bb50: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 61  irst byte past a
bb60: 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20  llocated memory 
bb70: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20      /* How much 
bba0: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20  extra memory is 
bbb0: 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73  needed */..  ass
bbc0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
bbd0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
bbe0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
bbf0: 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
bc00: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
bc10: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
bc20: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
bc30: 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a  e==p->pParse );.
bc40: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
bc50: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
bc60: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20  ocFailed==0 );. 
bc70: 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e   nVar = pParse->
bc80: 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70  nVar;.  nMem = p
bc90: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e  Parse->nMem;.  n
bca0: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
bcb0: 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20  >nTab;.  nArg = 
bcc0: 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b  pParse->nMaxArg;
bcd0: 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73  .  nOnce = pPars
bce0: 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20  e->nOnce;.  if( 
bcf0: 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65  nOnce==0 ) nOnce
bd00: 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20   = 1; /* Ensure 
bd10: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74  at least one byt
bd20: 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  e in p->aOnceFla
bd30: 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46  g[] */.  .  /* F
bd40: 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 72  or each cursor r
bd50: 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c  equired, also al
bd60: 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20  locate a memory 
bd70: 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a  cell. Memory.  *
bd80: 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d  * cells (nMem+1-
bd90: 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20  nCursor)..nMem, 
bda0: 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20  inclusive, will 
bdb0: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79  never be used by
bdc0: 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70  .  ** the vdbe p
bdd0: 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20  rogram. Instead 
bde0: 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74 6f  they are used to
bdf0: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
be00: 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72  for.  ** VdbeCur
be10: 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72  sor/BtCursor str
be20: 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f  uctures. The blo
be30: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
be40: 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a  ciated with .  *
be50: 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74  * cursor 0 is st
be60: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63  ored in memory c
be70: 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79  ell nMem. Memory
be80: 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20   cell (nMem-1). 
be90: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62   ** stores the b
bea0: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
beb0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
bec0: 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a  rsor 1, etc..  *
bed0: 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  *.  ** See also:
bee0: 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
bef0: 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
bf00: 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  = nCursor;..  /*
bf10: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
bf20: 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  for memory regis
bf30: 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62  ters, SQL variab
bf40: 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72  les, VDBE cursor
bf50: 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61  s and .  ** an a
bf60: 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20  rray to marshal 
bf70: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67  SQL function arg
bf80: 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a  uments in..  */.
bf90: 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70    zCsr = (u8*)&p
bfa0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20  ->aOp[p->nOp];  
bfb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
bfc0: 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f  ory avaliable fo
bfd0: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
bfe0: 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26 70    zEnd = (u8*)&p
bff0: 2d 3e 61 4f 70 5b 70 50 61 72 73 65 2d 3e 6e 4f  ->aOp[pParse->nO
c000: 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72  pAlloc];  /* Fir
c010: 73 74 20 62 79 74 65 20 70 61 73 74 20 65 6e 64  st byte past end
c020: 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20   of zCsr[] */.. 
c030: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
c040: 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d  (p, &nArg);.  p-
c050: 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
c060: 20 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e   = (u8)(pParse->
c070: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20  isMultiWrite && 
c080: 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
c090: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
c0a0: 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  >explain && nMem
c0b0: 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20  <10 ){.    nMem 
c0c0: 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  = 10;.  }.  mems
c0d0: 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64  et(zCsr, 0, zEnd
c0e0: 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73 72 20 2b  -zCsr);.  zCsr +
c0f0: 3d 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30  = (zCsr - (u8*)0
c100: 29 26 37 3b 0a 20 20 61 73 73 65 72 74 28 20 45  )&7;.  assert( E
c110: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
c120: 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 70  ENT(zCsr) );.  p
c130: 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a  ->expired = 0;..
c140: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20    /* Memory for 
c150: 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d  registers, param
c160: 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65  eters, cursor, e
c170: 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  tc, is allocated
c180: 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73   in two.  ** pas
c190: 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72  ses.  On the fir
c1a0: 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20  st pass, we try 
c1b0: 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20  to reuse unused 
c1c0: 73 70 61 63 65 20 61 74 20 74 68 65 20 0a 20 20  space at the .  
c1d0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  ** end of the op
c1e0: 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20  code array.  If 
c1f0: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
c200: 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d   satisfy all mem
c210: 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  ory.  ** require
c220: 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67  ments by reusing
c230: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
c240: 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65  y tail, then the
c250: 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73   second.  ** pas
c260: 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74  s will fill in t
c270: 68 65 20 72 65 73 74 20 75 73 69 6e 67 20 61 20  he rest using a 
c280: 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e  fresh allocation
c290: 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
c2a0: 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72  is two-pass appr
c2b0: 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 65 73  oach that reuses
c2c0: 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
c2d0: 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d  as possible from
c2e0: 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76  .  ** the leftov
c2f0: 65 72 20 73 70 61 63 65 20 61 74 20 74 68 65 20  er space at the 
c300: 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  end of the opcod
c310: 65 20 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e  e array can sign
c320: 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72  ificantly.  ** r
c330: 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74  educe the amount
c340: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20   of memory held 
c350: 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74  by a prepared st
c360: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
c370: 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  do {.    nByte =
c380: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20   0;.    p->aMem 
c390: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
c3a0: 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f  aMem, nMem*sizeo
c3b0: 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a  f(Mem), &zCsr, z
c3c0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
c3d0: 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f    p->aVar = allo
c3e0: 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20  cSpace(p->aVar, 
c3f0: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
c400: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
c410: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
c420: 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pArg = allocSpac
c430: 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67  e(p->apArg, nArg
c440: 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26  *sizeof(Mem*), &
c450: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
c460: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61  te);.    p->azVa
c470: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
c480: 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69  ->azVar, nVar*si
c490: 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43  zeof(char*), &zC
c4a0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
c4b0: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20  );.    p->apCsr 
c4c0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
c4d0: 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73  apCsr, nCursor*s
c4e0: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
c4f0: 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  *),.            
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
c510: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
c520: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65  e);.    p->aOnce
c530: 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  Flag = allocSpac
c540: 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20  e(p->aOnceFlag, 
c550: 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45  nOnce, &zCsr, zE
c560: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
c570: 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20   if( nByte ){.  
c580: 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73      p->pFree = s
c590: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
c5a0: 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  ro(db, nByte);. 
c5b0: 20 20 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20     }.    zCsr = 
c5c0: 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a 45  p->pFree;.    zE
c5d0: 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65  nd = &zCsr[nByte
c5e0: 5d 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42 79  ];.  }while( nBy
c5f0: 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  te && !db->mallo
c600: 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d  cFailed );..  p-
c610: 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73  >nCursor = nCurs
c620: 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c  or;.  p->nOnceFl
c630: 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66  ag = nOnce;.  if
c640: 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20  ( p->aVar ){.   
c650: 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61   p->nVar = (ynVa
c660: 72 29 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72 28  r)nVar;.    for(
c670: 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b  n=0; n<nVar; n++
c680: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72  ){.      p->aVar
c690: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
c6a0: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Null;.      p->a
c6b0: 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  Var[n].db = db;.
c6c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
c6d0: 70 2d 3e 61 7a 56 61 72 20 29 7b 0a 20 20 20 20  p->azVar ){.    
c6e0: 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73  p->nzVar = pPars
c6f0: 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65  e->nzVar;.    me
c700: 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70  mcpy(p->azVar, p
c710: 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d  Parse->azVar, p-
c720: 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d  >nzVar*sizeof(p-
c730: 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20  >azVar[0]));.   
c740: 20 6d 65 6d 73 65 74 28 70 50 61 72 73 65 2d 3e   memset(pParse->
c750: 61 7a 56 61 72 2c 20 30 2c 20 70 50 61 72 73 65  azVar, 0, pParse
c760: 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70  ->nzVar*sizeof(p
c770: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29  Parse->azVar[0])
c780: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
c790: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61  aMem ){.    p->a
c7a0: 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20  Mem--;          
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
c7c0: 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20  Mem[] goes from 
c7d0: 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70  1..nMem */.    p
c7e0: 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20  ->nMem = nMem;  
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c800: 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d  *       not from
c810: 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20   0..nMem-1 */.  
c820: 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d    for(n=1; n<=nM
c830: 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  em; n++){.      
c840: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73  p->aMem[n].flags
c850: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64   = MEM_Undefined
c860: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b  ;.      p->aMem[
c870: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
c880: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61  }.  }.  p->expla
c890: 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70  in = pParse->exp
c8a0: 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  lain;.  sqlite3V
c8b0: 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a  dbeRewind(p);.}.
c8c0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56  ./*.** Close a V
c8d0: 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72  DBE cursor and r
c8e0: 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72  elease all the r
c8f0: 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75  esources that cu
c900: 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73  rsor .** happens
c910: 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69   to hold..*/.voi
c920: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65  d sqlite3VdbeFre
c930: 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c  eCursor(Vdbe *p,
c940: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78   VdbeCursor *pCx
c950: 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20  ){.  if( pCx==0 
c960: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
c970: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
c980: 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64  SorterClose(p->d
c990: 62 2c 20 70 43 78 29 3b 0a 20 20 69 66 28 20 70  b, pCx);.  if( p
c9a0: 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73  Cx->pBt ){.    s
c9b0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
c9c0: 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pCx->pBt);.    
c9d0: 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72  /* The pCx->pCur
c9e0: 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73  sor will be clos
c9f0: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c  e automatically,
ca00: 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62   if it exists, b
ca10: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c  y.    ** the cal
ca20: 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65  l above. */.  }e
ca30: 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75  lse if( pCx->pCu
ca40: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
ca50: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
ca60: 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72  sor(pCx->pCursor
ca70: 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  );.  }.#ifndef S
ca80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
ca90: 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43  ALTABLE.  if( pC
caa0: 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29  x->pVtabCursor )
cab0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74  {.    sqlite3_vt
cac0: 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
cad0: 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56  Cursor = pCx->pV
cae0: 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63  tabCursor;.    c
caf0: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
cb00: 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70  ule *pModule = p
cb10: 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
cb20: 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20  b->pModule;.    
cb30: 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
cb40: 3d 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65  = 1;.    pModule
cb50: 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75  ->xClose(pVtabCu
cb60: 72 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  rsor);.    p->in
cb70: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a  VtabMethod = 0;.
cb80: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
cb90: 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c  .** Copy the val
cba0: 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
cbb0: 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75  e VdbeFrame stru
cbc0: 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62  cture to its Vdb
cbd0: 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73  e. This.** is us
cbe0: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ed, for example,
cbf0: 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20   when a trigger 
cc00: 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68  sub-program is h
cc10: 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65  alted to restore
cc20: 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  .** control to t
cc30: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  he main program.
cc40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
cc50: 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28  dbeFrameRestore(
cc60: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
cc70: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
cc80: 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e  pFrame->v;.  v->
cc90: 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61  aOnceFlag = pFra
cca0: 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20  me->aOnceFlag;. 
ccb0: 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20   v->nOnceFlag = 
ccc0: 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61  pFrame->nOnceFla
ccd0: 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46  g;.  v->aOp = pF
cce0: 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e  rame->aOp;.  v->
ccf0: 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f  nOp = pFrame->nO
cd00: 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70  p;.  v->aMem = p
cd10: 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76  Frame->aMem;.  v
cd20: 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->nMem = pFrame-
cd30: 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73  >nMem;.  v->apCs
cd40: 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73  r = pFrame->apCs
cd50: 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20  r;.  v->nCursor 
cd60: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f  = pFrame->nCurso
cd70: 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74  r;.  v->db->last
cd80: 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e  Rowid = pFrame->
cd90: 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e  lastRowid;.  v->
cda0: 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65  nChange = pFrame
cdb0: 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65 74  ->nChange;.  ret
cdc0: 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a  urn pFrame->pc;.
cdd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
cde0: 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a  ll cursors..**.*
cdf0: 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61  * Also release a
ce00: 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  ny dynamic memor
ce10: 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d  y held by the VM
ce20: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65   in the Vdbe.aMe
ce30: 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c  m memory .** cel
ce40: 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73  l array. This is
ce50: 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68   necessary as th
ce60: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72  e memory cell ar
ce70: 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a  ray may contain.
ce80: 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56  ** pointers to V
ce90: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
cea0: 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74  , which may in t
ceb0: 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  urn contain poin
cec0: 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20  ters to.** open 
ced0: 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74  cursors..*/.stat
cee0: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c  ic void closeAll
cef0: 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29  Cursors(Vdbe *p)
cf00: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  {.  if( p->pFram
cf10: 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
cf20: 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20  me *pFrame;.    
cf30: 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46  for(pFrame=p->pF
cf40: 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50  rame; pFrame->pP
cf50: 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46  arent; pFrame=pF
cf60: 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  rame->pParent);.
cf70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
cf80: 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61  rameRestore(pFra
cf90: 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 46  me);.  }.  p->pF
cfa0: 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  rame = 0;.  p->n
cfb0: 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66  Frame = 0;..  if
cfc0: 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20  ( p->apCsr ){.  
cfd0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
cfe0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
cff0: 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
d000: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d  VdbeCursor *pC =
d010: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
d020: 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20      if( pC ){.  
d030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d040: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
d050: 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  C);.        p->a
d060: 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pCsr[i] = 0;.   
d070: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
d080: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
d090: 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72      releaseMemAr
d0a0: 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c  ray(&p->aMem[1],
d0b0: 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20   p->nMem);.  }. 
d0c0: 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46   while( p->pDelF
d0d0: 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
d0e0: 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d  Frame *pDel = p-
d0f0: 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20  >pDelFrame;.    
d100: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70  p->pDelFrame = p
d110: 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  Del->pParent;.  
d120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
d130: 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a  meDelete(pDel);.
d140: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
d150: 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c   any auxdata all
d160: 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ocations made by
d170: 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 73 71 6c   the VM */.  sql
d180: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
d190: 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b  xData(p, -1, 0);
d1a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41  .  assert( p->pA
d1b0: 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a  uxData==0 );.}..
d1c0: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74  /*.** Clean up t
d1d0: 68 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63  he VM after exec
d1e0: 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ution..**.** Thi
d1f0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61  s routine will a
d200: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
d210: 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20  se any cursors, 
d220: 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a  lists, and/or.**
d230: 20 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65   sorters that we
d240: 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49  re left open.  I
d250: 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74  t also deletes t
d260: 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20  he values of.** 
d270: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65  variables in the
d280: 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a   aVar[] array..*
d290: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c  /.static void Cl
d2a0: 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a  eanup(Vdbe *p){.
d2b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d2c0: 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53  p->db;..#ifdef S
d2d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
d2e0: 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28   Execute assert(
d2f0: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
d300: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
d310: 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64  Vdbe.apCsr[] and
d320: 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d   .  ** Vdbe.aMem
d330: 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61  [] arrays have a
d340: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61  lready been clea
d350: 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e  ned up.  */.  in
d360: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
d370: 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69  Csr ) for(i=0; i
d380: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
d390: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43  ) assert( p->apC
d3a0: 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66  sr[i]==0 );.  if
d3b0: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
d3c0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e   for(i=1; i<=p->
d3d0: 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72  nMem; i++) asser
d3e0: 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c  t( p->aMem[i].fl
d3f0: 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e  ags==MEM_Undefin
d400: 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ed );.  }.#endif
d410: 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
d420: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
d430: 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
d440: 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c  = 0;.  p->pResul
d450: 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tSet = 0;.}../*.
d460: 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
d470: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
d480: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
d490: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
d4a0: 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65  s SQL.** stateme
d4b0: 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20  nt. This is now 
d4c0: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  set at compile t
d4d0: 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ime, rather than
d4e0: 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75   during.** execu
d4f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65  tion of the vdbe
d500: 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74   program so that
d510: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
d520: 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62  count() can.** b
d530: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53  e called on an S
d540: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66  QL statement bef
d550: 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ore sqlite3_step
d560: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
d570: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
d580: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  s(Vdbe *p, int n
d590: 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65  ResColumn){.  Me
d5a0: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69  m *pColName;.  i
d5b0: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
d5c0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
d5d0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
d5e0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
d5f0: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
d600: 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  ME_N);.  sqlite3
d610: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
d620: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e  olName);.  n = n
d630: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
d640: 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
d650: 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73  lumn = (u16)nRes
d660: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
d670: 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65  lName = pColName
d680: 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33   = (Mem*)sqlite3
d690: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
d6a0: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
d6b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
d6c0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
d6d0: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
d6e0: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  0 ){.    pColNam
d6f0: 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  e->flags = MEM_N
d700: 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  ull;.    pColNam
d710: 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  e->db = p->db;. 
d720: 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20     pColName++;. 
d730: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
d740: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
d750: 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
d760: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
d770: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
d780: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
d790: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
d7a0: 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
d7b0: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
d7c0: 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
d7d0: 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
d7e0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
d7f0: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
d800: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20  **.** The final 
d810: 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c  parameter, xDel,
d820: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
d830: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
d840: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a  SQLITE_STATIC.**
d850: 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   or SQLITE_TRANS
d860: 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53  IENT. If it is S
d870: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74  QLITE_DYNAMIC, t
d880: 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70  hen the buffer p
d890: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
d8a0: 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72  zName will be fr
d8b0: 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62  eed by sqlite3Db
d8c0: 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  Free() when the 
d8d0: 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65  vdbe is destroye
d8e0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
d8f0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d900: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d920: 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e      /* Vdbe bein
d930: 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a  g configured */.
d940: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d960: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
d970: 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c  olumn zName appl
d980: 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ies to */.  int 
d990: 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  var,            
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d9b0: 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41  One of the COLNA
d9c0: 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a  ME_* constants *
d9d0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
d9e0: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
d9f0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
da00: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
da10: 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76  ning name */.  v
da20: 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64  oid (*xDel)(void
da30: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
da40: 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  /* Memory manage
da50: 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f  ment strategy fo
da60: 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  r zName */.){.  
da70: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70  int rc;.  Mem *p
da80: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  ColName;.  asser
da90: 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f  t( idx<p->nResCo
daa0: 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
dab0: 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20  ( var<COLNAME_N 
dac0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
dad0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
dae0: 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61      assert( !zNa
daf0: 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49  me || xDel!=SQLI
db00: 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20  TE_DYNAMIC );.  
db10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
db20: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73  NOMEM;.  }.  ass
db30: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  ert( p->aColName
db40: 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d  !=0 );.  pColNam
db50: 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d  e = &(p->aColNam
db60: 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65  e[idx+var*p->nRe
db70: 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20  sColumn]);.  rc 
db80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
db90: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
dba0: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
dbb0: 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a  TE_UTF8, xDel);.
dbc0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20    assert( rc!=0 
dbd0: 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43  || !zName || (pC
dbe0: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45  olName->flags&ME
dbf0: 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20  M_Term)!=0 );.  
dc00: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
dc10: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72  .** A read or wr
dc20: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
dc30: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
dc40: 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61  e active on data
dc50: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
dc60: 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  b. If a transact
dc70: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63  ion is active, c
dc80: 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65  ommit it. If the
dc90: 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65  re is a.** write
dca0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61  -transaction spa
dcb0: 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  nning more than 
dcc0: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
dcd0: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  e, this routine.
dce0: 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ** takes care of
dcf0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
dd00: 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f  nal trickery..*/
dd10: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
dd20: 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  Commit(sqlite3 *
dd30: 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
dd40: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72  int i;.  int nTr
dd50: 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d  ans = 0;  /* Num
dd60: 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73  ber of databases
dd70: 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20   with an active 
dd80: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
dd90: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
dda0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
ddb0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30   needXcommit = 0
ddc0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
ddd0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
dde0: 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69  LE.  /* With thi
ddf0: 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65  s option, sqlite
de00: 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64  3VtabSync() is d
de10: 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d  efined to be sim
de20: 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45  ply .  ** SQLITE
de30: 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20  _OK so p is not 
de40: 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e  used. .  */.  UN
de50: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
de60: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
de70: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
de80: 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c  thing else, call
de90: 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
dea0: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20  lback for any.  
deb0: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
dec0: 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e  e tables written
ded0: 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63   in this transac
dee0: 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74  tion. This has t
def0: 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62  o.  ** be done b
df00: 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e  efore determinin
df10: 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74  g whether a mast
df20: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
df30: 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
df40: 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29  d, as an xSync()
df50: 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64   callback may ad
df60: 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  d an attached da
df70: 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74  tabase.  ** to t
df80: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
df90: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
dfa0: 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20  te3VtabSync(db, 
dfb0: 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  p);..  /* This l
dfc0: 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28  oop determines (
dfd0: 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74  a) if the commit
dfe0: 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20   hook should be 
dff0: 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a  invoked and.  **
e000: 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61   (b) how many da
e010: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76  tabase files hav
e020: 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  e open write tra
e030: 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a  nsactions, not .
e040: 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74    ** including t
e050: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
e060: 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61  . (b) is importa
e070: 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f  nt because if mo
e080: 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e  re than .  ** on
e090: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
e0a0: 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  has an open writ
e0b0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
e0c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
e0d0: 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71    ** file is req
e0e0: 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f  uired for an ato
e0f0: 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f  mic commit..  */
e100: 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d   .  for(i=0; rc=
e110: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
e120: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
e130: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
e140: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
e150: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
e160: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
e170: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65  Bt) ){.      nee
e180: 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  dXcommit = 1;.  
e190: 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e      if( i!=1 ) n
e1a0: 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73  Trans++;.      s
e1b0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
e1c0: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20  (pBt);.      rc 
e1d0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78  = sqlite3PagerEx
e1e0: 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69  clusiveLock(sqli
e1f0: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
e200: 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t));.      sqlit
e210: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
e220: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
e230: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e240: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
e250: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  c;.  }..  /* If 
e260: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72  there are any wr
e270: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite-transactions
e280: 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20   at all, invoke 
e290: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
e2a0: 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f  */.  if( needXco
e2b0: 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d  mmit && db->xCom
e2c0: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  mitCallback ){. 
e2d0: 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d     rc = db->xCom
e2e0: 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  mitCallback(db->
e2f0: 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20  pCommitArg);.   
e300: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
e310: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e320: 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
e330: 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  HOOK;.    }.  }.
e340: 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65  .  /* The simple
e350: 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20   case - no more 
e360: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
e370: 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e  e file (not coun
e380: 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45  ting the.  ** TE
e390: 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73  MP database) has
e3a0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61   a transaction a
e3b0: 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69  ctive.   There i
e3c0: 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68  s no need for th
e3d0: 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f  e.  ** master-jo
e3e0: 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  urnal..  **.  **
e3f0: 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
e400: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42  alue of sqlite3B
e410: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
e420: 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67  ) is a zero leng
e430: 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20  th.  ** string, 
e440: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69  it means the mai
e450: 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d  n database is :m
e460: 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70  emory: or a temp
e470: 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a   file.  In .  **
e480: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f   that case we do
e490: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f   not support ato
e4a0: 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63  mic multi-file c
e4b0: 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74  ommits, so use t
e4c0: 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20  he .  ** simple 
e4d0: 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20  case then too.. 
e4e0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c   */.  if( 0==sql
e4f0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c  ite3Strlen30(sql
e500: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
e510: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
e520: 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61  pBt)).   || nTra
e530: 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66  ns<=1.  ){.    f
e540: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
e550: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
e560: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
e570: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
e580: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
e590: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
e5a0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e5b0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
e5c0: 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20  seOne(pBt, 0);. 
e5d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
e5e0: 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d    /* Do the comm
e5f0: 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64  it only if all d
e600: 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73  atabases success
e610: 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70  fully complete p
e620: 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20  hase 1. .    ** 
e630: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74  If one of the Bt
e640: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
e650: 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c  e() calls fails,
e660: 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
e670: 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72  an.    ** IO err
e680: 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e  or while deletin
e690: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
e6a0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
e6b0: 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a  It is unlikely,.
e6c0: 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64      ** but could
e6d0: 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73   happen. In this
e6e0: 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72   case abandon pr
e6f0: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
e700: 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20  urn the error.. 
e710: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
e720: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
e730: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
e740: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
e750: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
e760: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
e770: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
e780: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
e790: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
e7a0: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
e7b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
e7c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e7d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
e7e0: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
e7f0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
e800: 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d  e complex case -
e810: 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74   There is a mult
e820: 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61  i-file write-tra
e830: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
e840: 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69  .  ** This requi
e850: 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  res a master jou
e860: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73  rnal file to ens
e870: 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ure the transact
e880: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d  ion is.  ** comm
e890: 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a  itted atomicly..
e8a0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
e8b0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
e8c0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
e8d0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
e8e0: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  db->pVfs;.    in
e8f0: 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  t needSync = 0;.
e900: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
e910: 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65  r = 0;   /* File
e920: 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61  -name for the ma
e930: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ster journal */.
e940: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
e950: 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  zMainFile = sqli
e960: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
e970: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
e980: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
e990: 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d  _file *pMaster =
e9a0: 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73   0;.    i64 offs
e9b0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  et = 0;.    int 
e9c0: 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  res;.    int ret
e9d0: 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ryCount = 0;.   
e9e0: 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a   int nMainFile;.
e9f0: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61  .    /* Select a
ea00: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ea10: 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  file name */.   
ea20: 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c   nMainFile = sql
ea30: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
ea40: 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61  inFile);.    zMa
ea50: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  ster = sqlite3MP
ea60: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a  rintf(db, "%s-mj
ea70: 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61  XXXXXX9XXz", zMa
ea80: 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  inFile);.    if(
ea90: 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65   zMaster==0 ) re
eaa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
eab0: 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  M;.    do {.    
eac0: 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20    u32 iRandom;. 
ead0: 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f       if( retryCo
eae0: 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unt ){.        i
eaf0: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30  f( retryCount>10
eb00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
eb10: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
eb20: 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65  E_FULL, "MJ dele
eb30: 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  te: %s", zMaster
eb40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
eb50: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
eb60: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
eb70: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
eb80: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
eb90: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31  f( retryCount==1
eba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
ebb0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
ebc0: 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69  _FULL, "MJ colli
ebd0: 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  de: %s", zMaster
ebe0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ebf0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79     }.      retry
ec00: 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  Count++;.      s
ec10: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
ec20: 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d  s(sizeof(iRandom
ec30: 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20  ), &iRandom);.  
ec40: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
ec50: 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65  intf(13, &zMaste
ec60: 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d  r[nMainFile], "-
ec70: 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20  mj%06X9%02X",.  
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52               (iR
eca0: 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66  andom>>8)&0xffff
ecb0: 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66  ff, iRandom&0xff
ecc0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
ecd0: 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20  antipenultimate 
ece0: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
ecf0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ed00: 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20  name must.      
ed10: 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f  ** be "9" to avo
ed20: 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f  id name collisio
ed30: 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b  ns when using 8+
ed40: 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a  3 filenames. */.
ed50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d        assert( zM
ed60: 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72  aster[sqlite3Str
ed70: 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33  len30(zMaster)-3
ed80: 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20  ]=='9' );.      
ed90: 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
eda0: 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d  x3(zMainFile, zM
edb0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63  aster);.      rc
edc0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
edd0: 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
ede0: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
edf0: 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
ee00: 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
ee10: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20  QLITE_OK && res 
ee20: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
ee30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ee40: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
ee50: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  ster journal. */
ee60: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
ee70: 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28  te3OsOpenMalloc(
ee80: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26  pVfs, zMaster, &
ee90: 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20  pMaster, .      
eea0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
eeb0: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
eec0: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
eed0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
eee0: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51  PEN_EXCLUSIVE|SQ
eef0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
ef00: 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20  _JOURNAL, 0.    
ef10: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
ef20: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ef30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ef40: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
ef50: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
ef60: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20  rn rc;.    }. . 
ef70: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
ef80: 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74  name of each dat
ef90: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
efa0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
efb0: 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
efc0: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
efd0: 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72   file. If an err
efe0: 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  or occurs at thi
eff0: 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20  s point close.  
f000: 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20    ** and delete 
f010: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f020: 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65  al file. All the
f030: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
f040: 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a  nal files.    **
f050: 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c   still have 'nul
f060: 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72  l' as the master
f070: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
f080: 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72  , so they will r
f090: 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20  oll.    ** back 
f0a0: 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66  independently if
f0b0: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
f0c0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
f0d0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
f0e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
f0f0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
f100: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
f110: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
f120: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
f130: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
f140: 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73  const *zFile = s
f150: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f  qlite3BtreeGetJo
f160: 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a  urnalname(pBt);.
f170: 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
f180: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
f190: 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
f1a0: 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20  Ignore TEMP and 
f1b0: 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73  :memory: databas
f1c0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  es */.        }.
f1d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f1e0: 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20  zFile[0]!=0 );. 
f1f0: 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64         if( !need
f200: 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33  Sync && !sqlite3
f210: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
f220: 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  d(pBt) ){.      
f230: 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
f240: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f250: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f260: 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c  OsWrite(pMaster,
f270: 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53   zFile, sqlite3S
f280: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
f290: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
f2a0: 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c     offset += sql
f2b0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
f2c0: 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  le)+1;.        i
f2d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f2e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
f2f0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
f300: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
f310: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
f320: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
f330: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
f340: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
f350: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
f360: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
f370: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
f380: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
f390: 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74  /* Sync the mast
f3a0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
f3b0: 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
f3c0: 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a  QUENTIAL device.
f3d0: 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
f3e0: 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72  et this is not r
f3f0: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
f400: 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
f410: 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71   .     && 0==(sq
f420: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
f430: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
f440: 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
f450: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20  AP_SEQUENTIAL). 
f460: 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
f470: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
f480: 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53  sSync(pMaster, S
f490: 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
f4a0: 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  L)).    ){.     
f4b0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
f4c0: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
f4d0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
f4e0: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
f4f0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
f500: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
f510: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
f520: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
f530: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c  .    /* Sync all
f540: 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e   the db files in
f550: 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72  volved in the tr
f560: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
f570: 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ame call.    ** 
f580: 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20  sets the master 
f590: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
f5a0: 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  in each individu
f5b0: 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  al journal. If. 
f5c0: 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f     ** an error o
f5d0: 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e  ccurs here, do n
f5e0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
f5f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f600: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
f610: 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63   If the error oc
f620: 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
f630: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20  first call to.  
f640: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
f650: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
f660: 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ), then there is
f670: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
f680: 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  he.    ** master
f690: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
f6a0: 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20  ll be orphaned. 
f6b0: 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  But we cannot de
f6c0: 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20  lete it,.    ** 
f6d0: 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
f6e0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
f6f0: 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e  name was written
f700: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
f710: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65  l.    ** file be
f720: 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
f730: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a   occurred..    *
f740: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
f750: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
f760: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
f770: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
f780: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
f790: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
f7a0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
f7b0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
f7c0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
f7d0: 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  t, zMaster);.   
f7e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
f7f0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
f800: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
f810: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
f820: 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69  TE_BUSY );.    i
f830: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f840: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f850: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
f860: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
f870: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
f880: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
f890: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
f8a0: 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
f8b0: 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
f8c0: 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
f8d0: 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
f8e0: 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
f8f0: 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
f900: 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
f910: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
f920: 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
f930: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
f940: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
f950: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
f960: 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
f970: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
f980: 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
f990: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
f9a0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
f9b0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
f9c0: 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
f9d0: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
f9e0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
f9f0: 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
fa00: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
fa10: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
fa20: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
fa30: 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
fa40: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
fa50: 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
fa60: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
fa70: 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
fa80: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
fa90: 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
faa0: 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
fab0: 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
fac0: 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
fad0: 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
fae0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
faf0: 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
fb00: 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
fb10: 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
fb20: 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
fb30: 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
fb40: 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
fb50: 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
fb60: 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
fb70: 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
fb80: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
fb90: 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
fba0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
fbb0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
fbc0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
fbd0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
fbe0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
fbf0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
fc00: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
fc10: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
fc20: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
fc30: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
fc40: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
fc50: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
fc60: 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
fc70: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
fc80: 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s();..    sqlite
fc90: 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
fca0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
fcb0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
fcc0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
fcd0: 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
fce0: 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63   sqlite3.nVdbeAc
fcf0: 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61  tive count varia
fd00: 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74  ble.** matches t
fd10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  he number of vdb
fd20: 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  e's in the list 
fd30: 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68  sqlite3.pVdbe th
fd40: 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  at are.** curren
fd50: 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61  tly active. An a
fd60: 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
fd70: 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73  f the two counts
fd80: 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
fd90: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74  * This is an int
fda0: 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b  ernal self-check
fdb0: 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f   only - it is no
fdc0: 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70  t an essential p
fdd0: 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65  rocessing.** ste
fde0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
fdf0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42   a no-op if NDEB
fe00: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  UG is defined..*
fe10: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
fe20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
fe30: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
fe40: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
fe50: 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63  Vdbe *p;.  int c
fe60: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57  nt = 0;.  int nW
fe70: 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rite = 0;.  int 
fe80: 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d  nRead = 0;.  p =
fe90: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
fea0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
feb0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
fec0: 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d  _MAGIC_RUN && p-
fed0: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  >pc>=0 ){.      
fee0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
fef0: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
ff00: 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20  ) nWrite++;.    
ff10: 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64    if( p->bIsRead
ff20: 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20  er ) nRead++;.  
ff30: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
ff40: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Next;.  }.  asse
ff50: 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64  rt( cnt==db->nVd
ff60: 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73  beActive );.  as
ff70: 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62  sert( nWrite==db
ff80: 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a  ->nVdbeWrite );.
ff90: 20 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d    assert( nRead=
ffa0: 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29  =db->nVdbeRead )
ffb0: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
ffc0: 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
ffd0: 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
ffe0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62  /*.** If the Vdb
fff0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
10000 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f  first argument o
10010 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e  pened a statemen
10020 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  t-transaction,.*
10030 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20  * close it now. 
10040 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73  Argument eOp mus
10050 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45  t be either SAVE
10060 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f  POINT_ROLLBACK o
10070 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  r.** SAVEPOINT_R
10080 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73  ELEASE. If it is
10090 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
100a0 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74  ACK, then the st
100b0 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
100c0 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
100d0 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73   back. If eOp is
100e0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
100f0 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  SE, then the .**
10100 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
10110 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
10120 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ted..**.** If an
10130 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
10140 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
10150 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
10160 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
10170 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49  * Otherwise SQLI
10180 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
10190 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
101a0 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  atement(Vdbe *p,
101b0 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c   int eOp){.  sql
101c0 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d  ite3 *const db =
101d0 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
101e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
101f0 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65   /* If p->iState
10200 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  ment is greater 
10210 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
10220 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64  this Vdbe opened
10230 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65   a .  ** stateme
10240 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  nt transaction t
10250 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  hat should be cl
10260 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f  osed here. The o
10270 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  nly exception.  
10280 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f  ** is that an IO
10290 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20   error may have 
102a0 6f 63 63 75 72 72 65 64 2c 20 63 61 75 73 69 6e  occurred, causin
102b0 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72  g an emergency r
102c0 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e  ollback..  ** In
102d0 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e   this case (db->
102e0 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20  nStatement==0), 
102f0 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74  and there is not
10300 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f  hing to do..  */
10310 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74  .  if( db->nStat
10320 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61  ement && p->iSta
10330 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e  tement ){.    in
10340 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  t i;.    const i
10350 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20  nt iSavepoint = 
10360 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b  p->iStatement-1;
10370 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f  ..    assert( eO
10380 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
10390 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41  LBACK || eOp==SA
103a0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29  VEPOINT_RELEASE)
103b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
103c0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ->nStatement>0 )
103d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
103e0 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62  >iStatement==(db
103f0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d  ->nStatement+db-
10400 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a  >nSavepoint) );.
10410 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10420 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
10430 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
10440 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
10450 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
10460 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
10470 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
10480 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
10490 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
104a0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
104b0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
104c0 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
104d0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
104e0 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
104f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10500 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c      if( rc2==SQL
10510 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10520 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
10530 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
10540 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
10550 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
10560 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
10570 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
10580 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10590 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
105a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
105b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  }.    }.    db->
105c0 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20  nStatement--;.  
105d0 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
105e0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  = 0;..    if( rc
105f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10600 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
10610 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10620 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
10630 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
10640 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
10650 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
10660 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
10670 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
10680 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10690 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
106a0 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
106b0 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  db, SAVEPOINT_RE
106c0 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
106d0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
106e0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
106f0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
10700 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  action is being 
10710 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73  rolled back, als
10720 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20  o restore the . 
10730 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68     ** database h
10740 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20  andles deferred 
10750 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74  constraint count
10760 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  er to the value 
10770 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20  it had when .   
10780 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
10790 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
107a0 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20  s opened.  */.  
107b0 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
107c0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
107d0 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  .      db->nDefe
107e0 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53  rredCons = p->nS
107f0 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20  tmtDefCons;.    
10800 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
10810 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  mmCons = p->nStm
10820 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20  tDefImmCons;.   
10830 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10840 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
10850 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
10860 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  lled when a tran
10870 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62  saction opened b
10880 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  y the database .
10890 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69  ** handle associ
108a0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
108b0 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
108c0 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20  gument is about 
108d0 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74  to be .** commit
108e0 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72  ted. If there ar
108f0 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65  e outstanding de
10900 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
10910 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  ey constraint.**
10920 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74   violations, ret
10930 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
10940 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
10950 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
10960 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
10970 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74  anding FK violat
10980 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75  ions and this fu
10990 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
109a0 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  ** SQLITE_ERROR,
109b0 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
109c0 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c  of the VM to SQL
109d0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
109e0 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64  OREIGNKEY.** and
109f0 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20   write an error 
10a00 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54  message to it. T
10a10 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
10a20 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e  E_ERROR..*/.#ifn
10a30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10a40 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20  FOREIGN_KEY.int 
10a50 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
10a60 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Fk(Vdbe *p, int 
10a70 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c  deferred){.  sql
10a80 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
10a90 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65  ;.  if( (deferre
10aa0 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72  d && (db->nDefer
10ab0 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66  redCons+db->nDef
10ac0 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29  erredImmCons)>0)
10ad0 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72   .   || (!deferr
10ae0 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73  ed && p->nFkCons
10af0 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a  traint>0) .  ){.
10b00 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
10b10 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
10b20 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d  REIGNKEY;.    p-
10b30 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
10b40 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c  E_Abort;.    sql
10b50 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
10b60 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
10b70 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
10b80 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b  traint failed");
10b90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10ba0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
10bb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10bc0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
10bd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10be0 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
10bf0 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
10c00 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
10c10 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
10c20 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
10c30 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
10c40 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
10c50 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
10c60 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
10c70 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
10c80 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
10c90 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
10ca0 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
10cb0 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
10cc0 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
10cd0 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
10ce0 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
10cf0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49  E_MAGIC_HALT.  I
10d00 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f  t is harmless to
10d10 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e  .** call this on
10d20 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e   a VM that is in
10d30 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49   the SQLITE_MAGI
10d40 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a  C_HALT state..**
10d50 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
10d60 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
10d70 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
10d80 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
10d90 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
10da0 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
10db0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
10dc0 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
10dd0 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
10de0 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
10df0 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
10e00 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
10e10 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
10e20 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
10e30 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  t(Vdbe *p){.  in
10e40 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10e60 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   Used to store t
10e70 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20  ransient return 
10e80 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  codes */.  sqlit
10e90 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
10ea0 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
10eb0 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
10ec0 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
10ed0 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
10ee0 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
10ef0 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
10f00 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
10f10 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
10f20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
10f30 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
10f40 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
10f50 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
10f60 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
10f70 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20  ollowing errors 
10f80 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  occur:.  **.  **
10f90 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45       SQLITE_NOME
10fa0 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  M.  **     SQLIT
10fb0 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20  E_IOERR.  **    
10fc0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a   SQLITE_FULL.  *
10fd0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54  *     SQLITE_INT
10fe0 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  ERRUPT.  **.  **
10ff0 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e   Then the intern
11000 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68  al cache might h
11010 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e  ave been left in
11020 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
11030 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65  .  ** state.  We
11040 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
11050 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
11060 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
11070 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e  there is.  ** on
11080 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  e, or the comple
11090 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
110a0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
110b0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
110c0 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28  ion..  */..  if(
110d0 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
110e0 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
110f0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
11100 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
11110 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73 65  OnceFlag ) memse
11120 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20  t(p->aOnceFlag, 
11130 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29  0, p->nOnceFlag)
11140 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  ;.  closeAllCurs
11150 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ors(p);.  if( p-
11160 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
11170 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65  IC_RUN ){.    re
11180 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11190 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76    }.  checkActiv
111a0 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
111b0 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
111c0 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
111d0 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
111e0 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72  never started or
111f0 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c   if the.  ** SQL
11200 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20   statement does 
11210 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74  not read or writ
11220 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  e a database fil
11230 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  e.  */.  if( p->
11240 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52  pc>=0 && p->bIsR
11250 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  eader ){.    int
11260 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61   mrc;   /* Prima
11270 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  ry error code fr
11280 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20  om p->rc */.    
11290 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  int eStatementOp
112a0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73   = 0;.    int is
112b0 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
112c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
112d0 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70  to true if a 'sp
112e0 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a  ecial' error */.
112f0 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c  .    /* Lock all
11300 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20   btrees used by 
11310 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
11320 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11330 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f  Enter(p);..    /
11340 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20  * Check for one 
11350 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
11360 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63  rrors */.    mrc
11370 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b   = p->rc & 0xff;
11380 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
11390 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
113a0 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f 2a 20  _BLOCKED );  /* 
113b0 54 68 69 73 20 65 72 72 6f 72 20 6e 6f 20 6c 6f  This error no lo
113c0 6e 67 65 72 20 65 78 69 73 74 73 20 2a 2f 0a 20  nger exists */. 
113d0 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f     isSpecialErro
113e0 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f  r = mrc==SQLITE_
113f0 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51  NOMEM || mrc==SQ
11400 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20  LITE_IOERR.     
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11420 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
11430 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d  NTERRUPT || mrc=
11440 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20  =SQLITE_FULL;.  
11450 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45    if( isSpecialE
11460 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rror ){.      /*
11470 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61   If the query wa
11480 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20  s read-only and 
11490 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
114a0 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  s SQLITE_INTERRU
114b0 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f  PT, .      ** no
114c0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63   rollback is nec
114d0 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73  essary. Otherwis
114e0 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73 61  e, at least a sa
114f0 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a  vepoint .      *
11500 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  * transaction mu
11510 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  st be rolled bac
11520 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  k to restore the
11530 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a   database to a .
11540 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74        ** consist
11550 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20  ent state..     
11560 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65   **.      ** Eve
11570 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  n if the stateme
11580 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c  nt is read-only,
11590 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
115a0 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20   to perform.    
115b0 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74    ** a statement
115c0 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   or transaction 
115d0 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69  rollback operati
115e0 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72  on. If the error
115f0 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72   .      ** occur
11600 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  red while writin
11610 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
11620 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72  , sub-journal or
11630 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
11640 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74 20  ** file as part 
11650 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  of an effort to 
11660 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73 70  free up cache sp
11670 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f  ace (see functio
11680 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72  n.      ** pager
11690 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67 65  Stress() in page
116a0 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61  r.c), the rollba
116b0 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20 74  ck is required t
116c0 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20  o restore .     
116d0 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f   ** the pager to
116e0 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74   a consistent st
116f0 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ate..      */.  
11700 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
11710 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c  Only || mrc!=SQL
11720 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b  ITE_INTERRUPT ){
11730 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72  .        if( (mr
11740 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11750 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
11760 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53  ULL) && p->usesS
11770 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  tmtJournal ){.  
11780 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
11790 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
117a0 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
117b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
117c0 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f      /* We are fo
117d0 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63  rced to roll bac
117e0 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61  k the active tra
117f0 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65  nsaction. Before
11800 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20   doing.         
11810 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e   ** so, abort an
11820 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  y other statemen
11830 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63  ts this handle c
11840 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74  urrently has act
11850 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ive..          *
11860 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
11870 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
11880 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
11890 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
118a0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
118b0 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
118c0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  .          db->a
118d0 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
118e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
118f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
11900 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61  heck for immedia
11910 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76  te foreign key v
11920 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  iolations. */.  
11930 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
11940 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11950 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
11960 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Fk(p, 0);.    }.
11970 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
11980 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
11990 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
119a0 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
119b0 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20  tive writer .   
119c0 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20   ** VM, then we 
119d0 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
119e0 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
119f0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
11a00 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
11a10 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
11a20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
11a30 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
11a40 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
11a50 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
11a60 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
11a70 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rred. .    */.  
11a80 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74    if( !sqlite3Vt
11a90 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20  abInSync(db) .  
11aa0 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f     && db->autoCo
11ab0 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62  mmit .     && db
11ac0 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70  ->nVdbeWrite==(p
11ad0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a  ->readOnly==0) .
11ae0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
11af0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
11b00 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
11b10 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
11b20 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
11b30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
11b40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
11b50 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20  ckFk(p, 1);.    
11b60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11b70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11b80 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e     if( NEVER(p->
11b90 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
11ba0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11bb0 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
11bc0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11bd0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
11be0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11bf0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11c00 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
11c10 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20  IGNKEY;.        
11c20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20  }else{ .        
11c30 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f    /* The auto-co
11c40 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75  mmit flag is tru
11c50 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  e, the vdbe prog
11c60 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66  ram was successf
11c70 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ul .          **
11c80 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46   or hit an 'OR F
11c90 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20  AIL' constraint 
11ca0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
11cb0 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
11cc0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b  n.          ** k
11cd0 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ey constraints t
11ce0 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72  o hold up the tr
11cf0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
11d00 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a  means a commit .
11d10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
11d20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
11d30 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
11d40 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20  Commit(db, p);. 
11d50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11d60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11d70 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f  BUSY && p->readO
11d80 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nly ){.         
11d90 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
11da0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
11db0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
11dc0 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  SY;.        }els
11dd0 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
11de0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
11df0 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
11e00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
11e10 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
11e20 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
11e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11e40 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
11e50 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
11e60 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
11e70 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  dImmCons = 0;.  
11e80 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
11e90 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66  s &= ~SQLITE_Def
11ea0 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20  erFKs;.         
11eb0 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
11ec0 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
11ed0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
11ee0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11ef0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
11f00 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
11f10 4f 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OK);.      }.   
11f20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
11f30 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
11f40 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
11f50 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  p==0 ){.      if
11f60 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
11f70 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
11f80 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
11f90 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
11fa0 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
11fb0 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20  T_RELEASE;.     
11fc0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
11fd0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
11fe0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ort ){.        e
11ff0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
12000 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12010 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
12030 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
12040 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
12050 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
12060 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
12070 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
12080 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
12090 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
120a0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
120b0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73   eStatementOp is
120c0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
120d0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
120e0 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
120f0 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69  .    ** be commi
12100 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
12110 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  ack. Call sqlite
12120 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
12130 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  ent() to.    ** 
12140 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f  do so. If this o
12150 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73  peration returns
12160 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
12170 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
12180 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f  ment.    ** erro
12190 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
121a0 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  _OK or SQLITE_CO
121b0 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70  NSTRAINT, then p
121c0 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a  romote the.    *
121d0 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * current statem
121e0 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ent error code..
121f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
12200 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20  StatementOp ){. 
12210 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12220 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
12230 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e  ent(p, eStatemen
12240 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tOp);.      if( 
12250 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rc ){.        if
12260 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
12270 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66  OK || (p->rc&0xf
12280 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
12290 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20  RAINT ){.       
122a0 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
122b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
122c0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
122d0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
122e0 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
122f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12300 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
12310 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
12320 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
12330 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12340 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
12350 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
12360 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
12370 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
12380 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
12390 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
123a0 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
123b0 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d  TE and no statem
123c0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ent transaction.
123d0 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
123e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64  rolled back, upd
123f0 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
12400 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e   connection chan
12410 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20  ge-counter. .   
12420 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63   */.    if( p->c
12430 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20  hangeCntOn ){.  
12440 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65      if( eStateme
12450 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f  ntOp!=SAVEPOINT_
12460 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
12470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
12480 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
12490 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  >nChange);.     
124a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
124b0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
124c0 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  anges(db, 0);.  
124d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
124e0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
124f0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
12500 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
12510 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
12520 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ave(p);.  }..  /
12530 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73  * We have succes
12540 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e  sfully halted an
12550 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e  d closed the VM.
12560 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61    Record this fa
12570 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
12580 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  pc>=0 ){.    db-
12590 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a  >nVdbeActive--;.
125a0 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
125b0 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65  Only ) db->nVdbe
125c0 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28  Write--;.    if(
125d0 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20   p->bIsReader ) 
125e0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b  db->nVdbeRead--;
125f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
12600 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62  >nVdbeActive>=db
12610 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20  ->nVdbeRead );. 
12620 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
12630 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56  VdbeRead>=db->nV
12640 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20  dbeWrite );.    
12650 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
12660 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d  eWrite>=0 );.  }
12670 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
12680 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
12690 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
126a0 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70  Cnt(db);.  if( p
126b0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
126c0 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
126d0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
126e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
126f0 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
12700 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
12710 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
12720 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
12730 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
12740 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
12750 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
12760 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
12770 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
12780 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
12790 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
127a0 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
127b0 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
127c0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
127d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
127e0 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
127f0 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
12800 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
12810 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74  ive>0 || db->aut
12820 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
12830 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->nStatement==0 
12840 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
12850 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
12860 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
12870 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a  SQLITE_OK);.}...
12880 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
12890 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
128a0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
128b0 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
128c0 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
128d0 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
128e0 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
128f0 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
12900 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
12910 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
12920 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
12930 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
12940 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12950 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72  * Copy the error
12960 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
12970 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e  message belongin
12980 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61  g to the VDBE pa
12990 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
129a0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
129b0 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61   its database ha
129c0 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68  ndle (so that th
129d0 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72  ey will be .** r
129e0 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73  eturned by calls
129f0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63   to sqlite3_errc
12a00 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ode() and sqlite
12a10 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a  3_errmsg())..**.
12a20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12a30 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20   does not clear 
12a40 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63  the VDBE error c
12a50 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20  ode or message, 
12a60 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74  just.** copies t
12a70 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62  hem to the datab
12a80 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
12a90 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  nt sqlite3VdbeTr
12aa0 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65  ansferError(Vdbe
12ab0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
12ac0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
12ad0 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20  nt rc = p->rc;. 
12ae0 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
12af0 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63  ){.    u8 malloc
12b00 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  Failed = db->mal
12b10 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 73  locFailed;.    s
12b20 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
12b30 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
12b40 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29  f( db->pErr==0 )
12b50 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69   db->pErr = sqli
12b60 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
12b70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
12b80 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
12b90 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
12ba0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
12bb0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
12bc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
12bd0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
12be0 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
12bf0 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69  iled = mallocFai
12c00 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72  led;.    db->err
12c10 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c  Code = rc;.  }el
12c20 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
12c30 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b  rror(db, rc, 0);
12c40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
12c50 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
12c60 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47  TE_ENABLE_SQLLOG
12c70 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c  ./*.** If an SQL
12c80 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f  ITE_CONFIG_SQLLO
12c90 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74  G hook is regist
12ca0 65 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20  ered and the VM 
12cb0 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a  has been run, .*
12cc0 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a  * invoke it..*/.
12cd0 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
12ce0 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62  InvokeSqllog(Vdb
12cf0 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c  e *v){.  if( sql
12d00 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
12d10 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72  .xSqllog && v->r
12d20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
12d30 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63  v->zSql && v->pc
12d40 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  >=0 ){.    char 
12d50 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c  *zExpanded = sql
12d60 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53 71  ite3VdbeExpandSq
12d70 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20  l(v, v->zSql);. 
12d80 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62     assert( v->db
12d90 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
12da0 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e  ;.    if( zExpan
12db0 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ded ){.      sql
12dc0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
12dd0 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20  .xSqllog(.      
12de0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
12df0 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41  lConfig.pSqllogA
12e00 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61  rg, v->db, zExpa
12e10 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b  nded, 1.      );
12e20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
12e30 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70  Free(v->db, zExp
12e40 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20  anded);.    }.  
12e50 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
12e60 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  ne vdbeInvokeSql
12e70 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  log(x).#endif../
12e80 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20  *.** Clean up a 
12e90 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
12ea0 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20  tion but do not 
12eb0 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20  delete the VDBE 
12ec0 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69  just yet..** Wri
12ed0 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
12ee0 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72  sages into *pzEr
12ef0 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68  rMsg.  Return th
12f00 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a  e result code..*
12f10 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  *.** After this 
12f20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20  routine is run, 
12f30 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20  the VDBE should 
12f40 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65  be ready to be e
12f50 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e  xecuted.** again
12f60 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20  ..**.** To look 
12f70 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61  at it another wa
12f80 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
12f90 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65  resets the state
12fa0 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75   of the.** virtu
12fb0 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20  al machine from 
12fc0 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f  VDBE_MAGIC_RUN o
12fd0 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  r VDBE_MAGIC_HAL
12fe0 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42  T back to.** VDB
12ff0 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f  E_MAGIC_INIT..*/
13000 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
13010 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a  Reset(Vdbe *p){.
13020 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
13030 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20   db = p->db;..  
13040 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64  /* If the VM did
13050 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70   not run to comp
13060 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20  letion or if it 
13070 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20  encountered an. 
13080 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20   ** error, then 
13090 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76  it might not hav
130a0 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72  e been halted pr
130b0 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74  operly.  So halt
130c0 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20  .  ** it now..  
130d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
130e0 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  Halt(p);..  /* I
130f0 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  f the VDBE has b
13100 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69  e run even parti
13110 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73  ally, then trans
13120 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f  fer the error co
13130 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f  de.  ** and erro
13140 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74  r message from t
13150 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65  he VDBE into the
13160 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
13170 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20  tructure.  But. 
13180 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20   ** if the VDBE 
13190 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65  has just been se
131a0 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73  t to run but has
131b0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78   not actually ex
131c0 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20  ecuted any.  ** 
131d0 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74  instructions yet
131e0 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e  , leave the main
131f0 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
13200 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68  information unch
13210 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  anged..  */.  if
13220 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
13230 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c    vdbeInvokeSqll
13240 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  og(p);.    sqlit
13250 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72  e3VdbeTransferEr
13260 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  ror(p);.    sqli
13270 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
13280 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
13290 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
132a0 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c     if( p->runOnl
132b0 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72  yOnce ) p->expir
132c0 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ed = 1;.  }else 
132d0 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e  if( p->rc && p->
132e0 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f  expired ){.    /
132f0 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c  * The expired fl
13300 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68  ag was set on th
13310 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68  e VDBE before th
13320 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20  e first call.   
13330 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73   ** to sqlite3_s
13340 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69  tep(). For consi
13350 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71  stency (since sq
13360 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73  lite3_step() was
13370 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c  .    ** called),
13380 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
13390 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20  e error in this 
133a0 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20  case as well..  
133b0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
133c0 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c  Error(db, p->rc,
133d0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25   p->zErrMsg ? "%
133e0 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d  s" : 0, p->zErrM
133f0 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
13400 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
13410 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
13420 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
13430 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c  .  /* Reclaim al
13440 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
13450 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20   the VDBE.  */. 
13460 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20   Cleanup(p);..  
13470 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
13480 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
13490 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
134a0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44  ..  */.#ifdef VD
134b0 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
134c0 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66     FILE *out = f
134d0 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69  open("vdbe_profi
134e0 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20  le.out", "a");. 
134f0 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20     if( out ){.  
13500 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
13510 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
13520 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f  --- ");.      fo
13530 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
13540 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
13550 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32  printf(out, "%02
13560 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70  x", p->aOp[i].op
13570 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  code);.      }. 
13580 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
13590 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69  , "\n");.      i
135a0 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20  f( p->zSql ){.  
135b0 20 20 20 20 20 20 63 68 61 72 20 63 2c 20 70 63        char c, pc
135c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70   = 0;.        fp
135d0 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22  rintf(out, "-- "
135e0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
135f0 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c  =0; (c = p->zSql
13600 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  [i])!=0; i++){. 
13610 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d           if( pc=
13620 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28  ='\n' ) fprintf(
13630 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20  out, "-- ");.   
13640 20 20 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f         putc(c, o
13650 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ut);.          p
13660 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d  c = c;.        }
13670 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 21  .        if( pc!
13680 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28  ='\n' ) fprintf(
13690 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
136a0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
136b0 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
136c0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
136d0 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20  zHdr[100];.     
136e0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
136f0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29  ntf(sizeof(zHdr)
13700 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32  , zHdr, "%6u %12
13710 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20  llu %8llu ",.   
13720 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
13730 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  ].cnt,.         
13740 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
13750 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  es,.           p
13760 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f  ->aOp[i].cnt>0 ?
13770 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
13780 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20  s/p->aOp[i].cnt 
13790 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  : 0.        );. 
137a0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
137b0 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b  ut, "%s", zHdr);
137c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
137d0 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c  VdbePrintOp(out,
137e0 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
137f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
13800 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
13810 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  }.  }.#endif.  p
13820 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d  ->iCurrentTime =
13830 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   0;.  p->magic =
13840 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
13850 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
13860 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
13870 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
13880 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
13890 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
138a0 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
138b0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
138c0 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
138d0 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
138e0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
138f0 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
13900 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
13910 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
13920 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
13930 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13940 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
13950 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
13960 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
13970 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
13980 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
13990 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  beReset(p);.    
139a0 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
139b0 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
139c0 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  c );.  }.  sqlit
139d0 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b  e3VdbeDelete(p);
139e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
139f0 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  ./*.** If parame
13a00 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20  ter iOp is less 
13a10 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
13a20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72  invoke the destr
13a30 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c  uctor for.** all
13a40 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20   auxiliary data 
13a50 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74  pointers current
13a60 6c 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65  ly cached by the
13a70 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a   VM passed as.**
13a80 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
13a90 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ent..**.** Or, i
13aa0 66 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72  f iOp is greater
13ab0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
13ac0 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
13ad0 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a   destructor is.*
13ae0 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66  * only invoked f
13af0 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61  or those auxilia
13b00 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73  ry data pointers
13b10 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
13b20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  user .** functio
13b30 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65  n invoked by the
13b40 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63   OP_Function opc
13b50 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69  ode at instructi
13b60 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d  on iOp of .** VM
13b70 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79   pVdbe, and only
13b80 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   then if:.**.** 
13b90 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61     * the associa
13ba0 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  ted function par
13bb0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32  ameter is the 32
13bc0 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75  nd or later (cou
13bd0 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72  nting.**      fr
13be0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
13bf0 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ), or.**.**    *
13c00 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
13c10 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65  ng bit in argume
13c20 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  nt mask is clear
13c30 20 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73   (where the firs
13c40 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69  t.**      functi
13c50 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72  on parameter cor
13c60 72 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30  rsponds to bit 0
13c70 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20   etc.)..*/.void 
13c80 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
13c90 65 41 75 78 44 61 74 61 28 56 64 62 65 20 2a 70  eAuxData(Vdbe *p
13ca0 56 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69  Vdbe, int iOp, i
13cb0 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44  nt mask){.  AuxD
13cc0 61 74 61 20 2a 2a 70 70 20 3d 20 26 70 56 64 62  ata **pp = &pVdb
13cd0 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 77  e->pAuxData;.  w
13ce0 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20  hile( *pp ){.   
13cf0 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d   AuxData *pAux =
13d00 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69   *pp;.    if( (i
13d10 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70  Op<0).     || (p
13d20 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26  Aux->iOp==iOp &&
13d30 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31 20   (pAux->iArg>31 
13d40 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b  || !(mask & MASK
13d50 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72 67  BIT32(pAux->iArg
13d60 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  )))).    ){.    
13d70 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75 78    testcase( pAux
13d80 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20  ->iArg==31 );.  
13d90 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44      if( pAux->xD
13da0 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
13db0 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70   pAux->xDelete(p
13dc0 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Aux->pAux);.    
13dd0 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20    }.      *pp = 
13de0 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pAux->pNext;.   
13df0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13e00 28 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75 78  (pVdbe->db, pAux
13e10 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13e20 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70      pp= &pAux->p
13e30 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
13e40 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
13e50 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
13e60 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
13e70 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
13e80 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
13e90 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f  .** except for o
13ea0 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68  bject itself, wh
13eb0 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64  ich is preserved
13ec0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
13ed0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
13ee0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
13ef0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
13f00 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20  te() is that.** 
13f10 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73  VdbeDelete() als
13f20 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64  o unlinks the Vd
13f30 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  be from the list
13f40 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74   of VMs associat
13f50 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64  ed with.** the d
13f60 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
13f70 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65  on and frees the
13f80 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a   object itself..
13f90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
13fa0 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73  dbeClearObject(s
13fb0 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
13fc0 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72   *p){.  SubProgr
13fd0 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74  am *pSub, *pNext
13fe0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
13ff0 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c  ert( p->db==0 ||
14000 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20   p->db==db );.  
14010 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
14020 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
14030 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
14040 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
14050 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
14060 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f  COLNAME_N);.  fo
14070 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72  r(pSub=p->pProgr
14080 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  am; pSub; pSub=p
14090 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
140a0 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a   = pSub->pNext;.
140b0 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72      vdbeFreeOpAr
140c0 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f  ray(db, pSub->aO
140d0 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20  p, pSub->nOp);. 
140e0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
140f0 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a  (db, pSub);.  }.
14100 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72    for(i=p->nzVar
14110 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73  -1; i>=0; i--) s
14120 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14130 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20   p->azVar[i]);. 
14140 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
14150 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e  (db, p->aOp, p->
14160 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  nOp);.  sqlite3D
14170 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
14180 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
14190 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
141a0 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Sql);.  sqlite3D
141b0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72  bFree(db, p->pFr
141c0 65 65 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ee);.#if defined
141d0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
141e0 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 73  REE_EXPLAIN).  s
141f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14200 20 70 2d 3e 7a 45 78 70 6c 61 69 6e 29 3b 0a 20   p->zExplain);. 
14210 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
14220 62 2c 20 70 2d 3e 70 45 78 70 6c 61 69 6e 29 3b  b, p->pExplain);
14230 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
14240 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
14250 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
14260 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
14270 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  e(Vdbe *p){.  sq
14280 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
14290 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
142a0 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
142b0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
142c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
142d0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
142e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  .  sqlite3VdbeCl
142f0 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29  earObject(db, p)
14300 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
14310 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
14320 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
14330 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
14340 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64   assert( db->pVd
14350 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d  be==p );.    db-
14360 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
14370 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
14380 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
14390 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
143a0 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70  ->pPrev;.  }.  p
143b0 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
143c0 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e  AGIC_DEAD;.  p->
143d0 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  db = 0;.  sqlite
143e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
143f0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
14400 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20  re the cursor p 
14410 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64  is ready to read
14420 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f   or write the ro
14430 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a  w to which it.**
14440 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69   was last positi
14450 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e  oned.  Return an
14460 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
14470 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49  n OOM fault or I
14480 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76  /O error.** prev
14490 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73  ents us from pos
144a0 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72  itioning the cur
144b0 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65  sor to its corre
144c0 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a  ct position..**.
144d0 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f  ** If a MoveTo o
144e0 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64  peration is pend
144f0 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ing on the given
14500 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f   cursor, then do
14510 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20   that.** MoveTo 
14520 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65  now.  If no move
14530 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65   is pending, che
14540 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
14550 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a   row has been.**
14560 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
14570 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
14580 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73  or and if it has
14590 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61  , mark the row a
145a0 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  s.** a NULL row.
145b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
145c0 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
145d0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
145e0 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20  correct row and 
145f0 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20  that row has.** 
14600 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64  not been deleted
14610 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
14620 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  the cursor, then
14630 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
14640 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74   a no-op..*/.int
14650 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
14660 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72  orMoveto(VdbeCur
14670 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  sor *p){.  if( p
14680 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
14690 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c   ){.    int res,
146a0 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
146b0 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65  TE_TEST.    exte
146c0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
146d0 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e  earch_count;.#en
146e0 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
146f0 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  p->isTable );.  
14700 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
14710 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
14720 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  d(p->pCursor, 0,
14730 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
14740 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
14750 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
14760 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52  rc;.    p->lastR
14770 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f  owid = p->moveto
14780 54 61 72 67 65 74 3b 0a 20 20 20 20 69 66 28 20  Target;.    if( 
14790 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20  res!=0 ) return 
147a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
147b0 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69  KPT;.    p->rowi
147c0 64 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69  dIsValid = 1;.#i
147d0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
147e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61  .    sqlite3_sea
147f0 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  rch_count++;.#en
14800 64 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72  dif.    p->defer
14810 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
14820 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75     p->cacheStatu
14830 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
14840 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
14850 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 69  pCursor ){.    i
14860 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20  nt hasMoved;.   
14870 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
14880 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
14890 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c  oved(p->pCursor,
148a0 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20   &hasMoved);.   
148b0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
148c0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61 73   rc;.    if( has
148d0 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20 70  Moved ){.      p
148e0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
148f0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20  CACHE_STALE;.   
14900 20 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64 3d     if( hasMoved=
14910 3d 32 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20  =2 ) p->nullRow 
14920 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
14930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14940 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
14950 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
14960 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ons:.**.** sqlit
14970 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
14980 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
14990 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
149a0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
149b0 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
149c0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
149d0 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  ut().** sqlite3V
149e0 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a  dbeSerialGet().*
149f0 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65  *.** encapsulate
14a00 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
14a10 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73  erializes values
14a20 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20   for storage in 
14a30 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61  SQLite.** data a
14a40 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  nd index records
14a50 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65  . Each serialize
14a60 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73  d value consists
14a70 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c   of a.** 'serial
14a80 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f  -type' and a blo
14a90 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73  b of data. The s
14aa0 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e  erial type is an
14ab0 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   8-byte unsigned
14ac0 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f  .** integer, sto
14ad0 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e  red as a varint.
14ae0 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c  .**.** In an SQL
14af0 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ite index record
14b00 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  , the serial typ
14b10 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65  e is stored dire
14b20 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74  ctly before.** t
14b30 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  he blob of data 
14b40 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f  that it correspo
14b50 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62  nds to. In a tab
14b60 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73  le record, all s
14b70 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61  erial.** types a
14b80 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  re stored at the
14b90 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65   start of the re
14ba0 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c  cord, and the bl
14bb0 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a  obs of data at.*
14bc0 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65  * the end. Hence
14bd0 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73   these functions
14be0 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65   allow the calle
14bf0 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a  r to handle the.
14c00 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61  ** serial-type a
14c10 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70  nd data blob sep
14c20 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  arately..**.** T
14c30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
14c40 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
14c50 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65   various storage
14c60 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74   classes for dat
14c70 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61  a:.**.**   seria
14c80 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79  l type        by
14c90 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20  tes of data     
14ca0 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d   type.**   -----
14cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
14cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
14cd0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
14ce0 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20  .**      0      
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
14d00 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
14d10 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20  .**      1      
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
14d30 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
14d40 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
14d50 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
14d60 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
14d70 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
14d80 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20  eger.**      3  
14d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14da0 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
14db0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
14dc0 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20  *      4        
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20               4  
14de0 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
14df0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
14e00 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20   5              
14e10 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20         6        
14e20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
14e30 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20  er.**      6    
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e50 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69   8            si
14e60 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
14e70 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20       7          
14e80 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
14e90 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f          IEEE flo
14ea0 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20  at.**      8    
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ec0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
14ed0 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30  teger constant 0
14ee0 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20  .**      9      
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
14f00 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
14f10 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a  ger constant 1.*
14f20 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20  *     10,11     
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f40 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76            reserv
14f50 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e  ed for expansion
14f60 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64  .**    N>=12 and
14f70 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31   even       (N-1
14f80 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42  2)/2        BLOB
14f90 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64  .**    N>=13 and
14fa0 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31   odd        (N-1
14fb0 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74  3)/2        text
14fc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64  .**.** The 8 and
14fd0 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64   9 types were ad
14fe0 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69  ded in 3.3.0, fi
14ff0 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72  le format 4.  Pr
15000 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  ior versions.** 
15010 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  of SQLite will n
15020 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  ot understand th
15030 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  ose serial types
15040 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
15050 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79  rn the serial-ty
15060 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  pe for the value
15070 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e   stored in pMem.
15080 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
15090 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65  dbeSerialType(Me
150a0 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
150b0 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74  e_format){.  int
150c0 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
150d0 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  lags;.  int n;..
150e0 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
150f0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
15100 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
15110 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
15120 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
15130 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73  ut whether to us
15140 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20  e 1, 2, 4, 6 or 
15150 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20  8 bytes. */.#   
15160 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45  define MAX_6BYTE
15170 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38   ((((i64)0x00008
15180 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20  000)<<32)-1).   
15190 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75   i64 i = pMem->u
151a0 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20  .i;.    u64 u;. 
151b0 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20     if( i<0 ){.  
151c0 20 20 20 20 69 66 28 20 69 3c 28 2d 4d 41 58 5f      if( i<(-MAX_
151d0 36 42 59 54 45 29 20 29 20 72 65 74 75 72 6e 20  6BYTE) ) return 
151e0 36 3b 0a 20 20 20 20 20 20 2f 2a 20 50 72 65 76  6;.      /* Prev
151f0 69 6f 75 73 20 74 65 73 74 20 70 72 65 76 65 6e  ious test preven
15200 74 73 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32 33  ts:  u = -(-9223
15210 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38 29  372036854775808)
15220 20 2a 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d 69   */.      u = -i
15230 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15240 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a     u = i;.    }.
15250 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29      if( u<=127 )
15260 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  {.      return (
15270 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65  (i&1)==i && file
15280 5f 66 6f 72 6d 61 74 3e 3d 34 29 20 3f 20 38 2b  _format>=4) ? 8+
15290 28 75 33 32 29 75 20 3a 20 31 3b 0a 20 20 20 20  (u32)u : 1;.    
152a0 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37  }.    if( u<=327
152b0 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  67 ) return 2;. 
152c0 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30     if( u<=838860
152d0 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20  7 ) return 3;.  
152e0 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33    if( u<=2147483
152f0 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a  647 ) return 4;.
15300 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
15310 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b  BYTE ) return 5;
15320 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20  .    return 6;. 
15330 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
15340 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72  EM_Real ){.    r
15350 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
15360 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d  ssert( pMem->db-
15370 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
15380 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
15390 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e  MEM_Blob) );.  n
153a0 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66   = pMem->n;.  if
153b0 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
153c0 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
153d0 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
153e0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30  }.  assert( n>=0
153f0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e   );.  return ((n
15400 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61  *2) + 12 + ((fla
15410 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29  gs&MEM_Str)!=0))
15420 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15430 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
15440 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
15450 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
15460 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
15470 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  pe..*/.u32 sqlit
15480 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
15490 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
154a0 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
154b0 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
154c0 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61     return (seria
154d0 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
154e0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69  }else{.    stati
154f0 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65  c const u8 aSize
15500 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20  [] = { 0, 1, 2, 
15510 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30  3, 4, 6, 8, 8, 0
15520 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20  , 0, 0, 0 };.   
15530 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65   return aSize[se
15540 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a  rial_type];.  }.
15550 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
15560 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65  re on an archite
15570 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64  cture with mixed
15580 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67  -endian floating
15590 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a   .** points (ex:
155a0 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70   ARM7) then swap
155b0 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74   the lower 4 byt
155c0 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20  es with the .** 
155d0 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20  upper 4 bytes.  
155e0 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
155f0 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73  t..**.** For mos
15600 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  t architectures,
15610 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
15620 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a  ..**.** (later):
15630 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64    It is reported
15640 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20   to me that the 
15650 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f  mixed-endian pro
15660 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20  blem.** on ARM7 
15670 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68  is an issue with
15680 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74   GCC, not with t
15690 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49  he ARM7 chip.  I
156a0 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20  t seems.** that 
156b0 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f  early versions o
156c0 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65  f GCC stored the
156d0 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20   two words of a 
156e0 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20  64-bit.** float 
156f0 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64  in the wrong ord
15700 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72  er.  And that er
15710 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ror has been pro
15720 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20  pagated.** ever 
15730 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d  since.  The blam
15740 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
15750 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74  rily with GCC, t
15760 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69  hough..** GCC mi
15770 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f  ght have just co
15780 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  pying the proble
15790 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  m from a prior c
157a0 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d  ompiler..** I am
157b0 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20   also told that 
157c0 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
157d0 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f  f GCC that follo
157e0 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  w a different.**
157f0 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74   ABI get the byt
15800 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a  e order right..*
15810 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20  *.** Developers 
15820 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20  using SQLite on 
15830 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63  an ARM7 should c
15840 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74  ompile and run t
15850 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74  heir.** applicat
15860 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ion using -DSQLI
15870 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65  TE_DEBUG=1 at le
15880 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20  ast once.  With 
15890 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64  DEBUG.** enabled
158a0 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62  , some asserts b
158b0 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65  elow will ensure
158c0 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f   that the byte o
158d0 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74  rder of.** float
158e0 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
158f0 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a   is correct..**.
15900 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20  ** (2007-08-30) 
15910 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20   Frank van Vugt 
15920 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73  has studied this
15930 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79   problem closely
15940 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64  .** and has send
15950 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f   his findings to
15960 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65   the SQLite deve
15970 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a  lopers.  Frank.*
15980 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f  * writes that so
15990 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73  me Linux kernels
159a0 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20   offer floating 
159b0 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a  point hardware.*
159c0 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74  * emulation that
159d0 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69   uses only 32-bi
159e0 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74  t mantissas inst
159f0 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a  ead of a full .*
15a00 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71  * 48-bits as req
15a10 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45  uired by the IEE
15a20 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68  E standard.  (Th
15a30 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e  is is the.** CON
15a40 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20  FIG_FPE_FASTFPE 
15a50 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63  option.)  On suc
15a60 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74  h systems, float
15a70 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74  ing point.** byt
15a80 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d  e swapping becom
15a90 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61  es very complica
15aa0 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70  ted.  To avoid p
15ab0 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20  roblems,.** the 
15ac0 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73  necessary byte s
15ad0 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69  wapping is carri
15ae0 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36  ed out using a 6
15af0 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
15b00 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36   rather than a 6
15b10 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72  4-bit float.  Fr
15b20 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74  ank assures us t
15b30 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  hat the code her
15b40 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68  e.** works for h
15b50 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76  im.  We, the dev
15b60 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f  elopers, have no
15b70 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64   way to independ
15b80 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20  ently.** verify 
15b90 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20  this, but Frank 
15ba0 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68  seems to know wh
15bb0 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67  at he is talking
15bc0 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20   about.** so we 
15bd0 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69  trust him..*/.#i
15be0 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  fdef SQLITE_MIXE
15bf0 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
15c00 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20  LOAT.static u64 
15c10 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e  floatSwap(u64 in
15c20 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  ){.  union {.   
15c30 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20   u64 r;.    u32 
15c40 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  i[2];.  } u;.  u
15c50 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69  32 t;..  u.r = i
15c60 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b  n;.  t = u.i[0];
15c70 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b  .  u.i[0] = u.i[
15c80 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74  1];.  u.i[1] = t
15c90 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a  ;.  return u.r;.
15ca0 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  }.# define swapM
15cb0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
15cc0 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61  X)  X = floatSwa
15cd0 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  p(X).#else.# def
15ce0 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
15cf0 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64  ianFloat(X).#end
15d00 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
15d10 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64  the serialized d
15d20 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65  ata blob for the
15d30 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
15d40 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62   pMem into .** b
15d50 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  uf. It is assume
15d60 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
15d70 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  r has allocated 
15d80 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
15d90 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
15da0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
15db0 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e  written..**.** n
15dc0 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  Buf is the amoun
15dd0 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20  t of space left 
15de0 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63  in buf[].  The c
15df0 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
15e00 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f  ible.** for allo
15e10 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70  cating enough sp
15e20 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20  ace to buf[] to 
15e30 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20  hold the entire 
15e40 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65  field, exclusive
15e50 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d  .** of the pMem-
15e60 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66  >u.nZero bytes f
15e70 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61  or a MEM_Zero va
15e80 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lue..**.** Retur
15e90 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
15ea0 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77  bytes actually w
15eb0 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b  ritten into buf[
15ec0 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  ].  The number.*
15ed0 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  * of bytes in th
15ee0 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
15ef0 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69  il is included i
15f00 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
15f10 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68  ue only.** if th
15f20 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a  ose bytes were z
15f30 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a  eroed in buf[]..
15f40 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56  */ .u32 sqlite3V
15f50 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20  dbeSerialPut(u8 
15f60 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  *buf, Mem *pMem,
15f70 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
15f80 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20  ){.  u32 len;.. 
15f90 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20   /* Integer and 
15fa0 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65  Real */.  if( se
15fb0 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20  rial_type<=7 && 
15fc0 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b  serial_type>0 ){
15fd0 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20  .    u64 v;.    
15fe0 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73  u32 i;.    if( s
15ff0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
16000 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
16010 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66  izeof(v)==sizeof
16020 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20  (pMem->r) );.   
16030 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70     memcpy(&v, &p
16040 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76  Mem->r, sizeof(v
16050 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
16060 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
16070 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
16080 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
16090 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
160a0 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64   = i = sqlite3Vd
160b0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
160c0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
160d0 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a    while( i-- ){.
160e0 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28        buf[i] = (
160f0 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
16100 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
16110 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
16120 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
16130 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
16140 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
16150 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
16160 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
16170 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
16180 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e  _Zero)?pMem->u.n
16190 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20  Zero:0).        
161a0 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c       == (int)sql
161b0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
161c0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
161d0 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  e) );.    len = 
161e0 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d  pMem->n;.    mem
161f0 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a  cpy(buf, pMem->z
16200 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75  , len);.    retu
16210 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
16220 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61  * NULL or consta
16230 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20  nts 0 or 1 */.  
16240 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
16250 49 6e 70 75 74 20 22 78 22 20 69 73 20 61 20 73  Input "x" is a s
16260 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67  equence of unsig
16270 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20 74  ned characters t
16280 68 61 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a  hat represent a.
16290 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  ** big-endian in
162a0 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74  teger.  Return t
162b0 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61  he equivalent na
162c0 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a  tive integer.*/.
162d0 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45  #define ONE_BYTE
162e0 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69 38 29  _INT(x)    ((i8)
162f0 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[0]).#define 
16300 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  TWO_BYTE_INT(x) 
16310 20 20 20 28 32 35 36 2a 28 69 38 29 28 28 78 29     (256*(i8)((x)
16320 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65  [0])|(x)[1]).#de
16330 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f  fine THREE_BYTE_
16340 49 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a 28  INT(x)  (65536*(
16350 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29  i8)((x)[0])|((x)
16360 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a  [1]<<8)|(x)[2]).
16370 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54  #define FOUR_BYT
16380 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75 33  E_UINT(x)  (((u3
16390 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28  2)(x)[0]<<24)|((
163a0 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b  x)[1]<<16)|((x)[
163b0 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a  2]<<8)|(x)[3])..
163c0 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
163d0 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
163e0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
163f0 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
16400 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
16410 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
16420 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
16430 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
16440 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
16450 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56  */ .u32 sqlite3V
16460 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
16470 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
16480 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
16490 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
164a0 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
164b0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
164c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
164d0 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
164e0 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
164f0 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
16500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16510 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
16520 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
16530 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78  to */.){.  u64 x
16540 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 73 77 69  ;.  u32 y;.  swi
16550 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
16560 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
16570 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
16580 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
16590 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
165a0 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
165b0 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
165c0 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
165d0 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d  NULL */.      pM
165e0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
165f0 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
16600 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
16610 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65  e 1: { /* 1-byte
16620 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
16630 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
16640 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  .i = ONE_BYTE_IN
16650 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
16660 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
16670 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
16680 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
16690 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
166a0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
166b0 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
166c0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
166d0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
166e0 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49  u.i = TWO_BYTE_I
166f0 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
16700 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
16710 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
16720 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
16730 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
16740 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 2;.    }.    c
16750 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
16760 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
16770 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
16780 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54  >u.i = THREE_BYT
16790 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
167a0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
167b0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
167c0 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
167d0 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
167e0 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20  turn 3;.    }.  
167f0 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
16800 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
16810 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20  eger */.      y 
16820 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
16830 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
16840 6d 2d 3e 75 2e 69 20 3d 20 28 69 36 34 29 2a 28  m->u.i = (i64)*(
16850 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 70  int*)&y;.      p
16860 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
16870 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
16880 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
16890 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
168a0 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 4;.    }.    c
168b0 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
168c0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
168d0 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
168e0 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45  >u.i = FOUR_BYTE
168f0 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28  _UINT(buf+2) + (
16900 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
16910 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  O_BYTE_INT(buf);
16920 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
16930 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
16940 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
16950 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
16960 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20     return 6;.   
16970 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20   }.    case 6:  
16980 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
16990 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
169a0 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45   case 7: { /* IE
169b0 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  EE floating poin
169c0 74 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  t */.#if !define
169d0 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65  d(NDEBUG) && !de
169e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
169f0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
16a00 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66  ).      /* Verif
16a10 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
16a20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
16a30 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
16a40 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  e same.      ** 
16a50 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
16a60 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
16a70 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
16a80 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
16a90 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61    ** defined tha
16aa0 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  t 64-bit floatin
16ab0 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72  g point values r
16ac0 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a  eally are mixed.
16ad0 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e        ** endian.
16ae0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16af0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34  static const u64
16b00 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66   t1 = ((u64)0x3f
16b10 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20  f00000)<<32;.   
16b20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
16b30 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b  double r1 = 1.0;
16b40 0a 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20  .      u64 t2 = 
16b50 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  t1;.      swapMi
16b60 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
16b70 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  2);.      assert
16b80 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69  ( sizeof(r1)==si
16b90 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63  zeof(t2) && memc
16ba0 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a  mp(&r1, &t2, siz
16bb0 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23  eof(r1))==0 );.#
16bc0 65 6e 64 69 66 0a 20 20 20 20 20 20 78 20 3d 20  endif.      x = 
16bd0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
16be0 75 66 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46  uf);.      y = F
16bf0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
16c00 66 2b 34 29 3b 0a 20 20 20 20 20 20 78 20 3d 20  f+4);.      x = 
16c10 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
16c20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
16c30 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20  pe==6 ){.       
16c40 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
16c50 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20  64*)&x;.        
16c60 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
16c70 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 20 20 74  M_Int;.        t
16c80 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
16c90 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 7d 65  .i<0 );.      }e
16ca0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
16cb0 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
16cc0 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
16cd0 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20  ->r)==8 );.     
16ce0 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
16cf0 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20  anFloat(x);.    
16d00 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d      memcpy(&pMem
16d10 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  ->r, &x, sizeof(
16d20 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  x));.        pMe
16d30 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74  m->flags = sqlit
16d40 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29  e3IsNaN(pMem->r)
16d50 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45   ? MEM_Null : ME
16d60 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  M_Real;.      }.
16d70 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a        return 8;.
16d80 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38      }.    case 8
16d90 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  :    /* Integer 
16da0 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a  0 */.    case 9:
16db0 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31   {  /* Integer 1
16dc0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
16dd0 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70  u.i = serial_typ
16de0 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e-8;.      pMem-
16df0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
16e00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
16e10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
16e20 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61  ult: {.      sta
16e30 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46  tic const u16 aF
16e40 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c  lag[] = { MEM_Bl
16e50 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45  ob|MEM_Ephem, ME
16e60 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20  M_Str|MEM_Ephem 
16e70 7d 3b 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e  };.      u32 len
16e80 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
16e90 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65  12)/2;.      pMe
16ea0 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62  m->z = (char *)b
16eb0 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  uf;.      pMem->
16ec0 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70  n = len;.      p
16ed0 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20  Mem->xDel = 0;. 
16ee0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
16ef0 20 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f   = aFlag[serial_
16f00 74 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72  type&1];.      r
16f10 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d  eturn len;.    }
16f20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
16f30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
16f40 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
16f50 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69  o allocate suffi
16f60 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20  cient space for 
16f70 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  an UnpackedRecor
16f80 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c  d.** structure l
16f90 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62  arge enough to b
16fa0 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69  e used with sqli
16fb0 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
16fc0 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20  ack() if.** the 
16fd0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
16fe0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b  s a pointer to K
16ff0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
17000 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a   pKeyInfo..**.**
17010 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65 69   The space is ei
17020 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75  ther allocated u
17030 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61  sing sqlite3DbMa
17040 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f  llocRaw() or fro
17050 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20  m within.** the 
17060 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72  unaligned buffer
17070 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20   passed via the 
17080 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64  second and third
17090 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73   arguments (pres
170a0 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20  umably.** stack 
170b0 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 66  space). If the f
170c0 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46  ormer, then *ppF
170d0 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 20  ree is set to a 
170e0 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f  pointer that sho
170f0 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75  uld.** be eventu
17100 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 68  ally freed by th
17110 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
17120 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 20  qlite3DbFree(). 
17130 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61  Or, if the .** a
17140 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20  llocation comes 
17150 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f  from the pSpace/
17160 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c 20  szSpace buffer, 
17170 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
17180 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65  o NULL.** before
17190 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
171a0 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
171b0 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
171c0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55  s returned..*/.U
171d0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73  npackedRecord *s
171e0 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55  qlite3VdbeAllocU
171f0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20  npackedRecord(. 
17200 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
17210 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
17220 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
17230 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  of the record */
17240 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c  .  char *pSpace,
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17260 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20     /* Unaligned 
17270 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
17280 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65  */.  int szSpace
17290 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
172a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
172b0 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65  pSpace[] in byte
172c0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  s */.  char **pp
172d0 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20  Free            
172e0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43         /* OUT: C
172f0 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72 65  aller should fre
17300 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 2a  e this pointer *
17310 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52  /.){.  UnpackedR
17320 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20  ecord *p;       
17330 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b         /* Unpack
17340 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74  ed record to ret
17350 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66  urn */.  int nOf
17360 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
17370 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72           /* Incr
17380 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79 20  ement pSpace by 
17390 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69 74  nOff to align it
173a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
173d0 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
173e0 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f  d for *p */..  /
173f0 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69  * We want to shi
17400 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70  ft the pointer p
17410 53 70 61 63 65 20 75 70 20 73 75 63 68 20 74 68  Space up such th
17420 61 74 20 69 74 20 69 73 20 38 2d 62 79 74 65 20  at it is 8-byte 
17430 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68  aligned..  ** Th
17440 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63  us, we need to c
17450 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65  alculate a value
17460 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20  , nOff, between 
17470 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66  0 and 7, to shif
17480 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20  t .  ** it by.  
17490 49 66 20 70 53 70 61 63 65 20 69 73 20 61 6c 72  If pSpace is alr
174a0 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67  eady 8-byte alig
174b0 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64  ned, nOff should
174c0 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20   be zero..  */. 
174d0 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51   nOff = (8 - (SQ
174e0 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
174f0 70 53 70 61 63 65 29 20 26 20 37 29 29 20 26 20  pSpace) & 7)) & 
17500 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  7;.  nByte = ROU
17510 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
17520 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69  kedRecord)) + si
17530 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49  zeof(Mem)*(pKeyI
17540 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a  nfo->nField+1);.
17550 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70    if( nByte>szSp
17560 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20  ace+nOff ){.    
17570 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
17580 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  ord *)sqlite3DbM
17590 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66  allocRaw(pKeyInf
175a0 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  o->db, nByte);. 
175b0 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28 63 68     *ppFree = (ch
175c0 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66 28 20  ar *)p;.    if( 
175d0 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
175e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
175f0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a  (UnpackedRecord*
17600 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a  )&pSpace[nOff];.
17610 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30 3b      *ppFree = 0;
17620 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20  .  }..  p->aMem 
17630 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a  = (Mem*)&((char*
17640 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  )p)[ROUND8(sizeo
17650 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
17660 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ))];.  assert( p
17670 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
17680 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70  der!=0 );.  p->p
17690 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
176a0 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20  fo;.  p->nField 
176b0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  = pKeyInfo->nFie
176c0 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e  ld + 1;.  return
176d0 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   p;.}../*.** Giv
176e0 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65  en the nKey-byte
176f0 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72   encoding of a r
17700 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c  ecord in pKey[],
17710 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a   populate the .*
17720 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  * UnpackedRecord
17730 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63   structure indic
17740 61 74 65 64 20 62 79 20 74 68 65 20 66 6f 75 72  ated by the four
17750 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68  th argument with
17760 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
17770 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64 20   of the decoded 
17780 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64  record..*/ .void
17790 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
177a0 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49  rdUnpack(.  KeyI
177b0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
177c0 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
177d0 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f  n about the reco
177e0 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69  rd format */.  i
177f0 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  nt nKey,        
17800 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
17810 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   the binary reco
17820 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  rd */.  const vo
17830 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f  id *pKey,      /
17840 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63  * The binary rec
17850 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ord */.  Unpacke
17860 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20  dRecord *p      
17870 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73  /* Populate this
17880 20 73 74 72 75 63 74 75 72 65 20 62 65 66 6f 72   structure befor
17890 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a  e returning. */.
178a0 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
178b0 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d  ned char *aKey =
178c0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
178d0 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20   char *)pKey;.  
178e0 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64  int d; .  u32 id
178f0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
17900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
17910 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f  set in aKey[] to
17920 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
17930 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20  u16 u;          
17940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17950 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
17960 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33   counter */.  u3
17970 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a  2 szHdr;.  Mem *
17980 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a  pMem = p->aMem;.
17990 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63  .  p->default_rc
179a0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
179b0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
179c0 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20  MENT(pMem) );.  
179d0 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33  idx = getVarint3
179e0 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a  2(aKey, szHdr);.
179f0 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75    d = szHdr;.  u
17a00 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
17a10 64 78 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d  dx<szHdr && u<p-
17a20 3e 6e 46 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b  >nField && d<=nK
17a30 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ey ){.    u32 se
17a40 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
17a50 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
17a60 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73  32(&aKey[idx], s
17a70 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
17a80 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65   pMem->enc = pKe
17a90 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
17aa0 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49  pMem->db = pKeyI
17ab0 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20  nfo->db;.    /* 
17ac0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  pMem->flags = 0;
17ad0 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53   // sqlite3VdbeS
17ae0 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20  erialGet() will 
17af0 73 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20  set this for us 
17b00 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61  */.    pMem->zMa
17b10 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20  lloc = 0;.    d 
17b20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
17b30 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d  rialGet(&aKey[d]
17b40 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70  , serial_type, p
17b50 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  Mem);.    pMem++
17b60 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20  ;.    u++;.  }. 
17b70 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79   assert( u<=pKey
17b80 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31  Info->nField + 1
17b90 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20   );.  p->nField 
17ba0 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  = u;.}..#if SQLI
17bb0 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  TE_DEBUG./*.** T
17bc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
17bd0 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20  pares two index 
17be0 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  or table record 
17bf0 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65  keys in the same
17c00 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73   way.** as the s
17c10 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
17c20 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e  Compare() routin
17c30 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65  e. Unlike VdbeRe
17c40 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a  cordCompare(),.*
17c50 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
17c60 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64  deserializes and
17c70 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73   compares values
17c80 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71   using the.** sq
17c90 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
17ca0 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  et() and sqlite3
17cb0 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e  MemCompare() fun
17cc0 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73  ctions. It is us
17cd0 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  ed.** in assert(
17ce0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
17cf0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
17d00 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69  optimized code i
17d10 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  n.** sqlite3Vdbe
17d20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
17d30 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20  returns results 
17d40 77 69 74 68 20 74 68 65 73 65 20 74 77 6f 20 70  with these two p
17d50 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2f 0a 73 74  rimitives..*/.st
17d60 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
17d70 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
17d80 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
17d90 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
17da0 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
17db0 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64    const Unpacked
17dc0 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
17dd0 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
17de0 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
17df0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
17e00 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
17e10 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
17e20 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  nt */.  u32 idx1
17e30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
17e40 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
17e50 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20   of next header 
17e60 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
17e70 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
17e80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
17e90 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  es in header */.
17ea0 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
17eb0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e  nt rc = 0;.  con
17ec0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
17ed0 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
17ee0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
17ef0 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66  )pKey1;.  KeyInf
17f00 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d  o *pKeyInfo;.  M
17f10 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79  em mem1;..  pKey
17f20 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70  Info = pPKey2->p
17f30 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e  KeyInfo;.  mem1.
17f40 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
17f50 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d  enc;.  mem1.db =
17f60 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
17f70 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d   /* mem1.flags =
17f80 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20   0;  // Will be 
17f90 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73  initialized by s
17fa0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
17fb0 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f  Get() */.  VVA_O
17fc0 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  NLY( mem1.zMallo
17fd0 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79  c = 0; ) /* Only
17fe0 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72   needed by asser
17ff0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
18000 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72  /..  /* Compiler
18010 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74  s may complain t
18020 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20  hat mem1.u.i is 
18030 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e  potentially unin
18040 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20  itialized..  ** 
18050 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c  We could initial
18060 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e  ize it, as shown
18070 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63   here, to silenc
18080 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e  e those complain
18090 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20  ts..  ** But in 
180a0 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77  fact, mem1.u.i w
180b0 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c  ill never actual
180c0 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69  ly be used unini
180d0 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f  tialized, and do
180e0 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e  ing .  ** the un
180f0 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61  necessary initia
18100 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d  lization has a m
18110 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69  easurable negati
18120 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20  ve performance. 
18130 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63   ** impact, sinc
18140 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
18150 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75  s a very high ru
18160 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77  nner.  And so, w
18170 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f  e choose.  ** to
18180 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70   ignore the comp
18190 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e  iler warnings an
181a0 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72  d leave this var
181b0 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69  iable uninitiali
181c0 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20  zed..  */.  /*  
181d0 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f  mem1.u.i = 0;  /
181e0 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65  / not needed, he
181f0 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f  re to silence co
18200 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a  mpiler warning *
18210 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65  /.  .  idx1 = ge
18220 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
18230 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d   szHdr1);.  d1 =
18240 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72   szHdr1;.  asser
18250 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  t( pKeyInfo->nFi
18260 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58  eld+pKeyInfo->nX
18270 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e  Field>=pPKey2->n
18280 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54  Field || CORRUPT
18290 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
182a0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
182b0 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Order!=0 );.  as
182c0 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
182d0 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73  nField>0 );.  as
182e0 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64  sert( idx1<=szHd
182f0 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  r1 || CORRUPT_DB
18300 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33   );.  do{.    u3
18310 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
18320 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
18330 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f   serial types fo
18340 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65  r the next eleme
18350 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20  nt in each key. 
18360 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67  */.    idx1 += g
18370 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79  etVarint32( aKey
18380 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74  1+idx1, serial_t
18390 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ype1 );..    /* 
183a0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 72  Verify that ther
183b0 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20  e is enough key 
183c0 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20  space remaining 
183d0 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20  to avoid.    ** 
183e0 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  a buffer overrea
183f0 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72 69  d.  The "d1+seri
18400 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65  al_type1+2" sube
18410 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20  xpression will. 
18420 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20     ** always be 
18430 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
18440 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f  equal to the amo
18450 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64 20  unt of required 
18460 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a  key space..    *
18470 2a 20 55 73 65 20 74 68 61 74 20 61 70 70 72 6f  * Use that appro
18480 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69  ximation to avoi
18490 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e  d the more expen
184a0 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20  sive call to.   
184b0 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53   ** sqlite3VdbeS
184c0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69  erialTypeLen() i
184d0 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
184e0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
184f0 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65  ( d1+serial_type
18500 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20  1+2>(u32)nKey1. 
18510 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65      && d1+sqlite
18520 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
18530 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29  en(serial_type1)
18540 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20  >(u32)nKey1 .   
18550 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
18560 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
18570 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
18580 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64  s to be compared
18590 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20  ..    */.    d1 
185a0 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
185b0 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
185c0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  1], serial_type1
185d0 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f  , &mem1);..    /
185e0 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  * Do the compari
185f0 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  son.    */.    r
18600 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  c = sqlite3MemCo
18610 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50  mpare(&mem1, &pP
18620 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70  Key2->aMem[i], p
18630 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
18640 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  ]);.    if( rc!=
18650 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
18660 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d  t( mem1.zMalloc=
18670 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
18680 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20  mment below */. 
18690 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
186a0 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
186b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
186c0 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74   -rc;  /* Invert
186d0 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20   the result for 
186e0 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e  DESC sort order.
186f0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
18700 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18710 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77   }.    i++;.  }w
18720 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72  hile( idx1<szHdr
18730 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
18740 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e  Field );..  /* N
18750 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
18760 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
18770 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
18780 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
18790 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
187a0 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
187b0 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
187c0 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
187d0 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
187e0 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
187f0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
18800 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
18810 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
18820 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30   mem1.zMalloc==0
18830 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
18840 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
18850 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20  one of the keys 
18860 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
18870 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
18880 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
18890 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
188a0 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68  equal. Return th
188b0 65 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63  e the default_rc
188c0 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f  .  ** value.  */
188d0 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32  .  return pPKey2
188e0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a  ->default_rc;.}.
188f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f  #endif../*.** Bo
18900 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70  th *pMem1 and *p
18910 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72  Mem2 contain str
18920 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70  ing values. Comp
18930 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75  are the two valu
18940 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  es.** using the 
18950 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
18960 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75  ce pColl. As usu
18970 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67  al, return a neg
18980 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20  ative , zero.** 
18990 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75  or positive valu
189a0 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c  e if *pMem1 is l
189b0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
189c0 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  to or greater th
189d0 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72  an .** *pMem2, r
189e0 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d  espectively. Sim
189f0 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20 74  ilar in spirit t
18a00 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29  o "rc = (*pMem1)
18a10 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a   - (*pMem2);"..*
18a20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
18a30 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
18a40 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  g(.  const Mem *
18a50 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d  pMem1,.  const M
18a60 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e  em *pMem2,.  con
18a70 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  st CollSeq *pCol
18a80 6c 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31  l.){.  if( pMem1
18a90 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e  ->enc==pColl->en
18aa0 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  c ){.    /* The 
18ab0 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65  strings are alre
18ac0 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65  ady in the corre
18ad0 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61  ct encoding.  Ca
18ae0 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63  ll the.     ** c
18af0 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
18b00 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20  on directly */. 
18b10 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d     return pColl-
18b20 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
18b30 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d  er,pMem1->n,pMem
18b40 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d  1->z,pMem2->n,pM
18b50 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65  em2->z);.  }else
18b60 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
18b70 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31    const void *v1
18b80 2c 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e  , *v2;.    int n
18b90 31 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63  1, n2;.    Mem c
18ba0 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20  1;.    Mem c2;. 
18bb0 20 20 20 6d 65 6d 73 65 74 28 26 63 31 2c 20 30     memset(&c1, 0
18bc0 2c 20 73 69 7a 65 6f 66 28 63 31 29 29 3b 0a 20  , sizeof(c1));. 
18bd0 20 20 20 6d 65 6d 73 65 74 28 26 63 32 2c 20 30     memset(&c2, 0
18be0 2c 20 73 69 7a 65 6f 66 28 63 32 29 29 3b 0a 20  , sizeof(c2));. 
18bf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
18c00 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31  mShallowCopy(&c1
18c10 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68  , pMem1, MEM_Eph
18c20 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  em);.    sqlite3
18c30 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
18c40 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d  py(&c2, pMem2, M
18c50 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76  EM_Ephem);.    v
18c60 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  1 = sqlite3Value
18c70 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61  Text((sqlite3_va
18c80 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d  lue*)&c1, pColl-
18c90 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20  >enc);.    n1 = 
18ca0 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e  v1==0 ? 0 : c1.n
18cb0 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74  ;.    v2 = sqlit
18cc0 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
18cd0 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c  ite3_value*)&c2,
18ce0 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
18cf0 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30    n2 = v2==0 ? 0
18d00 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20   : c2.n;.    rc 
18d10 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  = pColl->xCmp(pC
18d20 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20  oll->pUser, n1, 
18d30 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20  v1, n2, v2);.   
18d40 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
18d50 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20  elease(&c1);.   
18d60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
18d70 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20  elease(&c2);.   
18d80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
18d90 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
18da0 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74   the values cont
18db0 61 69 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f  ained by the two
18dc0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72   memory cells, r
18dd0 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61  eturning.** nega
18de0 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f  tive, zero or po
18df0 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20  sitive if pMem1 
18e00 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
18e10 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
18e20 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32  er.** than pMem2
18e30 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20  . Sorting order 
18e40 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c  is NULL's first,
18e50 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d   followed by num
18e60 62 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a  bers (integers.*
18e70 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72  * and reals) sor
18e80 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c  ted numerically,
18e90 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78   followed by tex
18ea0 74 20 6f 72 64 65 72 65 64 20 62 79 20 74 68 65  t ordered by the
18eb0 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
18ec0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64  quence pColl and
18ed0 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20   finally blob's 
18ee0 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d  ordered by memcm
18ef0 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e  p()..**.** Two N
18f00 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63  ULL values are c
18f10 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20  onsidered equal 
18f20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
18f30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18f40 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74  MemCompare(const
18f50 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e   Mem *pMem1, con
18f60 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63  st Mem *pMem2, c
18f70 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43  onst CollSeq *pC
18f80 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  oll){.  int rc;.
18f90 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20    int f1, f2;.  
18fa0 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  int combined_fla
18fb0 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d  gs;..  f1 = pMem
18fc0 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d  1->flags;.  f2 =
18fd0 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20   pMem2->flags;. 
18fe0 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20   combined_flags 
18ff0 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72  = f1|f2;.  asser
19000 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  t( (combined_fla
19010 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29  gs & MEM_RowSet)
19020 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66  ==0 );. .  /* If
19030 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55   one value is NU
19040 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74  LL, it is less t
19050 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49  han the other. I
19060 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20  f both values.  
19070 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74  ** are NULL, ret
19080 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  urn 0..  */.  if
19090 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
190a0 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
190b0 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f   return (f2&MEM_
190c0 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f  Null) - (f1&MEM_
190d0 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Null);.  }..  /*
190e0 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73   If one value is
190f0 20 61 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68   a number and th
19100 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2c 20  e other is not, 
19110 74 68 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  the number is le
19120 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68  ss..  ** If both
19130 20 61 72 65 20 6e 75 6d 62 65 72 73 2c 20 63 6f   are numbers, co
19140 6d 70 61 72 65 20 61 73 20 72 65 61 6c 73 20 69  mpare as reals i
19150 66 20 6f 6e 65 20 69 73 20 61 20 72 65 61 6c 2c  f one is a real,
19160 20 6f 72 20 61 73 20 69 6e 74 65 67 65 72 73 0a   or as integers.
19170 20 20 2a 2a 20 69 66 20 62 6f 74 68 20 76 61 6c    ** if both val
19180 75 65 73 20 61 72 65 20 69 6e 74 65 67 65 72 73  ues are integers
19190 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
191a0 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d  bined_flags&(MEM
191b0 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29  _Int|MEM_Real) )
191c0 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 31 2c  {.    double r1,
191d0 20 72 32 3b 0a 20 20 20 20 69 66 28 20 28 66 31   r2;.    if( (f1
191e0 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29   & f2 & MEM_Int)
191f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
19200 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d   pMem1->u.i < pM
19210 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72  em2->u.i ) retur
19220 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20  n -1;.      if( 
19230 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65  pMem1->u.i > pMe
19240 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e  m2->u.i ) return
19250 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
19260 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
19270 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21  ( (f1&MEM_Real)!
19280 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d  =0 ){.      r1 =
19290 20 70 4d 65 6d 31 2d 3e 72 3b 0a 20 20 20 20 7d   pMem1->r;.    }
192a0 65 6c 73 65 20 69 66 28 20 28 66 31 26 4d 45 4d  else if( (f1&MEM
192b0 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
192c0 20 20 72 31 20 3d 20 28 64 6f 75 62 6c 65 29 70    r1 = (double)p
192d0 4d 65 6d 31 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  Mem1->u.i;.    }
192e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
192f0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
19300 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c  if( (f2&MEM_Real
19310 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 32  )!=0 ){.      r2
19320 20 3d 20 70 4d 65 6d 32 2d 3e 72 3b 0a 20 20 20   = pMem2->r;.   
19330 20 7d 65 6c 73 65 20 69 66 28 20 28 66 32 26 4d   }else if( (f2&M
19340 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
19350 20 20 20 20 72 32 20 3d 20 28 64 6f 75 62 6c 65      r2 = (double
19360 29 70 4d 65 6d 32 2d 3e 75 2e 69 3b 0a 20 20 20  )pMem2->u.i;.   
19370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
19380 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
19390 20 20 20 69 66 28 20 72 31 3c 72 32 20 29 20 72     if( r1<r2 ) r
193a0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66  eturn -1;.    if
193b0 28 20 72 31 3e 72 32 20 29 20 72 65 74 75 72 6e  ( r1>r2 ) return
193c0 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   1;.    return 0
193d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f  ;.  }..  /* If o
193e0 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20 73 74  ne value is a st
193f0 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68  ring and the oth
19400 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68  er is a blob, th
19410 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73  e string is less
19420 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61  ..  ** If both a
19430 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70  re strings, comp
19440 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f  are using the co
19450 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
19460 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  s..  */.  if( co
19470 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d  mbined_flags&MEM
19480 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20  _Str ){.    if( 
19490 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d  (f1 & MEM_Str)==
194a0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
194b0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
194c0 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72  f( (f2 & MEM_Str
194d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
194e0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  turn -1;.    }..
194f0 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
19500 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65  1->enc==pMem2->e
19510 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nc );.    assert
19520 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51  ( pMem1->enc==SQ
19530 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20  LITE_UTF8 || .  
19540 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d            pMem1-
19550 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
19560 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65  16LE || pMem1->e
19570 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
19580 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  BE );..    /* Th
19590 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
195a0 65 6e 63 65 20 6d 75 73 74 20 62 65 20 64 65 66  ence must be def
195b0 69 6e 65 64 20 61 74 20 74 68 69 73 20 70 6f 69  ined at this poi
195c0 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  nt, even if.    
195d0 2a 2a 20 74 68 65 20 75 73 65 72 20 64 65 6c 65  ** the user dele
195e0 74 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  tes the collatio
195f0 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72  n sequence after
19600 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
19610 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  m is.    ** comp
19620 69 6c 65 64 20 28 74 68 69 73 20 77 61 73 20 6e  iled (this was n
19630 6f 74 20 61 6c 77 61 79 73 20 74 68 65 20 63 61  ot always the ca
19640 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  se)..    */.    
19650 61 73 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c  assert( !pColl |
19660 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b  | pColl->xCmp );
19670 0a 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ..    if( pColl 
19680 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
19690 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74  vdbeCompareMemSt
196a0 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d  ring(pMem1, pMem
196b0 32 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  2, pColl);.    }
196c0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c  .    /* If a NUL
196d0 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61  L pointer was pa
196e0 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c  ssed as the coll
196f0 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61  ate function, fa
19700 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a  ll through.    *
19710 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61  * to the blob ca
19720 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d  se and use memcm
19730 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20  p().  */.  }. . 
19740 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20   /* Both values 
19750 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20  must be blobs.  
19760 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65  Compare using me
19770 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 63  mcmp().  */.  rc
19780 20 3d 20 6d 65 6d 63 6d 70 28 70 4d 65 6d 31 2d   = memcmp(pMem1-
19790 3e 7a 2c 20 70 4d 65 6d 32 2d 3e 7a 2c 20 28 70  >z, pMem2->z, (p
197a0 4d 65 6d 31 2d 3e 6e 3e 70 4d 65 6d 32 2d 3e 6e  Mem1->n>pMem2->n
197b0 29 3f 70 4d 65 6d 32 2d 3e 6e 3a 70 4d 65 6d 31  )?pMem2->n:pMem1
197c0 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ->n);.  if( rc==
197d0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 4d  0 ){.    rc = pM
197e0 65 6d 31 2d 3e 6e 20 2d 20 70 4d 65 6d 32 2d 3e  em1->n - pMem2->
197f0 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  n;.  }.  return 
19800 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
19810 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
19820 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
19830 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65  function is a se
19840 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a  rial-type that.*
19850 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  * corresponds to
19860 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c   an integer - al
19870 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e  l values between
19880 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69   1 and 9 inclusi
19890 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e  ve .** except 7.
198a0 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e   The second poin
198b0 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
198c0 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74  ontaining an int
198d0 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65  eger value.** se
198e0 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69  rialized accordi
198f0 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70  ng to serial_typ
19900 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
19910 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a   deserializes.**
19920 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
19930 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
19940 63 20 69 36 34 20 76 64 62 65 52 65 63 6f 72 64  c i64 vdbeRecord
19950 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65  DecodeInt(u32 se
19960 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74  rial_type, const
19970 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33   u8 *aKey){.  u3
19980 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43  2 y;.  assert( C
19990 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65  ORRUPT_DB || (se
199a0 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20  rial_type>=1 && 
199b0 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26  serial_type<=9 &
199c0 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37  & serial_type!=7
199d0 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  ) );.  switch( s
199e0 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
199f0 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61    case 0:.    ca
19a00 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74  se 1:.      test
19a10 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
19a20 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
19a30 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28  rn ONE_BYTE_INT(
19a40 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
19a50 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  2:.      testcas
19a60 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
19a70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
19a80 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
19a90 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a  y);.    case 3:.
19aa0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19ab0 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
19ac0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 52        return THR
19ad0 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  EE_BYTE_INT(aKey
19ae0 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b  );.    case 4: {
19af0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19b00 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
19b10 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f  .      y = FOUR_
19b20 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
19b30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69  .      return (i
19b40 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20  64)*(int*)&y;.  
19b50 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
19b60 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
19b70 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
19b80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 46  ;.      return F
19b90 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
19ba0 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  ey+2) + (((i64)1
19bb0 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
19bc0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d  INT(aKey);.    }
19bd0 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20  .    case 6: {. 
19be0 20 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55       u64 x = FOU
19bf0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
19c00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
19c10 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
19c20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  );.      x = (x<
19c30 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45  <32) | FOUR_BYTE
19c40 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20  _UINT(aKey+4);. 
19c50 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34       return (i64
19c60 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20  )*(i64*)&x;.    
19c70 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
19c80 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38  (serial_type - 8
19c90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
19ca0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
19cb0 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  es the two table
19cc0 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72   rows or index r
19cd0 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66  ecords.** specif
19ce0 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70  ied by {nKey1, p
19cf0 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32  Key1} and pPKey2
19d00 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20  .  It returns a 
19d10 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a  negative, zero.*
19d20 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e  * or positive in
19d30 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73  teger if key1 is
19d40 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
19d50 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61  l to or .** grea
19d60 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20  ter than key2.  
19d70 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79  The {nKey1, pKey
19d80 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  1} key must be a
19d90 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64   blob.** created
19da0 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65   by th OP_MakeRe
19db0 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74  cord opcode of t
19dc0 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50  he VDBE.  The pP
19dd0 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74  Key2.** key must
19de0 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79   be a parsed key
19df0 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65   such as obtaine
19e00 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
19e10 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64  3VdbeParseRecord
19e20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
19e30 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e  ent bSkip is non
19e40 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73  -zero, it is ass
19e50 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
19e60 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
19e70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74  .** determined t
19e80 68 61 74 20 74 68 65 20 66 69 72 73 74 20 66 69  hat the first fi
19e90 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73  elds of the keys
19ea0 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a   are equal..**.*
19eb0 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
19ec0 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
19ed0 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
19ee0 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
19ef0 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65  . If all .** fie
19f00 6c 64 73 20 74 68 61 74 20 61 70 70 65 61 72 20  lds that appear 
19f10 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65  in both keys are
19f20 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b   equal, then pPK
19f30 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
19f40 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
19f50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
19f60 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
19f70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
19f80 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
19f90 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  ,   /* Left key 
19fa0 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63  */.  const Unpac
19fb0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
19fc0 32 2c 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65  2,   /* Right ke
19fd0 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70  y */.  int bSkip
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ff0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
1a000 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69 72 73  e, skip the firs
1a010 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20  t field */.){.  
1a020 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20  u32 d1;         
1a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a040 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
1a050 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
1a060 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
1a070 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a090 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74  /* Index of next
1a0a0 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72   field to compar
1a0b0 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  e */.  u32 szHdr
1a0c0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1a0d0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1a0e0 66 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20  f record header 
1a0f0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
1a100 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a120 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
1a130 20 74 79 70 65 20 69 6e 20 68 65 61 64 65 72 20   type in header 
1a140 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  */.  int rc = 0;
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a160 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
1a170 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  alue */.  Mem *p
1a180 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d  Rhs = pPKey2->aM
1a190 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  em;       /* Nex
1a1a0 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79  t field of pPKey
1a1b0 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  2 to compare */.
1a1c0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1a1d0 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b  nfo = pPKey2->pK
1a1e0 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20  eyInfo;.  const 
1a1f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1a200 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
1a210 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
1a220 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  ey1;.  Mem mem1;
1a230 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69 70 20  ..  /* If bSkip 
1a240 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
1a250 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
1a260 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65 64 20  eady determined 
1a270 74 68 61 74 20 74 68 65 20 66 69 72 73 74 0a 20  that the first. 
1a280 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73   ** two elements
1a290 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65   in the keys are
1a2a0 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68 65 20   equal. Fix the 
1a2b0 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20 76 61  various stack va
1a2c0 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20  riables so.  ** 
1a2d0 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
1a2e0 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 69  e begins compari
1a2f0 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64  ng at the second
1a300 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28   field. */.  if(
1a310 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20 75 33   bSkip ){.    u3
1a320 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31 20 3d  2 s1;.    idx1 =
1a330 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74 33 32   1 + getVarint32
1a340 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b  (&aKey1[1], s1);
1a350 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20 61 4b  .    szHdr1 = aK
1a360 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d  ey1[0];.    d1 =
1a370 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69 74 65   szHdr1 + sqlite
1a380 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1a390 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20 3d 20  en(s1);.    i = 
1a3a0 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  1;.    pRhs++;. 
1a3b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 31   }else{.    idx1
1a3c0 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1a3d0 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
1a3e0 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a     d1 = szHdr1;.
1a3f0 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a      i = 0;.  }..
1a400 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
1a410 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20  .zMalloc = 0; ) 
1a420 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62  /* Only needed b
1a430 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  y assert() state
1a440 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  ments */.  asser
1a450 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  t( pPKey2->pKeyI
1a460 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65  nfo->nField+pPKe
1a470 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58  y2->pKeyInfo->nX
1a480 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e  Field>=pPKey2->n
1a490 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c  Field .       ||
1a4a0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1a4b0 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
1a4c0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74  >pKeyInfo->aSort
1a4d0 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Order!=0 );.  as
1a4e0 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
1a4f0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30  eyInfo->nField>0
1a500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
1a510 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f  x1<=szHdr1 || CO
1a520 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f  RRUPT_DB );.  do
1a530 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
1a540 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52  _type;..    /* R
1a550 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  HS is an integer
1a560 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73   */.    if( pRhs
1a570 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
1a580 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61  t ){.      seria
1a590 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
1a5a0 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74  dx1];.      test
1a5b0 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
1a5c0 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
1a5d0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
1a5e0 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  12 ){.        rc
1a5f0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1a600 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
1a610 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pe==0 ){.       
1a620 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1a630 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
1a640 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
1a650 20 20 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d      double rhs =
1a660 20 28 64 6f 75 62 6c 65 29 70 52 68 73 2d 3e 75   (double)pRhs->u
1a670 2e 69 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  .i;.        sqli
1a680 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1a690 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
1a6a0 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29  ial_type, &mem1)
1a6b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65  ;.        if( me
1a6c0 6d 31 2e 72 3c 72 68 73 20 29 7b 0a 20 20 20 20  m1.r<rhs ){.    
1a6d0 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1a6e0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1a6f0 20 6d 65 6d 31 2e 72 3e 72 68 73 20 29 7b 0a 20   mem1.r>rhs ){. 
1a700 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
1a710 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a730 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52   i64 lhs = vdbeR
1a740 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73  ecordDecodeInt(s
1a750 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65  erial_type, &aKe
1a760 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20  y1[d1]);.       
1a770 20 69 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d   i64 rhs = pRhs-
1a780 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66  >u.i;.        if
1a790 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20  ( lhs<rhs ){.   
1a7a0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1a7b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1a7c0 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20  ( lhs>rhs ){.   
1a7d0 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1a7e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a7f0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1a800 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20  RHS is real */. 
1a810 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73     else if( pRhs
1a820 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
1a830 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69  al ){.      seri
1a840 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
1a850 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28  idx1];.      if(
1a860 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
1a870 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1a880 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1a890 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1a8a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1a8b0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1a8c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 6f 75  lse{.        dou
1a8d0 62 6c 65 20 72 68 73 20 3d 20 70 52 68 73 2d 3e  ble rhs = pRhs->
1a8e0 72 3b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c  r;.        doubl
1a8f0 65 20 6c 68 73 3b 0a 20 20 20 20 20 20 20 20 73  e lhs;.        s
1a900 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1a910 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
1a920 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65  serial_type, &me
1a930 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  m1);.        if(
1a940 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
1a950 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 68 73  ){.          lhs
1a960 20 3d 20 6d 65 6d 31 2e 72 3b 0a 20 20 20 20 20   = mem1.r;.     
1a970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a980 20 20 20 20 6c 68 73 20 3d 20 28 64 6f 75 62 6c      lhs = (doubl
1a990 65 29 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20  e)mem1.u.i;.    
1a9a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1a9b0 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20  ( lhs<rhs ){.   
1a9c0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1a9d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1a9e0 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20  ( lhs>rhs ){.   
1a9f0 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1aa00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1aa10 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1aa20 52 48 53 20 69 73 20 61 20 73 74 72 69 6e 67 20  RHS is a string 
1aa30 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
1aa40 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1aa50 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67  M_Str ){.      g
1aa60 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1aa70 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f  1[idx1], serial_
1aa80 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73  type);.      tes
1aa90 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
1aaa0 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
1aab0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
1aac0 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  12 ){.        rc
1aad0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1aae0 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f  se if( !(serial_
1aaf0 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a  type & 0x01) ){.
1ab00 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1ab10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ab20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28        mem1.n = (
1ab30 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32  serial_type - 12
1ab40 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74  ) / 2;.        t
1ab50 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d  estcase( (d1+mem
1ab60 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  1.n)==(unsigned)
1ab70 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
1ab80 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d   testcase( (d1+m
1ab90 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67  em1.n+1)==(unsig
1aba0 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
1abb0 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d       if( (d1+mem
1abc0 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64  1.n) > (unsigned
1abd0 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20  )nKey1 ){.      
1abe0 20 20 20 20 72 63 20 3d 20 31 3b 20 20 20 20 20      rc = 1;     
1abf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1ac00 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1ac10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b      }else if( pK
1ac20 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1ac30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1ac40 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
1ac50 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20  o->enc;.        
1ac60 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79    mem1.db = pKey
1ac70 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20  Info->db;.      
1ac80 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d      mem1.flags =
1ac90 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20   MEM_Str;.      
1aca0 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68      mem1.z = (ch
1acb0 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a  ar*)&aKey1[d1];.
1acc0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76            rc = v
1acd0 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
1ace0 69 6e 67 28 26 6d 65 6d 31 2c 20 70 52 68 73 2c  ing(&mem1, pRhs,
1acf0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
1ad00 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
1ad10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1ad20 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65  nt nCmp = MIN(me
1ad30 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a  m1.n, pRhs->n);.
1ad40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
1ad50 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d  emcmp(&aKey1[d1]
1ad60 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29  , pRhs->z, nCmp)
1ad70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1ad80 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d  rc==0 ) rc = mem
1ad90 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a  1.n - pRhs->n; .
1ada0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1adb0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1adc0 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  RHS is a blob */
1add0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1ade0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1adf0 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 67 65  Blob ){.      ge
1ae00 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1ae10 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
1ae20 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ype);.      test
1ae30 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
1ae40 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
1ae50 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
1ae60 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70  2 || (serial_typ
1ae70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20  e & 0x01) ){.   
1ae80 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1ae90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1aea0 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73     int nStr = (s
1aeb0 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
1aec0 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65   / 2;.        te
1aed0 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
1aee0 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1aef0 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  y1 );.        te
1af00 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
1af10 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  +1)==(unsigned)n
1af20 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1af30 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20  if( (d1+nStr) > 
1af40 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1af50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1af60 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
1af70 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
1af80 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  n */.        }el
1af90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
1afa0 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74  t nCmp = MIN(nSt
1afb0 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20  r, pRhs->n);.   
1afc0 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63         rc = memc
1afd0 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70  mp(&aKey1[d1], p
1afe0 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20  Rhs->z, nCmp);. 
1aff0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1b000 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d  =0 ) rc = nStr -
1b010 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20   pRhs->n;.      
1b020 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1b030 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1b040 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73   null */.    els
1b050 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  e{.      serial_
1b060 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1b070 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28  1];.      rc = (
1b080 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b  serial_type!=0);
1b090 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1b0a0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  rc!=0 ){.      i
1b0b0 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
1b0c0 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
1b0d0 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a        rc = -rc;.
1b0e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
1b0f0 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
1b100 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 72  .          || (r
1b110 63 3c 30 20 26 26 20 76 64 62 65 52 65 63 6f 72  c<0 && vdbeRecor
1b120 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1b130 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1b140 79 32 29 3c 30 29 0a 20 20 20 20 20 20 20 20 20  y2)<0).         
1b150 20 7c 7c 20 28 72 63 3e 30 20 26 26 20 76 64 62   || (rc>0 && vdb
1b160 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1b170 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
1b180 2c 20 70 50 4b 65 79 32 29 3e 30 29 0a 20 20 20  , pPKey2)>0).   
1b190 20 20 20 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e         || pKeyIn
1b1a0 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  fo->db->mallocFa
1b1b0 69 6c 65 64 0a 20 20 20 20 20 20 29 3b 0a 20 20  iled.      );.  
1b1c0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
1b1d0 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20  .zMalloc==0 );  
1b1e0 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62  /* See comment b
1b1f0 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65  elow */.      re
1b200 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1b210 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68      i++;.    pRh
1b220 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73  s++;.    d1 += s
1b230 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1b240 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
1b250 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b  ype);.    idx1 +
1b260 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c  = sqlite3VarintL
1b270 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
1b280 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c  .  }while( idx1<
1b290 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31  (unsigned)szHdr1
1b2a0 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
1b2b0 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73  ield && d1<=(uns
1b2c0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a  igned)nKey1 );..
1b2d0 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
1b2e0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
1b2f0 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
1b300 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
1b310 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
1b320 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
1b330 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
1b340 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
1b350 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
1b360 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
1b370 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
1b380 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1b390 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73  &mem1).  */.  as
1b3a0 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c  sert( mem1.zMall
1b3b0 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72  oc==0 );..  /* r
1b3c0 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20  c==0 here means 
1b3d0 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68  that one or both
1b3e0 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
1b3f0 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61   out of fields a
1b400 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20  nd.  ** all the 
1b410 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61  fields up to tha
1b420 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75  t point were equ
1b430 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 74  al. Return the t
1b440 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20  he default_rc.  
1b450 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  ** value.  */.  
1b460 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
1b470 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  DB .       || pP
1b480 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1b490 3d 3d 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  ==vdbeRecordComp
1b4a0 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1b4b0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 20 0a  pKey1, pPKey2) .
1b4c0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50    );.  return pP
1b4d0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1b4e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1b4f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f  function is an o
1b500 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e  ptimized version
1b510 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52   of sqlite3VdbeR
1b520 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a  ecordCompare() .
1b530 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20  ** that (a) the 
1b540 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70  first field of p
1b550 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65  PKey2 is an inte
1b560 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65  ger, and (b) the
1b570 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61   .** size-of-hea
1b580 64 65 72 20 76 61 72 69 6e 74 20 61 74 20 74 68  der varint at th
1b590 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79  e start of (pKey
1b5a0 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e  1/nKey1) fits in
1b5b0 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74   a single.** byt
1b5c0 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20  e (i.e. is less 
1b5d0 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2f 0a 73 74  than 128)..*/.st
1b5e0 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
1b5f0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20  ordCompareInt(. 
1b600 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1b610 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
1b620 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1b630 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65  const UnpackedRe
1b640 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a  cord *pPKey2, /*
1b650 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20   Right key */.  
1b660 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20 20  int bSkip       
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b680 20 49 67 6e 6f 72 65 64 20 2a 2f 0a 29 7b 0a 20   Ignored */.){. 
1b690 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20   const u8 *aKey 
1b6a0 3d 20 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70  = &((const u8*)p
1b6b0 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38  Key1)[*(const u8
1b6c0 2a 29 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b  *)pKey1 & 0x3F];
1b6d0 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79  .  int serial_ty
1b6e0 70 65 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a  pe = ((const u8*
1b6f0 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e  )pKey1)[1];.  in
1b700 74 20 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a  t res;.  u32 y;.
1b710 20 20 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76    u64 x;.  i64 v
1b720 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b   = pPKey2->aMem[
1b730 30 5d 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68  0].u.i;.  i64 lh
1b740 73 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  s;.  UNUSED_PARA
1b750 4d 45 54 45 52 28 62 53 6b 69 70 29 3b 0a 0a 20  METER(bSkip);.. 
1b760 20 61 73 73 65 72 74 28 20 62 53 6b 69 70 3d 3d   assert( bSkip==
1b770 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  0 );.  switch( s
1b780 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
1b790 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31    case 1: { /* 1
1b7a0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1b7b0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
1b7c0 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  s = ONE_BYTE_INT
1b7d0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1b7e0 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1b7f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b800 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
1b810 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
1b820 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1b830 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59      lhs = TWO_BY
1b840 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1b850 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1b860 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1b870 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1b880 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
1b890 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1b8a0 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1b8b0 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61  THREE_BYTE_INT(a
1b8c0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1b8d0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1b8e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b8f0 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
1b900 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
1b910 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1b920 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    y = FOUR_BYTE_
1b930 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1b940 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69    lhs = (i64)*(i
1b950 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65  nt*)&y;.      te
1b960 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1b970 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b980 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
1b990 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
1b9a0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1b9b0 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42      lhs = FOUR_B
1b9c0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29  YTE_UINT(aKey+2)
1b9d0 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
1b9e0 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  )*TWO_BYTE_INT(a
1b9f0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1ba00 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1ba10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ba20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20  }.    case 6: { 
1ba30 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
1ba40 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1ba50 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    x = FOUR_BYTE_
1ba60 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1ba70 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
1ba80 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1ba90 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68  Key+4);.      lh
1baa0 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  s = *(i64*)&x;. 
1bab0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1bac0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1bad0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1bae0 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68  ase 8: .      lh
1baf0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  s = 0;.      bre
1bb00 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a  ak;.    case 9:.
1bb10 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20        lhs = 1;. 
1bb20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
1bb30 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f   /* This case co
1bb40 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77  uld be removed w
1bb50 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
1bb60 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72  the results of r
1bb70 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  unning.    ** th
1bb80 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69  is code. Includi
1bb90 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63 63  ng it causes gcc
1bba0 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66   to generate a f
1bbb0 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20 20  aster switch .  
1bbc0 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28    ** statement (
1bbd0 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20  since the range 
1bbe0 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65 74  of switch target
1bbf0 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20  s now starts at 
1bc00 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20  zero and.    ** 
1bc10 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62  is contiguous) b
1bc20 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  ut does not caus
1bc30 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20  e any duplicate 
1bc40 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72  code to be gener
1bc50 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20  ated.    ** (as 
1bc60 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e  gcc is clever en
1bc70 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20  ough to combine 
1bc80 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73  the two like cas
1bc90 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20  es). Other .    
1bca0 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67  ** compilers mig
1bcb0 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20  ht be similar.  
1bcc0 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20  */ .    case 0: 
1bcd0 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65  case 7:.      re
1bce0 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1bcf0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b  RecordCompare(nK
1bd00 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1bd10 79 32 2c 20 30 29 3b 0a 0a 20 20 20 20 64 65 66  y2, 0);..    def
1bd20 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
1bd30 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
1bd40 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
1bd50 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1bd60 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  , 0);.  }..  if(
1bd70 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65   v>lhs ){.    re
1bd80 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a  s = pPKey2->r1;.
1bd90 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68    }else if( v<lh
1bda0 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  s ){.    res = p
1bdb0 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c  PKey2->r2;.  }el
1bdc0 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e  se if( pPKey2->n
1bdd0 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f  Field>1 ){.    /
1bde0 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
1bdf0 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
1be00 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f  ys are equal. Co
1be10 6d 70 61 72 65 20 74 68 65 20 74 72 61 69 6c 69  mpare the traili
1be20 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  ng .    ** field
1be30 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d  s.  */.    res =
1be40 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1be50 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
1be60 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1be70 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
1be80 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69   /* The first fi
1be90 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20  elds of the two 
1bea0 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20 61  keys are equal a
1beb0 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
1bec0 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20  trailing.    ** 
1bed0 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70  fields. Return p
1bee0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1bef0 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  c in this case. 
1bf00 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  */.    res = pPK
1bf10 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
1bf20 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1bf30 28 72 65 73 3d 3d 30 20 26 26 20 76 64 62 65 52  (res==0 && vdbeR
1bf40 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1bf50 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
1bf60 70 50 4b 65 79 32 29 3d 3d 30 29 0a 20 20 20 20  pPKey2)==0).    
1bf70 20 20 20 7c 7c 20 28 72 65 73 3c 30 20 26 26 20     || (res<0 && 
1bf80 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1bf90 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1bfa0 65 79 31 2c 20 70 50 4b 65 79 32 29 3c 30 29 0a  ey1, pPKey2)<0).
1bfb0 20 20 20 20 20 20 20 7c 7c 20 28 72 65 73 3e 30         || (res>0
1bfc0 20 26 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f   && vdbeRecordCo
1bfd0 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
1bfe0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29  , pKey1, pPKey2)
1bff0 3e 30 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f  >0).       || CO
1c000 52 52 55 50 54 5f 44 42 0a 20 20 29 3b 0a 20 20  RRUPT_DB.  );.  
1c010 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
1c020 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1c030 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  on is an optimiz
1c040 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
1c050 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1c060 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61  ompare() .** tha
1c070 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20  t (a) the first 
1c080 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
1c090 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61  is a string, tha
1c0a0 74 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20  t (b) the first 
1c0b0 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68  field.** uses th
1c0c0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1c0d0 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20  ence BINARY and 
1c0e0 28 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a  (c) that the siz
1c0f0 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
1c100 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74  nt .** at the st
1c110 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b  art of (pKey1/nK
1c120 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73  ey1) fits in a s
1c130 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73  ingle byte..*/.s
1c140 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
1c150 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
1c160 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g(.  int nKey1, 
1c170 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1c180 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
1c190 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b  /.  const Unpack
1c1a0 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1c1b0 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a  , /* Right key *
1c1c0 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 0a 29 7b  /.  int bSkip.){
1c1d0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  .  const u8 *aKe
1c1e0 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29  y1 = (const u8*)
1c1f0 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72  pKey1;.  int ser
1c200 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20  ial_type;.  int 
1c210 72 65 73 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  res;.  UNUSED_PA
1c220 52 41 4d 45 54 45 52 28 62 53 6b 69 70 29 3b 0a  RAMETER(bSkip);.
1c230 0a 20 20 61 73 73 65 72 74 28 20 62 53 6b 69 70  .  assert( bSkip
1c240 3d 3d 30 20 29 3b 0a 20 20 67 65 74 56 61 72 69  ==0 );.  getVari
1c250 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20  nt32(&aKey1[1], 
1c260 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 0a 20  serial_type);.. 
1c270 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1c280 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  <12 ){.    res =
1c290 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20   pPKey2->r1;    
1c2a0 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79    /* (pKey1/nKey
1c2b0 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f  1) is a number o
1c2c0 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65  r a null */.  }e
1c2d0 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c  lse if( !(serial
1c2e0 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
1c2f0 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65   .    res = pPKe
1c300 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20  y2->r2;      /* 
1c310 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73  (pKey1/nKey1) is
1c320 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c   a blob */.  }el
1c330 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70  se{.    int nCmp
1c340 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a  ;.    int nStr;.
1c350 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20      int szHdr = 
1c360 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e  aKey1[0];..    n
1c370 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  Str = (serial_ty
1c380 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20  pe-12) / 2;.    
1c390 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74  if( (szHdr + nSt
1c3a0 72 29 20 3e 20 6e 4b 65 79 31 20 29 20 72 65 74  r) > nKey1 ) ret
1c3b0 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72  urn 0;    /* Cor
1c3c0 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 6e  ruption */.    n
1c3d0 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79  Cmp = MIN( pPKey
1c3e0 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53  2->aMem[0].n, nS
1c3f0 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  tr );.    res = 
1c400 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a  memcmp(&aKey1[sz
1c410 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d  Hdr], pPKey2->aM
1c420 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a  em[0].z, nCmp);.
1c430 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
1c440 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e  ){.      res = n
1c450 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d  Str - pPKey2->aM
1c460 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69  em[0].n;.      i
1c470 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
1c480 20 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d       if( pPKey2-
1c490 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20  >nField>1 ){.   
1c4a0 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c         res = sql
1c4b0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1c4c0 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65  mpare(nKey1, pKe
1c4d0 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a  y1, pPKey2, 1);.
1c4e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1c4f0 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70           res = p
1c500 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1c510 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1c520 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73     }else if( res
1c530 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  >0 ){.        re
1c540 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a  s = pPKey2->r2;.
1c550 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c560 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
1c570 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20  2->r1;.      }. 
1c580 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73     }else if( res
1c590 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  >0 ){.      res 
1c5a0 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
1c5b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1c5c0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
1c5d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
1c5e0 73 65 72 74 28 20 28 72 65 73 3d 3d 30 20 26 26  sert( (res==0 &&
1c5f0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1c600 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1c610 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3d 3d 30  Key1, pPKey2)==0
1c620 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 72 65 73  ).       || (res
1c630 3c 30 20 26 26 20 76 64 62 65 52 65 63 6f 72 64  <0 && vdbeRecord
1c640 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
1c650 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1c660 32 29 3c 30 29 0a 20 20 20 20 20 20 20 7c 7c 20  2)<0).       || 
1c670 28 72 65 73 3e 30 20 26 26 20 76 64 62 65 52 65  (res>0 && vdbeRe
1c680 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1c690 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1c6a0 50 4b 65 79 32 29 3e 30 29 0a 20 20 20 20 20 20  PKey2)>0).      
1c6b0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20   || CORRUPT_DB. 
1c6c0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73   );.  return res
1c6d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1c6e0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
1c6f0 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
1c700 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d  ordCompare() com
1c710 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e  patible function
1c720 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72  .** suitable for
1c730 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61   comparing seria
1c740 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f  lized records to
1c750 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65   the unpacked re
1c760 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61  cord passed.** a
1c770 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
1c780 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f  ent..*/.RecordCo
1c790 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56 64 62  mpare sqlite3Vdb
1c7a0 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70  eFindCompare(Unp
1c7b0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b  ackedRecord *p){
1c7c0 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f  .  /* varintReco
1c7d0 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61  rdCompareInt() a
1c7e0 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  nd varintRecordC
1c7f0 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 62  ompareString() b
1c800 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20  oth assume.  ** 
1c810 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66  that the size-of
1c820 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 74  -header varint t
1c830 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68  hat occurs at th
1c840 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20  e start of each 
1c850 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73  record.  ** fits
1c860 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74   in a single byt
1c870 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f  e (i.e. is 127 o
1c880 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52  r less). varintR
1c890 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
1c8a0 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75  ).  ** also assu
1c8b0 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20 73  mes that it is s
1c8c0 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20  afe to overread 
1c8d0 61 20 62 75 66 66 65 72 20 62 79 20 61 74 20 6c  a buffer by at l
1c8e0 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d  east the .  ** m
1c8f0 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20  aximum possible 
1c900 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a  legal header siz
1c910 65 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20  e plus 8 bytes. 
1c920 42 65 63 61 75 73 65 20 74 68 65 72 65 20 69 73  Because there is
1c930 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64  .  ** guaranteed
1c940 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20   to be at least 
1c950 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29  74 (but not 136)
1c960 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e   bytes of paddin
1c970 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68  g following each
1c980 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73  .  ** buffer pas
1c990 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63  sed to varintRec
1c9a0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
1c9b0 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f  this makes it co
1c9c0 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a  nvenient to.  **
1c9d0 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20   limit the size 
1c9e0 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 74 6f  of the header to
1c9f0 20 36 34 20 62 79 74 65 73 20 69 6e 20 63 61 73   64 bytes in cas
1ca00 65 73 20 77 68 65 72 65 20 74 68 65 20 66 69 72  es where the fir
1ca10 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73  st field.  ** is
1ca20 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a   an integer..  *
1ca30 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65  *.  ** The easie
1ca40 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63  st way to enforc
1ca50 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20  e this limit is 
1ca60 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79  to consider only
1ca70 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20   records with.  
1ca80 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20  ** 13 fields or 
1ca90 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66 69 72  less. If the fir
1caa0 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69  st field is an i
1cab0 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69  nteger, the maxi
1cac0 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68  mum legal.  ** h
1cad0 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 28 31  eader size is (1
1cae0 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74  2*5 + 1 + 1) byt
1caf0 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  es.  */.  if( (p
1cb00 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ->pKeyInfo->nFie
1cb10 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  ld + p->pKeyInfo
1cb20 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20 29  ->nXField)<=13 )
1cb30 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  {.    int flags 
1cb40 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61  = p->aMem[0].fla
1cb50 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  gs;.    if( p->p
1cb60 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1cb70 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  der[0] ){.      
1cb80 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20  p->r1 = 1;.     
1cb90 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20   p->r2 = -1;.   
1cba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
1cbb0 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  >r1 = -1;.      
1cbc0 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d  p->r2 = 1;.    }
1cbd0 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
1cbe0 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20  & MEM_Int) ){.  
1cbf0 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52      return vdbeR
1cc00 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b  ecordCompareInt;
1cc10 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1cc20 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
1cc30 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  _Real );.    tes
1cc40 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
1cc50 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74  EM_Null );.    t
1cc60 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
1cc70 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20   MEM_Blob );.   
1cc80 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d   if( (flags & (M
1cc90 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c  EM_Real|MEM_Null
1cca0 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26  |MEM_Blob))==0 &
1ccb0 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  & p->pKeyInfo->a
1ccc0 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  Coll[0]==0 ){.  
1ccd0 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
1cce0 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20  s & MEM_Str );. 
1ccf0 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
1cd00 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
1cd10 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ing;.    }.  }..
1cd20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1cd30 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1cd40 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  e;.}../*.** pCur
1cd50 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
1cd60 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65  dex entry create
1cd70 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
1cd80 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
1cd90 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f  ..** Read the ro
1cda0 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69  wid (the last fi
1cdb0 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72  eld in the recor
1cdc0 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  d) and store it 
1cdd0 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65  in *rowid..** Re
1cde0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
1cdf0 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
1ce00 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ks, or an error 
1ce10 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
1ce20 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74  **.** pCur might
1ce30 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   be pointing to 
1ce40 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72  text obtained fr
1ce50 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  om a corrupt dat
1ce60 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53  abase file..** S
1ce70 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61  o the content ca
1ce80 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
1ce90 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65    Do appropriate
1cea0 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63   checks on the c
1ceb0 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  ontent..*/.int s
1cec0 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
1ced0 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  id(sqlite3 *db, 
1cee0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1cef0 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69  i64 *rowid){.  i
1cf00 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
1cf10 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
1cf20 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
1cf30 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
1cf40 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
1cf50 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
1cf60 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
1cf70 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32  e rowid */.  u32
1cf80 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f   lenRowid;     /
1cf90 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f  * Size of the ro
1cfa0 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20  wid */.  Mem m, 
1cfb0 76 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  v;..  UNUSED_PAR
1cfc0 41 4d 45 54 45 52 28 64 62 29 3b 0a 0a 20 20 2f  AMETER(db);..  /
1cfd0 2a 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f  * Get the size o
1cfe0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
1cff0 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73  y.  Only indices
1d000 20 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73   entries of less
1d010 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20  .  ** than 2GiB 
1d020 61 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e  are support - an
1d030 79 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73  ything large mus
1d040 74 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f  t be database co
1d050 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41  rruption..  ** A
1d060 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  ny corruption is
1d070 20 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c   detected in sql
1d080 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
1d090 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c  llPtr(), though,
1d0a0 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f   so.  ** this co
1d0b0 64 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73  de can safely as
1d0c0 73 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b  sume that nCellK
1d0d0 65 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a  ey is 32-bits  .
1d0e0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
1d0f0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1d100 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
1d110 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20  ;.  VVA_ONLY(rc 
1d120 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  =) sqlite3BtreeK
1d130 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
1d140 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ellKey);.  asser
1d150 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
1d160 20 29 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20   );     /* pCur 
1d170 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20  is always valid 
1d180 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f  so KeySize canno
1d190 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65  t fail */.  asse
1d1a0 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20  rt( (nCellKey & 
1d1b0 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d  SQLITE_MAX_U32)=
1d1c0 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29  =(u64)nCellKey )
1d1d0 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20  ;..  /* Read in 
1d1e0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e  the complete con
1d1f0 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65  tent of the inde
1d200 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 65 6d  x entry */.  mem
1d210 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f  set(&m, 0, sizeo
1d220 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  f(m));.  rc = sq
1d230 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
1d240 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
1d250 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c  u32)nCellKey, 1,
1d260 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
1d270 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1d280 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69  .  }..  /* The i
1d290 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20  ndex entry must 
1d2a0 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61  begin with a hea
1d2b0 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76  der size */.  (v
1d2c0 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
1d2d0 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29  (u8*)m.z, szHdr)
1d2e0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a  ;.  testcase( sz
1d2f0 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  Hdr==3 );.  test
1d300 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e  case( szHdr==m.n
1d310 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
1d320 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69  ly(szHdr<3 || (i
1d330 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b  nt)szHdr>m.n) ){
1d340 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
1d350 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
1d360 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61    }..  /* The la
1d370 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  st field of the 
1d380 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20  index should be 
1d390 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65  an integer - the
1d3a0 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72   ROWID..  ** Ver
1d3b0 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73  ify that the las
1d3c0 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69  t entry really i
1d3d0 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f  s an integer. */
1d3e0 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69  .  (void)getVari
1d3f0 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73  nt32((u8*)&m.z[s
1d400 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77  zHdr-1], typeRow
1d410 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  id);.  testcase(
1d420 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b   typeRowid==1 );
1d430 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1d440 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74  eRowid==2 );.  t
1d450 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1d460 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63  id==3 );.  testc
1d470 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1d480 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  4 );.  testcase(
1d490 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b   typeRowid==5 );
1d4a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1d4b0 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74  eRowid==6 );.  t
1d4c0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1d4d0 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63  id==8 );.  testc
1d4e0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1d4f0 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  9 );.  if( unlik
1d500 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20  ely(typeRowid<1 
1d510 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c  || typeRowid>9 |
1d520 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20  | typeRowid==7) 
1d530 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
1d540 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
1d550 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64  ;.  }.  lenRowid
1d560 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
1d570 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65  rialTypeLen(type
1d580 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
1d590 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a  se( (u32)m.n==sz
1d5a0 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a  Hdr+lenRowid );.
1d5b0 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28    if( unlikely((
1d5c0 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65  u32)m.n<szHdr+le
1d5d0 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67  nRowid) ){.    g
1d5e0 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
1d5f0 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
1d600 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e   /* Fetch the in
1d610 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e  teger off the en
1d620 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72  d of the index r
1d630 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
1d640 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1d650 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65  (u8*)&m.z[m.n-le
1d660 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77  nRowid], typeRow
1d670 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69  id, &v);.  *rowi
1d680 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c  d = v.u.i;.  sql
1d690 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
1d6a0 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
1d6b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1d6c0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64  * Jump here if d
1d6d0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1d6e0 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61  on is detected a
1d6f0 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a  fter m has been.
1d700 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20    ** allocated. 
1d710 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65   Free the m obje
1d720 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ct and return SQ
1d730 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f  LITE_CORRUPT. */
1d740 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75  .idx_rowid_corru
1d750 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73  ption:.  testcas
1d760 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20  e( m.zMalloc!=0 
1d770 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1d780 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
1d790 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d7a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a  CORRUPT_BKPT;.}.
1d7b0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1d7c0 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e  he key of the in
1d7d0 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63  dex entry that c
1d7e0 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e  ursor pC is poin
1d7f0 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a  ting to against.
1d800 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e  ** the key strin
1d810 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20  g in pUnpacked. 
1d820 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65   Write into *pRe
1d830 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68  s a number.** th
1d840 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  at is negative, 
1d850 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
1d860 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20  e if pC is less 
1d870 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a  than, equal to,.
1d880 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  ** or greater th
1d890 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52  an pUnpacked.  R
1d8a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1d8b0 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a  on success..**.*
1d8c0 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65  * pUnpacked is e
1d8d0 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69  ither created wi
1d8e0 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72  thout a rowid or
1d8f0 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f   is truncated so
1d900 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74   that it.** omit
1d910 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  s the rowid at t
1d920 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77  he end.  The row
1d930 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
1d940 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
1d950 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61  .** is ignored a
1d960 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20  s well.  Hence, 
1d970 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  this routine onl
1d980 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70  y compares the p
1d990 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74  refixes .** of t
1d9a0 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f  he keys prior to
1d9b0 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
1d9c0 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65  , not the entire
1d9d0 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   key..*/.int sql
1d9e0 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f  ite3VdbeIdxKeyCo
1d9f0 6d 70 61 72 65 28 0a 20 20 56 64 62 65 43 75 72  mpare(.  VdbeCur
1da00 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20  sor *pC,        
1da10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1da20 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61   cursor to compa
1da30 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20  re against */.  
1da40 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65  const UnpackedRe
1da50 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c  cord *pUnpacked,
1da60 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72   /* Unpacked ver
1da70 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20  sion of key */. 
1da80 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20   int *res       
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daa0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
1dab0 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74  omparison result
1dac0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36   here */.){.  i6
1dad0 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
1dae0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75    int rc;.  BtCu
1daf0 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d  rsor *pCur = pC-
1db00 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20  >pCursor;.  Mem 
1db10 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  m;..  assert( sq
1db20 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1db30 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
1db40 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d  .  VVA_ONLY(rc =
1db50 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  ) sqlite3BtreeKe
1db60 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
1db70 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  llKey);.  assert
1db80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1db90 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73  );    /* pCur is
1dba0 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f   always valid so
1dbb0 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20   KeySize cannot 
1dbc0 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65  fail */.  /* nCe
1dbd0 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79  llKey will alway
1dbe0 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  s be between 0 a
1dbf0 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65  nd 0xffffffff be
1dc00 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
1dc10 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65  .  ** that btree
1dc20 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
1dc30 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  nd sqlite3GetVar
1dc40 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c  int32() are impl
1dc50 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28  emented */.  if(
1dc60 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20   nCellKey<=0 || 
1dc70 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66  nCellKey>0x7ffff
1dc80 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20  fff ){.    *res 
1dc90 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
1dca0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1dcb0 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  KPT;.  }.  memse
1dcc0 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&m, 0, sizeof(
1dcd0 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  m));.  rc = sqli
1dce0 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
1dcf0 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c  ree(pC->pCursor,
1dd00 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65   0, (u32)nCellKe
1dd10 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
1dd20 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
1dd30 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73  n rc;.  }.  *res
1dd40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
1dd50 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c  cordCompare(m.n,
1dd60 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 2c   m.z, pUnpacked,
1dd70 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
1dd80 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
1dd90 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1dda0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1ddb0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
1ddc0 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
1ddd0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62   returned by sub
1dde0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
1ddf0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  .** sqlite3_chan
1de00 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74  ges() on the dat
1de10 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62  abase handle 'db
1de20 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  '. .*/.void sqli
1de30 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
1de40 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
1de50 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61  nt nChange){.  a
1de60 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1de70 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
1de80 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43  tex) );.  db->nC
1de90 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b  hange = nChange;
1dea0 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  .  db->nTotalCha
1deb0 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
1dec0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66  }../*.** Set a f
1ded0 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20  lag in the vdbe 
1dee0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
1def0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65  ange counter whe
1df00 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65  n it is finalise
1df10 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a  d.** or reset..*
1df20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
1df30 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56  beCountChanges(V
1df40 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68  dbe *v){.  v->ch
1df50 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d  angeCntOn = 1;.}
1df60 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65  ../*.** Mark eve
1df70 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ry prepared stat
1df80 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64  ement associated
1df90 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
1dfa0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
1dfb0 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  s expired..**.**
1dfc0 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74   An expired stat
1dfd0 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74  ement means that
1dfe0 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f   recompilation o
1dff0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
1e000 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e  is.** recommend.
1e010 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70    Statements exp
1e020 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20  ire when things 
1e030 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65  happen that make
1e040 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61   their.** progra
1e050 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65  ms obsolete.  Re
1e060 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69  moving user-defi
1e070 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ned functions or
1e080 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
1e090 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e  quences, or chan
1e0a0 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a  ging an authoriz
1e0b0 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61  ation function a
1e0c0 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a  re the types of.
1e0d0 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d  ** things that m
1e0e0 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ake prepared sta
1e0f0 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65  tements obsolete
1e100 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e110 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
1e120 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65  tatements(sqlite
1e130 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
1e140 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d  p;.  for(p = db-
1e150 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e  >pVdbe; p; p=p->
1e160 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65  pNext){.    p->e
1e170 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  xpired = 1;.  }.
1e180 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1e190 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
1e1a0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1e1b0 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
1e1c0 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
1e1d0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
1e1e0 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a  urn v->db;.}../*
1e1f0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1e200 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
1e210 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75  e3_value structu
1e220 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  re containing th
1e230 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a  e value bound.**
1e240 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72 20   parameter iVar 
1e250 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c  of VM v. Except,
1e260 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
1e270 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65   an SQL NULL, re
1e280 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65  turn .** 0 inste
1e290 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73  ad. Unless it is
1e2a0 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66   NULL, apply aff
1e2b0 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f  inity aff (one o
1e2c0 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46  f the SQLITE_AFF
1e2d0 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29  _*.** constants)
1e2e0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65   to the value be
1e2f0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
1e300 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  t..**.** The ret
1e310 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74  urned value must
1e320 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
1e330 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71   caller using sq
1e340 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29  lite3ValueFree()
1e350 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c  ..*/.sqlite3_val
1e360 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  ue *sqlite3VdbeG
1e370 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64 62  etBoundValue(Vdb
1e380 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20  e *v, int iVar, 
1e390 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72  u8 aff){.  asser
1e3a0 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69  t( iVar>0 );.  i
1e3b0 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20  f( v ){.    Mem 
1e3c0 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72  *pMem = &v->aVar
1e3d0 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66  [iVar-1];.    if
1e3e0 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67  ( 0==(pMem->flag
1e3f0 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b  s & MEM_Null) ){
1e400 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
1e410 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c  alue *pRet = sql
1e420 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e  ite3ValueNew(v->
1e430 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  db);.      if( p
1e440 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Ret ){.        s
1e450 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70  qlite3VdbeMemCop
1e460 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70  y((Mem *)pRet, p
1e470 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
1e480 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41  lite3ValueApplyA
1e490 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66  ffinity(pRet, af
1e4a0 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  f, SQLITE_UTF8);
1e4b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1e4c0 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20  eturn pRet;.    
1e4d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1e4e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69  ;.}../*.** Confi
1e4f0 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c  gure SQL variabl
1e500 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62  e iVar so that b
1e510 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c  inding a new val
1e520 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73  ue to it signals
1e530 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  .** to sqlite3_r
1e540 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74  eoptimize() that
1e550 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68   re-preparing th
1e560 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20  e statement may 
1e570 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62  result.** in a b
1e580 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e  etter query plan
1e590 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e5a0 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
1e5b0 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
1e5c0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  r){.  assert( iV
1e5d0 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56  ar>0 );.  if( iV
1e5e0 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e  ar>32 ){.    v->
1e5f0 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66  expmask = 0xffff
1e600 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ffff;.  }else{. 
1e610 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d     v->expmask |=
1e620 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61   ((u32)1 << (iVa
1e630 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  r-1));.  }.}..#i
1e640 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e650 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
1e660 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72  *.** Transfer er
1e670 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
1e680 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33   from an sqlite3
1e690 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74  _vtab.zErrMsg (t
1e6a0 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  ext stored.** in
1e6b0 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
1e6c0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
1e6d0 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62  lloc) into a Vdb
1e6e0 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20  e.zErrMsg (text 
1e6f0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d  stored.** in mem
1e700 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
1e710 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
1e720 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  c)..*/.void sqli
1e730 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72  te3VtabImportErr
1e740 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c  msg(Vdbe *p, sql
1e750 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
1e760 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1e770 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73 71 6c 69   = p->db;.  sqli
1e780 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
1e790 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e  >zErrMsg);.  p->
1e7a0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
1e7b0 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 56  3DbStrDup(db, pV
1e7c0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
1e7d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56   sqlite3_free(pV
1e7e0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
1e7f0 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
1e800 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  = 0;.}.#endif /*
1e810 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1e820 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a           TUALTABLE */.