/ Hex Artifact Content
Login

Artifact 8d32b5a68670ccc6c64904924e6a0dddbc3a2fc5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
02e0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74   new virtual dat
02f0: 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f  abase engine..*/
0300: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64  .Vdbe *sqlite3Vd
0310: 62 65 43 72 65 61 74 65 28 50 61 72 73 65 20 2a  beCreate(Parse *
0320: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
0330: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
0340: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  >db;.  Vdbe *p;.
0350: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
0360: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
0370: 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20 20  zeof(Vdbe) );.  
0380: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
0390: 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  n 0;.  p->db = d
03a0: 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64  b;.  if( db->pVd
03b0: 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56  be ){.    db->pV
03c0: 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  dbe->pPrev = p;.
03d0: 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d    }.  p->pNext =
03e0: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70 2d   db->pVdbe;.  p-
03f0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64 62  >pPrev = 0;.  db
0400: 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 70  ->pVdbe = p;.  p
0410: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
0420: 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e  AGIC_INIT;.  p->
0430: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
0440: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0450: 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->aLabel==0 );.
0460: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
0470: 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a 20  ->nLabel==0 );. 
0480: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
0490: 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  >nOpAlloc==0 );.
04a0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
04b0: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
04c0: 65 20 53 51 4c 20 73 74 72 69 6e 67 20 66 6f 72  e SQL string for
04d0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
04e0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
04f0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c  qlite3VdbeSetSql
0500: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
0510: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
0520: 69 6e 74 20 69 73 50 72 65 70 61 72 65 56 32 29  int isPrepareV2)
0530: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 50 72  {.  assert( isPr
0540: 65 70 61 72 65 56 32 3d 3d 31 20 7c 7c 20 69 73  epareV2==1 || is
0550: 50 72 65 70 61 72 65 56 32 3d 3d 30 20 29 3b 0a  PrepareV2==0 );.
0560: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
0570: 75 72 6e 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  urn;.#if defined
0580: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
0590: 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
05a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
05b0: 4c 4c 4f 47 29 0a 20 20 69 66 28 20 21 69 73 50  LLOG).  if( !isP
05c0: 72 65 70 61 72 65 56 32 20 29 20 72 65 74 75 72  repareV2 ) retur
05d0: 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  n;.#endif.  asse
05e0: 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29  rt( p->zSql==0 )
05f0: 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71  ;.  p->zSql = sq
0600: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
0610: 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 70  ->db, z, n);.  p
0620: 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d 20  ->isPrepareV2 = 
0630: 28 75 38 29 69 73 50 72 65 70 61 72 65 56 32 3b  (u8)isPrepareV2;
0640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0650: 20 74 68 65 20 53 51 4c 20 61 73 73 6f 63 69 61   the SQL associa
0660: 74 65 64 20 77 69 74 68 20 61 20 70 72 65 70 61  ted with a prepa
0670: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f  red statement.*/
0680: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
0690: 69 74 65 33 5f 73 71 6c 28 73 71 6c 69 74 65 33  ite3_sql(sqlite3
06a0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  _stmt *pStmt){. 
06b0: 20 56 64 62 65 20 2a 70 20 3d 20 28 56 64 62 65   Vdbe *p = (Vdbe
06c0: 20 2a 29 70 53 74 6d 74 3b 0a 20 20 72 65 74 75   *)pStmt;.  retu
06d0: 72 6e 20 28 70 20 26 26 20 70 2d 3e 69 73 50 72  rn (p && p->isPr
06e0: 65 70 61 72 65 56 32 29 20 3f 20 70 2d 3e 7a 53  epareV2) ? p->zS
06f0: 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ql : 0;.}../*.**
0700: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0710: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
0720: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
0730: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0740: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
0750: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
0760: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
0770: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 74   char *zTmp;.  t
0780: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
0790: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
07a0: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
07b0: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
07c0: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
07d0: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
07e0: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
07f0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
0800: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
0810: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
0820: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
0830: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
0840: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
0850: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
0860: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61  p;.  pB->isPrepa
0870: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65  reV2 = pA->isPre
0880: 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pareV2;.}../*.**
0890: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65   Resize the Vdbe
08a0: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68  .aOp array so th
08b0: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73  at it is at leas
08c0: 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67 65 72 20  t one op larger 
08d0: 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77 61 73 2e  than .** it was.
08e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74  .**.** If an out
08f0: 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72  -of-memory error
0900: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
0910: 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79  sizing the array
0920: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  , return.** SQLI
0930: 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69  TE_NOMEM. In thi
0940: 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20  s case Vdbe.aOp 
0950: 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f  and Vdbe.nOpAllo
0960: 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63  c remain .** unc
0970: 68 61 6e 67 65 64 20 28 74 68 69 73 20 69 73 20  hanged (this is 
0980: 73 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 63 6f  so that any opco
0990: 64 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f  des already allo
09a0: 63 61 74 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a  cated can be .**
09b0: 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c   correctly deall
09c0: 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
09d0: 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  h the rest of th
09e0: 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74  e Vdbe)..*/.stat
09f0: 69 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 72 72  ic int growOpArr
0a00: 61 79 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 56  ay(Vdbe *v){.  V
0a10: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0a20: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0a30: 72 73 65 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20  rse;.  int nNew 
0a40: 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f  = (p->nOpAlloc ?
0a50: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a   p->nOpAlloc*2 :
0a60: 20 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65   (int)(1024/size
0a70: 6f 66 28 4f 70 29 29 29 3b 0a 20 20 70 4e 65 77  of(Op)));.  pNew
0a80: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
0a90: 6c 6f 63 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f  loc(p->db, v->aO
0aa0: 70 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f  p, nNew*sizeof(O
0ab0: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  p));.  if( pNew 
0ac0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  ){.    p->nOpAll
0ad0: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
0ae0: 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20  llocSize(p->db, 
0af0: 70 4e 65 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29  pNew)/sizeof(Op)
0b00: 3b 0a 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70  ;.    v->aOp = p
0b10: 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  New;.  }.  retur
0b20: 6e 20 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45  n (pNew ? SQLITE
0b30: 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d  _OK : SQLITE_NOM
0b40: 45 4d 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  EM);.}..#ifdef S
0b50: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
0b60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
0b70: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74  ust a convenient
0b80: 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
0b90: 62 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20  breakpoint that 
0ba0: 77 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74  will.** fire aft
0bb0: 65 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69  er each opcode i
0bc0: 73 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64  s inserted and d
0bd0: 69 73 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a  isplayed using.*
0be0: 2a 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61  * "PRAGMA vdbe_a
0bf0: 64 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a  ddoptrace=on"..*
0c00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
0c10: 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f  st_addop_breakpo
0c20: 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  int(void){.  sta
0c30: 74 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  tic int n = 0;. 
0c40: 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   n++;.}.#endif..
0c50: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
0c60: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74  instruction to t
0c70: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72  he list of instr
0c80: 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20  uctions current 
0c90: 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20  in the.** VDBE. 
0ca0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
0cb0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69  ess of the new i
0cc0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
0cd0: 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a  * Parameters:.**
0ce0: 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20  .**    p        
0cf0: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
0d00: 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a  o the VDBE.**.**
0d10: 20 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20      op          
0d20: 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66      The opcode f
0d30: 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  or this instruct
0d40: 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c  ion.**.**    p1,
0d50: 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65   p2, p3      Ope
0d60: 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20  rands.**.** Use 
0d70: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
0d80: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75  esolveLabel() fu
0d90: 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e  nction to fix an
0da0: 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20   address and.** 
0db0: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43  the sqlite3VdbeC
0dc0: 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69  hangeP4() functi
0dd0: 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  on to change the
0de0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
0df0: 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a  .** operand..*/.
0e00: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
0e10: 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69  ddOp3(Vdbe *p, i
0e20: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
0e30: 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a  nt p2, int p3){.
0e40: 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f    int i;.  VdbeO
0e50: 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70  p *pOp;..  i = p
0e60: 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->nOp;.  assert(
0e70: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
0e80: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
0e90: 61 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20  assert( op>0 && 
0ea0: 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28  op<0xff );.  if(
0eb0: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
0ec0: 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69  lloc<=i ){.    i
0ed0: 66 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  f( growOpArray(p
0ee0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
0ef0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
0f00: 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70   p->nOp++;.  pOp
0f10: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
0f20: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28   pOp->opcode = (
0f30: 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35  u8)op;.  pOp->p5
0f40: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20   = 0;.  pOp->p1 
0f50: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20  = p1;.  pOp->p2 
0f60: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  = p2;.  pOp->p3 
0f70: 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  = p3;.  pOp->p4.
0f80: 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34  p = 0;.  pOp->p4
0f90: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
0fa0: 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  D;.#ifdef SQLITE
0fb0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
0fc0: 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e  COMMENTS.  pOp->
0fd0: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65  zComment = 0;.#e
0fe0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
0ff0: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1000: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1010: 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
1020: 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  ace ){.    int j
1030: 6a 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65  j, kk;.    Parse
1040: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
1050: 61 72 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a  arse;.    for(jj
1060: 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49 54 45  =kk=0; jj<SQLITE
1070: 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b  _N_COLCACHE; jj+
1080: 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1090: 20 79 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20   yColCache *x = 
10a0: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
10b0: 65 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 69 66  e + jj;.      if
10c0: 28 20 78 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72  ( x->iLevel>pPar
10d0: 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20  se->iCacheLevel 
10e0: 7c 7c 20 78 2d 3e 69 52 65 67 3d 3d 30 20 29 20  || x->iReg==0 ) 
10f0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1100: 70 72 69 6e 74 66 28 22 20 72 5b 25 64 5d 3d 7b  printf(" r[%d]={
1110: 25 64 3a 25 64 7d 22 2c 20 78 2d 3e 69 52 65 67  %d:%d}", x->iReg
1120: 2c 20 78 2d 3e 69 54 61 62 6c 65 2c 20 78 2d 3e  , x->iTable, x->
1130: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
1140: 6b 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  kk++;.    }.    
1150: 69 66 28 20 6b 6b 20 29 20 70 72 69 6e 74 66 28  if( kk ) printf(
1160: 22 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  "\n");.    sqlit
1170: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
1180: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
1190: 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f  .    test_addop_
11a0: 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20  breakpoint();.  
11b0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
11c0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70  VDBE_PROFILE.  p
11d0: 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  Op->cycles = 0;.
11e0: 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a    pOp->cnt = 0;.
11f0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1200: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
1210: 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69  GE.  pOp->iSrcLi
1220: 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ne = 0;.#endif. 
1230: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74   return i;.}.int
1240: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1250: 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p0(Vdbe *p, int 
1260: 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  op){.  return sq
1270: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1280: 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b  p, op, 0, 0, 0);
1290: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
12a0: 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70  beAddOp1(Vdbe *p
12b0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
12c0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
12d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
12e0: 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a   op, p1, 0, 0);.
12f0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1300: 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c  eAddOp2(Vdbe *p,
1310: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
1320: 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75   int p2){.  retu
1330: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1340: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
1350: 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  p2, 0);.}.../*.*
1360: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
1370: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
1380: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
1390: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
13a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13b0: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
13c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
13d0: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
13e0: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
13f0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1400: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
1410: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
1420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1430: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1440: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1450: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1460: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1470: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1480: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1490: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
14a0: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
14b0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
14c0: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
14d0: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
14e0: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
14f0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1500: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1510: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1520: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1530: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1540: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
1550: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1560: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50  ./*.** Add an OP
1570: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63  _ParseSchema opc
1580: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
1590: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74  ne is broken out
15a0: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
15b0: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e  VdbeAddOp4() sin
15c0: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61  ce it needs to a
15d0: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72  lso needs to mar
15e0: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20  k all btrees.** 
15f0: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75  as having been u
1600: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  sed..**.** The z
1610: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73  Where string mus
1620: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
1630: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
1640: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54  3_malloc()..** T
1650: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1660: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
1670: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
1680: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64   memory..*/.void
1690: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
16a0: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62  arseSchemaOp(Vdb
16b0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63  e *p, int iDb, c
16c0: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20  har *zWhere){.  
16d0: 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64  int j;.  int add
16e0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
16f0: 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73  ddOp3(p, OP_Pars
1700: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
1710: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
1720: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1730: 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44  dr, zWhere, P4_D
1740: 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a  YNAMIC);.  for(j
1750: 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62  =0; j<p->db->nDb
1760: 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64  ; j++) sqlite3Vd
1770: 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a  beUsesBtree(p, j
1780: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
1790: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
17a0: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
17b0: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
17c0: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
17d0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
17e0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
17f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1800: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1810: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1830: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1840: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1850: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1860: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
1870: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
1880: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1890: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
18a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
18b0: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
18c0: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
18d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18e0: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
18f0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
1900: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1910: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1920: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1930: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1940: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1950: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
1960: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32  TR(p4), P4_INT32
1970: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
1980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1990: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
19a0: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
19b0: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
19c0: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
19d0: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
19e0: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
19f0: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
1a00: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
1a10: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
1a20: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
1a30: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
1a40: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
1a50: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
1a60: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
1a70: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
1a80: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
1a90: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
1aa0: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
1ab0: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
1ac0: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
1ad0: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
1ae0: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
1af0: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
1b00: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
1b10: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
1b20: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
1b30: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
1b40: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
1b50: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
1b60: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
1b70: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
1b80: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
1b90: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
1ba0: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
1bb0: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
1bc0: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
1bd0: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
1be0: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
1bf0: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
1c00: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
1c10: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29  keLabel(Vdbe *v)
1c20: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76  {.  Parse *p = v
1c30: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
1c40: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b  i = p->nLabel++;
1c50: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
1c60: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1c70: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69  INIT );.  if( (i
1c80: 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (i-1))==0 ){.
1c90: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1ca0: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1cb0: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1cc0: 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20  >aLabel, .      
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28   (i*2+1)*sizeof(
1d00: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
1d10: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61    }.  if( p->aLa
1d20: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
1d30: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
1d40: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b  }.  return -1-i;
1d50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
1d60: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62  e label "x" to b
1d70: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  e the address of
1d80: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
1d90: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69  ction to.** be i
1da0: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61  nserted.  The pa
1db0: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74  rameter "x" must
1dc0: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
1dd0: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
1de0: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
1df0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1e00: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
1e10: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1e20: 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  bel(Vdbe *v, int
1e30: 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20   x){.  Parse *p 
1e40: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
1e50: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
1e60: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
1e70: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1e80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   );.  assert( j<
1e90: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69  p->nLabel );.  i
1ea0: 66 28 20 41 4c 57 41 59 53 28 6a 3e 3d 30 29 20  f( ALWAYS(j>=0) 
1eb0: 26 26 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  && p->aLabel ){.
1ec0: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d      p->aLabel[j]
1ed0: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20   = v->nOp;.  }. 
1ee0: 20 70 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 76   p->iFixedOp = v
1ef0: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a  ->nOp - 1;.}../*
1f00: 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42  .** Mark the VDB
1f10: 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61  E as one that ca
1f20: 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e  n only be run on
1f30: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e time..*/.void 
1f40: 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e  sqlite3VdbeRunOn
1f50: 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b  lyOnce(Vdbe *p){
1f60: 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  .  p->runOnlyOnc
1f70: 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66  e = 1;.}..#ifdef
1f80: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a   SQLITE_DEBUG /*
1f90: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
1fa0: 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a  yAbort() logic *
1fb0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
1fc0: 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20  lowing type and 
1fd0: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65  function are use
1fe0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
1ff0: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
2000: 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61  .** in a Vdbe ma
2010: 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65  in program and e
2020: 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70  ach of the sub-p
2030: 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72  rograms (trigger
2040: 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e  s) it may .** in
2050: 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72  voke directly or
2060: 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20   indirectly. It 
2070: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61  should be used a
2080: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2090: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20     Op *pOp;.**  
20a0: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
20b0: 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65  r;.**.**   memse
20c0: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
20d0: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20  eof(sIter));.** 
20e0: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20    sIter.v = v;  
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69            // v i
2110: 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20  s of type Vdbe* 
2120: 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f  .**   while( (pO
2130: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
2140: 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20  sIter)) ){.**   
2150: 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e    // Do somethin
2160: 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20  g with pOp.**   
2170: 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62  }.**   sqlite3Db
2180: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65  Free(v->db, sIte
2190: 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f  r.apSub);.** .*/
21a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
21b0: 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f  VdbeOpIter VdbeO
21c0: 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64  pIter;.struct Vd
21d0: 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62  beOpIter {.  Vdb
21e0: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
21f0: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
2200: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
2210: 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f  gh the opcodes o
2220: 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  f */.  SubProgra
2230: 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20  m **apSub;      
2240: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
2250: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
2260: 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20  nt nSub;        
2270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2280: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
2290: 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74  n apSub */.  int
22a0: 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20   iAddr;         
22b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
22c0: 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72  ss of next instr
22d0: 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e  uction to return
22e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20   */.  int iSub; 
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f   /* 0 = main pro
2310: 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20  gram, 1 = first 
2320: 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e  sub-program etc.
2330: 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70   */.};.static Op
2340: 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62   *opIterNext(Vdb
2350: 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56  eOpIter *p){.  V
2360: 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20  dbe *v = p->v;. 
2370: 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20   Op *pRet = 0;. 
2380: 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20   Op *aOp;.  int 
2390: 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  nOp;..  if( p->i
23a0: 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a  Sub<=p->nSub ){.
23b0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62  .    if( p->iSub
23c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70  ==0 ){.      aOp
23d0: 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20   = v->aOp;.     
23e0: 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20   nOp = v->nOp;. 
23f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2400: 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  aOp = p->apSub[p
2410: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a  ->iSub-1]->aOp;.
2420: 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61        nOp = p->a
2430: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d  pSub[p->iSub-1]-
2440: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >nOp;.    }.    
2450: 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72  assert( p->iAddr
2460: 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65  <nOp );..    pRe
2470: 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64  t = &aOp[p->iAdd
2480: 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72  r];.    p->iAddr
2490: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ++;.    if( p->i
24a0: 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20  Addr==nOp ){.   
24b0: 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20     p->iSub++;.  
24c0: 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30      p->iAddr = 0
24d0: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  ;.    }.  .    i
24e0: 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d  f( pRet->p4type=
24f0: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
2500: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
2510: 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a  e = (p->nSub+1)*
2520: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
2530: 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  m*);.      int j
2540: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
2550: 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29   j<p->nSub; j++)
2560: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
2570: 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d  >apSub[j]==pRet-
2580: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
2590: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
25a0: 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53      if( j==p->nS
25b0: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ub ){.        p-
25c0: 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33  >apSub = sqlite3
25d0: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
25e0: 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c  v->db, p->apSub,
25f0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
2600: 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29   if( !p->apSub )
2610: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74  {.          pRet
2620: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
2630: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
2640: 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b  ->apSub[p->nSub+
2650: 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50  +] = pRet->p4.pP
2660: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
2670: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2680: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
2690: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  et;.}../*.** Che
26a0: 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ck if the progra
26b0: 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  m stored in the 
26c0: 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  VM associated wi
26d0: 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a  th pParse may.**
26e0: 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20   throw an ABORT 
26f0: 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69  exception (causi
2700: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
2710: 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65  , but not entire
2720: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2730: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
2740: 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69  k). This conditi
2750: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
2760: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f  e main program o
2770: 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f  r any.** sub-pro
2780: 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61  grams contains a
2790: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
27a0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ing:.**.**   *  
27b0: 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d  OP_Halt with P1=
27c0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
27d0: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
27e0: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  t..**   *  OP_Ha
27f0: 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31  ltIfNull with P1
2800: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
2810: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f  NT and P2=OE_Abo
2820: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44  rt..**   *  OP_D
2830: 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f  estroy.**   *  O
2840: 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a  P_VUpdate.**   *
2850: 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20    OP_VRename.** 
2860: 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65    *  OP_FkCounte
2870: 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d  r with P2==0 (im
2880: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
2890: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a  key constraint).
28a0: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b  **.** Then check
28b0: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
28c0: 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72  of Parse.mayAbor
28d0: 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a  t is true if an.
28e0: 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20  ** ABORT may be 
28f0: 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65  thrown, or false
2900: 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75   otherwise. Retu
2910: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  rn true if it do
2920: 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20  es.** match, or 
2930: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
2940: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2950: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
2960: 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74   used as.** part
2970: 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74   of an assert st
2980: 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63  atement in the c
2990: 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72  ompiler. Similar
29a0: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73   to:.**.**   ass
29b0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
29c0: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70  AssertMayAbort(p
29d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
29e0: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20  arse->mayAbort) 
29f0: 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  );.*/.int sqlite
2a00: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
2a10: 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ort(Vdbe *v, int
2a20: 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e   mayAbort){.  in
2a30: 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a  t hasAbort = 0;.
2a40: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62    Op *pOp;.  Vdb
2a50: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20  eOpIter sIter;. 
2a60: 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20   memset(&sIter, 
2a70: 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29  0, sizeof(sIter)
2a80: 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76  );.  sIter.v = v
2a90: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70  ;..  while( (pOp
2aa0: 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73   = opIterNext(&s
2ab0: 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20  Iter))!=0 ){.   
2ac0: 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f   int opcode = pO
2ad0: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69  p->opcode;.    i
2ae0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65  f( opcode==OP_De
2af0: 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d  stroy || opcode=
2b00: 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f  =OP_VUpdate || o
2b10: 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d  pcode==OP_VRenam
2b20: 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e .#ifndef SQLIT
2b30: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
2b40: 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f  EY.     || (opco
2b50: 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  de==OP_FkCounter
2b60: 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26   && pOp->p1==0 &
2b70: 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23  & pOp->p2==1) .#
2b80: 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28  endif.     || ((
2b90: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20  opcode==OP_Halt 
2ba0: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61  || opcode==OP_Ha
2bb0: 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20  ltIfNull) .     
2bc0: 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30 78   && ((pOp->p1&0x
2bd0: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
2be0: 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70  TRAINT && pOp->p
2bf0: 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20  2==OE_Abort)).  
2c00: 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62    ){.      hasAb
2c10: 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  ort = 1;.      b
2c20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2c30: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2c40: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
2c50: 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  ub);..  /* Retur
2c60: 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 62 6f  n true if hasAbo
2c70: 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72  rt==mayAbort. Or
2c80: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
2c90: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
2ca0: 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61   ** If malloc fa
2cb0: 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77  iled, then the w
2cc0: 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76  hile() loop abov
2cd0: 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69  e may not have i
2ce0: 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72  terated.  ** thr
2cf0: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
2d00: 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61   and hasAbort ma
2d10: 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65  y be set incorre
2d20: 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a  ctly. Return.  *
2d30: 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 20  * true for this 
2d40: 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20  case to prevent 
2d50: 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e 20  the assert() in 
2d60: 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d  the callers fram
2d70: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c  e.  ** from fail
2d80: 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  ing.  */.  retur
2d90: 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  n ( v->db->mallo
2da0: 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62  cFailed || hasAb
2db0: 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 29 3b  ort==mayAbort );
2dc0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2dd0: 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20  ITE_DEBUG - the 
2de0: 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
2df0: 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e  Abort() function
2e00: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20   */../*.** Loop 
2e10: 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67  through the prog
2e20: 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ram looking for 
2e30: 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61  P2 values that a
2e40: 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6f  re negative.** o
2e50: 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  n jump instructi
2e60: 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68 20  ons.  Each such 
2e70: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
2e80: 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a 2a  .  Resolve the.*
2e90: 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69  * label by setti
2ea0: 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  ng the P2 value 
2eb0: 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 6e  to its correct n
2ec0: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a  on-zero value..*
2ed0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2ee0: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
2ef0: 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64   after all opcod
2f00: 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73  es have been ins
2f10: 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72  erted..**.** Var
2f20: 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41  iable *pMaxFuncA
2f30: 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  rgs is set to th
2f40: 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20  e maximum value 
2f50: 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d 65  of any P2 argume
2f60: 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f  nt .** to an OP_
2f70: 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67 67  Function, OP_Agg
2f80: 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c 74  Step or OP_VFilt
2f90: 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73 20  er opcode. This 
2fa0: 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 73  is used by .** s
2fb0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
2fc0: 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74 68  ady() to size th
2fd0: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
2fe0: 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rray..**.** The 
2ff0: 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c 64  Op.opflags field
3000: 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20 6f   is set on all o
3010: 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  pcodes..*/.stati
3020: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32  c void resolveP2
3030: 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20  Values(Vdbe *p, 
3040: 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  int *pMaxFuncArg
3050: 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  s){.  int i;.  i
3060: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70  nt nMaxArgs = *p
3070: 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f  MaxFuncArgs;.  O
3080: 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20  p *pOp;.  Parse 
3090: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
30a0: 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  rse;.  int *aLab
30b0: 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61  el = pParse->aLa
30c0: 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e  bel;.  p->readOn
30d0: 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73  ly = 1;.  p->bIs
30e0: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66 6f  Reader = 0;.  fo
30f0: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
3100: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
3110: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
3120: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
3130: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 2f  ->opcode;..    /
3140: 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20  * NOTE: Be sure 
3150: 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f  to update mkopco
3160: 64 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64 64  deh.awk when add
3170: 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a  ing or removing.
3180: 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f      ** cases fro
3190: 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a  m this switch! *
31a0: 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  /.    switch( op
31b0: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61  code ){.      ca
31c0: 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 3a 0a  se OP_Function:.
31d0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 67        case OP_Ag
31e0: 67 53 74 65 70 3a 20 7b 0a 20 20 20 20 20 20 20  gStep: {.       
31f0: 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61   if( pOp->p5>nMa
3200: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
3210: 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 20   = pOp->p5;.    
3220: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3230: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50   }.      case OP
3240: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a  _Transaction: {.
3250: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
3260: 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64  >p2!=0 ) p->read
3270: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  Only = 0;.      
3280: 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a    /* fall thru *
3290: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
32a0: 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  case OP_AutoComm
32b0: 69 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  it:.      case O
32c0: 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20  P_Savepoint: {. 
32d0: 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61         p->bIsRea
32e0: 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  der = 1;.       
32f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3300: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3310: 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 63 61  MIT_WAL.      ca
3320: 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74  se OP_Checkpoint
3330: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  :.#endif.      c
3340: 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a 20  ase OP_Vacuum:. 
3350: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75       case OP_Jou
3360: 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20  rnalMode: {.    
3370: 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20      p->readOnly 
3380: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
3390: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20  bIsReader = 1;. 
33a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
33b0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
33c0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
33d0: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 63 61 73  LTABLE.      cas
33e0: 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a  e OP_VUpdate: {.
33f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
3400: 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p2>nMaxArgs ) n
3410: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
3420: 32 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  2;.        break
3430: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3440: 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a  case OP_VFilter:
3450: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e   {.        int n
3460: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
3470: 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20  ( p->nOp - i >= 
3480: 33 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  3 );.        ass
3490: 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
34a0: 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20  ode==OP_Integer 
34b0: 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 70  );.        n = p
34c0: 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20  Op[-1].p1;.     
34d0: 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67     if( n>nMaxArg
34e0: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e  s ) nMaxArgs = n
34f0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3500: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
3510: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65        case OP_Ne
3520: 78 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  xt:.      case O
3530: 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 0a 20 20  P_NextIfOpen:.  
3540: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74      case OP_Sort
3550: 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20  erNext: {.      
3560: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e    pOp->p4.xAdvan
3570: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ce = sqlite3Btre
3580: 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70  eNext;.        p
3590: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
35a0: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
35b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
35c0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72        case OP_Pr
35d0: 65 76 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ev:.      case O
35e0: 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 7b 0a  P_PrevIfOpen: {.
35f0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
3600: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
3610: 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b  e3BtreePrevious;
3620: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  .        pOp->p4
3630: 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43  type = P4_ADVANC
3640: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
3650: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3660: 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67  .    pOp->opflag
3670: 73 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  s = sqlite3Opcod
3680: 65 50 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65  eProperty[opcode
3690: 5d 3b 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d  ];.    if( (pOp-
36a0: 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47  >opflags & OPFLG
36b0: 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f 70  _JUMP)!=0 && pOp
36c0: 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20  ->p2<0 ){.      
36d0: 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e  assert( -1-pOp->
36e0: 70 32 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65  p2<pParse->nLabe
36f0: 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  l );.      pOp->
3700: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70  p2 = aLabel[-1-p
3710: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20  Op->p2];.    }. 
3720: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
3730: 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65  ee(p->db, pParse
3740: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61  ->aLabel);.  pPa
3750: 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b  rse->aLabel = 0;
3760: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65  .  pParse->nLabe
3770: 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75  l = 0;.  *pMaxFu
3780: 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67  ncArgs = nMaxArg
3790: 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  s;.  assert( p->
37a0: 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20  bIsReader!=0 || 
37b0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20  p->btreeMask==0 
37c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
37d0: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
37e0: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
37f0: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73  uction to be ins
3800: 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erted..*/.int sq
3810: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
3820: 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  Addr(Vdbe *p){. 
3830: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
3840: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
3850: 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  IT );.  return p
3860: 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ->nOp;.}../*.** 
3870: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
3880: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
3890: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
38a0: 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74  opcodes associat
38b0: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56  ed with.** the V
38c0: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
38d0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
38e0: 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  . It is the call
38f0: 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
3900: 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65  ty.** to arrange
3910: 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65   for the returne
3920: 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76  d array to be ev
3930: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75  entually freed u
3940: 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62  sing the .** vdb
3950: 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66  eFreeOpArray() f
3960: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42  unction..**.** B
3970: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
3980: 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f   *pnOp is set to
3990: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
39a0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65  ntries in the re
39b0: 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e  turned.** array.
39c0: 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67   Also, *pnMaxArg
39d0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c   is set to the l
39e0: 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72  arger of its cur
39f0: 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a  rent value and .
3a00: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
3a10: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
3a20: 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72  Vdbe.apArg[] arr
3a30: 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  ay required to e
3a40: 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72  xecute the .** r
3a50: 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e  eturned program.
3a60: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
3a70: 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72  te3VdbeTakeOpArr
3a80: 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ay(Vdbe *p, int 
3a90: 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61  *pnOp, int *pnMa
3aa0: 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20  xArg){.  VdbeOp 
3ab0: 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20  *aOp = p->aOp;. 
3ac0: 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20   assert( aOp && 
3ad0: 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  !p->db->mallocFa
3ae0: 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  iled );..  /* Ch
3af0: 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33  eck that sqlite3
3b00: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20  VdbeUsesBtree() 
3b10: 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f  was not called o
3b20: 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61  n this VM */.  a
3b30: 73 73 65 72 74 28 20 70 2d 3e 62 74 72 65 65 4d  ssert( p->btreeM
3b40: 61 73 6b 3d 3d 30 20 29 3b 0a 0a 20 20 72 65 73  ask==0 );..  res
3b50: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
3b60: 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e  pnMaxArg);.  *pn
3b70: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70  Op = p->nOp;.  p
3b80: 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74  ->aOp = 0;.  ret
3b90: 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aOp;.}../*.*
3ba0: 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69  * Add a whole li
3bb0: 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  st of operations
3bc0: 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
3bd0: 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e  n stack.  Return
3be0: 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20   the.** address 
3bf0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  of the first ope
3c00: 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f  ration added..*/
3c10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
3c20: 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a  AddOpList(Vdbe *
3c30: 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65  p, int nOp, Vdbe
3c40: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f  OpList const *aO
3c50: 70 2c 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 29 7b  p, int iLineno){
3c60: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61  .  int addr;.  a
3c70: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
3c80: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
3c90: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
3ca0: 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72   + nOp > p->pPar
3cb0: 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20  se->nOpAlloc && 
3cc0: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29  growOpArray(p) )
3cd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
3ce0: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e    }.  addr = p->
3cf0: 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  nOp;.  if( ALWAY
3d00: 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20 20  S(nOp>0) ){.    
3d10: 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f  int i;.    VdbeO
3d20: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e  pList const *pIn
3d30: 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28   = aOp;.    for(
3d40: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c  i=0; i<nOp; i++,
3d50: 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69   pIn++){.      i
3d60: 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b  nt p2 = pIn->p2;
3d70: 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70  .      VdbeOp *p
3d80: 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b  Out = &p->aOp[i+
3d90: 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75  addr];.      pOu
3da0: 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d  t->opcode = pIn-
3db0: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70  >opcode;.      p
3dc0: 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70  Out->p1 = pIn->p
3dd0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c  1;.      if( p2<
3de0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
3df0: 65 72 74 28 20 73 71 6c 69 74 65 33 4f 70 63 6f  ert( sqlite3Opco
3e00: 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d  deProperty[pOut-
3e10: 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47  >opcode] & OPFLG
3e20: 5f 4a 55 4d 50 20 29 3b 0a 20 20 20 20 20 20 20  _JUMP );.       
3e30: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72   pOut->p2 = addr
3e40: 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20   + ADDR(p2);.   
3e50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3e60: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b    pOut->p2 = p2;
3e70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
3e80: 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70  Out->p3 = pIn->p
3e90: 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  3;.      pOut->p
3ea0: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
3eb0: 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  ED;.      pOut->
3ec0: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  p4.p = 0;.      
3ed0: 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69  pOut->p5 = 0;.#i
3ee0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3ef0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
3f00: 4e 54 53 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  NTS.      pOut->
3f10: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65  zComment = 0;.#e
3f20: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
3f30: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
3f40: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 69 53 72  .      pOut->iSr
3f50: 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b  cLine = iLineno+
3f60: 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 28  i;.#else.      (
3f70: 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65  void)iLineno;.#e
3f80: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
3f90: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69  TE_DEBUG.      i
3fa0: 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  f( p->db->flags 
3fb0: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
3fc0: 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  opTrace ){.     
3fd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
3fe0: 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c  intOp(0, i+addr,
3ff0: 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d   &p->aOp[i+addr]
4000: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
4010: 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  f.    }.    p->n
4020: 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20  Op += nOp;.  }. 
4030: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
4040: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
4050: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
4060: 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  1 operand for a 
4070: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
4080: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
4090: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
40a0: 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f  when a large pro
40b0: 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66  gram is loaded f
40c0: 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20  rom a.** static 
40d0: 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69  array using sqli
40e0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
40f0: 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   but we want to 
4100: 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69  make a.** few mi
4110: 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74  nor changes to t
4120: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  he program..*/.v
4130: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
4140: 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c  hangeP1(Vdbe *p,
4150: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
4160: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
4170: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75  !=0 );.  if( ((u
4180: 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20  32)p->nOp)>addr 
4190: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
41a0: 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20  dr].p1 = val;.  
41b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
41c0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
41d0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f  he P2 operand fo
41e0: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
41f0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
4200: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4210: 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ful for setting 
4220: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
4230: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
4240: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
4250: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
4260: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
4270: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
4280: 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f   if( ((u32)p->nO
4290: 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70  p)>addr ){.    p
42a0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d  ->aOp[addr].p2 =
42b0: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
42c0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
42d0: 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70  lue of the P3 op
42e0: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
42f0: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
4300: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4310: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64  3VdbeChangeP3(Vd
4320: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
4330: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73   int val){.  ass
4340: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69  ert( p!=0 );.  i
4350: 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29  f( ((u32)p->nOp)
4360: 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e  >addr ){.    p->
4370: 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76  aOp[addr].p3 = v
4380: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
4390: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
43a0: 65 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72  e of the P5 oper
43b0: 61 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  and for the most
43c0: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64   recently.** add
43d0: 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  ed operation..*/
43e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
43f0: 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a  eChangeP5(Vdbe *
4400: 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73  p, u8 val){.  as
4410: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
4420: 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20  if( p->aOp ){.  
4430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
4440: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70  >0 );.    p->aOp
4450: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20  [p->nOp-1].p5 = 
4460: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
4470: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20  * Change the P2 
4480: 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72  operand of instr
4490: 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74  uction addr so t
44a0: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
44b0: 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20  .** the address 
44c0: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
44d0: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f  ruction to be co
44e0: 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ded..*/.void sql
44f0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4500: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
4510: 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr){.  sqlite3Vd
4520: 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64  beChangeP2(p, ad
4530: 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 70  dr, p->nOp);.  p
4540: 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65 64  ->pParse->iFixed
4550: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  Op = p->nOp - 1;
4560: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
4570: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
4580: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
4590: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
45a0: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
45b0: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
45c0: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
45d0: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
45e0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
45f0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
4600: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
4610: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
4620: 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20  f( ALWAYS(pDef) 
4630: 26 26 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  && (pDef->funcFl
4640: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
4650: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20  C_EPHEM)!=0 ){. 
4660: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4670: 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a  (db, pDef);.  }.
4680: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  }..static void v
4690: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
46a0: 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20  qlite3 *, Op *, 
46b0: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  int);../*.** Del
46c0: 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69  ete a P4 value i
46d0: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
46e0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
46f0: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
4700: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
4710: 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20   *p4){.  if( p4 
4720: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
4730: 62 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28  b );.    switch(
4740: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20   p4type ){.     
4750: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20   case P4_REAL:. 
4760: 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54       case P4_INT
4770: 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  64:.      case P
4780: 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20  4_DYNAMIC:.     
4790: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
47a0: 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  Y: {.        sql
47b0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
47c0: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
47d0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
47e0: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
47f0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
4800: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
4810: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79  ==0 ) sqlite3Key
4820: 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e  InfoUnref((KeyIn
4830: 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  fo*)p4);.       
4840: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4850: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50        case P4_MP
4860: 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 20  RINTF: {.       
4870: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4880: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
4890: 65 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20 20  e3_free(p4);.   
48a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
48b0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
48c0: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
48d0: 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72       freeEphemer
48e0: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28  alFunction(db, (
48f0: 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20  FuncDef*)p4);.  
4900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4910: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
4920: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
4930: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
4940: 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20  sFreed==0 ){.   
4950: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
4960: 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33  lueFree((sqlite3
4970: 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20  _value*)p4);.   
4980: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4990: 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28        Mem *p = (
49a0: 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  Mem*)p4;.       
49b0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
49c0: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
49d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
49e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
49f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4a00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4a10: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
4a20: 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20  _VTAB : {.      
4a30: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
4a40: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
4a50: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56  te3VtabUnlock((V
4a60: 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20  Table *)p4);.   
4a70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4a80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
4a90: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
4aa0: 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
4ab0: 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20  for aOp and any 
4ac0: 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61  p4 values alloca
4ad0: 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f  ted for the.** o
4ae0: 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64  pcodes contained
4af0: 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20   within. If aOp 
4b00: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69  is not NULL it i
4b10: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
4b20: 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74  tain .** nOp ent
4b30: 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ries. .*/.static
4b40: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
4b50: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
4b60: 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20  b, Op *aOp, int 
4b70: 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20  nOp){.  if( aOp 
4b80: 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  ){.    Op *pOp;.
4b90: 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b      for(pOp=aOp;
4ba0: 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20   pOp<&aOp[nOp]; 
4bb0: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72  pOp++){.      fr
4bc0: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
4bd0: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
4be0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
4bf0: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
4c00: 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71  OMMENTS.      sq
4c10: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4c20: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
4c30: 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20  #endif     .    
4c40: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  }.  }.  sqlite3D
4c50: 62 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a  bFree(db, aOp);.
4c60: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68  }../*.** Link th
4c70: 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a  e SubProgram obj
4c80: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
4c90: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
4ca0: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  t into the linke
4cb0: 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62  d.** list at Vdb
4cc0: 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54  e.pSubProgram. T
4cd0: 68 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64  his list is used
4ce0: 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73   to delete all s
4cf0: 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62  ub-program.** ob
4d00: 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56  jects when the V
4d10: 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72  M is no longer r
4d20: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64  equired..*/.void
4d30: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b   sqlite3VdbeLink
4d40: 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20  SubProgram(Vdbe 
4d50: 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72  *pVdbe, SubProgr
4d60: 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65  am *p){.  p->pNe
4d70: 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f  xt = pVdbe->pPro
4d80: 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70  gram;.  pVdbe->p
4d90: 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a  Program = p;.}..
4da0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
4db0: 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20   opcode at addr 
4dc0: 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a  into OP_Noop.*/.
4dd0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4de0: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62  ChangeToNoop(Vdb
4df0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
4e00: 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b  .  if( p->aOp ){
4e10: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
4e20: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
4e30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
4e40: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66  b = p->db;.    f
4e50: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
4e60: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
4e70: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f  );.    memset(pO
4e80: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70  p, 0, sizeof(pOp
4e90: 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  [0]));.    pOp->
4ea0: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
4eb0: 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 3d 3d  ;.    if( addr==
4ec0: 70 2d 3e 6e 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f  p->nOp-1 ) p->nO
4ed0: 70 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p--;.  }.}../*.*
4ee0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6c 61 73  * Remove the las
4ef0: 74 20 6f 70 63 6f 64 65 20 69 6e 73 65 72 74 65  t opcode inserte
4f00: 64 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  d.*/.int sqlite3
4f10: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
4f20: 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75  pcode(Vdbe *p, u
4f30: 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d  8 op){.  if( (p-
4f40: 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72  >nOp-1)>(p->pPar
4f50: 73 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26  se->iFixedOp) &&
4f60: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
4f70: 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a  ].opcode==op ){.
4f80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
4f90: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70  hangeToNoop(p, p
4fa0: 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 20 20 72 65  ->nOp-1);.    re
4fb0: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
4fc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4fd0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
4fe0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
4ff0: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66  the P4 operand f
5000: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
5010: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
5020: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
5030: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
5040: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
5050: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
5060: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
5070: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5080: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
5090: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
50a0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
50b0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
50c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74  .**.** If n>=0 t
50d0: 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61  hen the P4 opera
50e0: 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d  nd is dynamic, m
50f0: 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f  eaning that a co
5100: 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72  py of.** the str
5110: 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f  ing is made into
5120: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
5130: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
5140: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c  lloc()..** A val
5150: 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73  ue of n==0 means
5160: 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a   copy bytes of z
5170: 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63  P4 up to and inc
5180: 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  luding the.** fi
5190: 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20  rst null byte.  
51a0: 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79  If n>0 then copy
51b0: 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50   n+1 bytes of zP
51c0: 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20  4..** .** Other 
51d0: 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f  values of n (P4_
51e0: 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53  STATIC, P4_COLLS
51f0: 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74  EQ etc.) indicat
5200: 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74  e that zP4 point
5210: 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67  s.** to a string
5220: 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68   or structure th
5230: 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  at is guaranteed
5240: 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68   to exist for th
5250: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a  e lifetime of.**
5260: 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68   the Vdbe. In th
5270: 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e  ese cases we can
5280: 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70   just copy the p
5290: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ointer..**.** If
52a0: 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61   addr<0 then cha
52b0: 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  nge P4 on the mo
52c0: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
52d0: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
52e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
52f0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64  3VdbeChangeP4(Vd
5300: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
5310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
5320: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
5330: 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pOp;.  sqlite3 *
5340: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  db;.  assert( p!
5350: 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  =0 );.  db = p->
5360: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  db;.  assert( p-
5370: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
5380: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
5390: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62   p->aOp==0 || db
53a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
53b0: 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f  {.    if( n!=P4_
53c0: 56 54 41 42 20 29 7b 0a 20 20 20 20 20 20 66 72  VTAB ){.      fr
53d0: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
53e0: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
53f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
5400: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
5410: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
5420: 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d   assert( addr<p-
5430: 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64  >nOp );.  if( ad
5440: 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72  dr<0 ){.    addr
5450: 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20   = p->nOp - 1;. 
5460: 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61   }.  pOp = &p->a
5470: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73 65  Op[addr];.  asse
5480: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
5490: 3d 50 34 5f 4e 4f 54 55 53 45 44 0a 20 20 20 20  =P4_NOTUSED.    
54a0: 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70     || pOp->p4typ
54b0: 65 3d 3d 50 34 5f 49 4e 54 33 32 0a 20 20 20 20  e==P4_INT32.    
54c0: 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70     || pOp->p4typ
54d0: 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b  e==P4_KEYINFO );
54e0: 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f  .  freeP4(db, pO
54f0: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
5500: 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34  p4.p);.  pOp->p4
5510: 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d  .p = 0;.  if( n=
5520: 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20  =P4_INT32 ){.   
5530: 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63   /* Note: this c
5540: 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63  ast is safe, bec
5550: 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20  ause the origin 
5560: 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61  data point was a
5570: 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  n int.    ** tha
5580: 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20  t was cast to a 
5590: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20  (const char *). 
55a0: 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69  */.    pOp->p4.i
55b0: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
55c0: 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70  _INT(zP4);.    p
55d0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
55e0: 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69  INT32;.  }else i
55f0: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
5600: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
5610: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5620: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
5630: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
5640: 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70  KEYINFO ){.    p
5650: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
5660: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
5670: 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49  p4type = P4_KEYI
5680: 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NFO;.  }else if(
5690: 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20   n==P4_VTAB ){. 
56a0: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
56b0: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
56c0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
56d0: 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65  VTAB;.    sqlite
56e0: 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c  3VtabLock((VTabl
56f0: 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73  e *)zP4);.    as
5700: 73 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a  sert( ((VTable *
5710: 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62  )zP4)->db==p->db
5720: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
5730: 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  n<0 ){.    pOp->
5740: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
5750: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
5760: 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  pe = (signed cha
5770: 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r)n;.  }else{.  
5780: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d    if( n==0 ) n =
5790: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
57a0: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
57b0: 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62  p4.z = sqlite3Db
57c0: 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a  StrNDup(p->db, z
57d0: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d  P4, n);.    pOp-
57e0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
57f0: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  AMIC;.  }.}../*.
5800: 2a 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e  ** Set the P4 on
5810: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
5820: 6c 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20  ly added opcode 
5830: 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66  to the KeyInfo f
5840: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  or the.** index 
5850: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
5860: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
5870: 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyInfo(Parse *pP
5880: 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
5890: 78 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  x){.  Vdbe *v = 
58a0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
58b0: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
58c0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21  .  assert( pIdx!
58d0: 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
58e0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
58f0: 31 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  1, (char*)sqlite
5900: 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
5910: 70 50 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20  pParse, pIdx),. 
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5930: 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
5940: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
5950: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
5960: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a  N_COMMENTS./*.**
5970: 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d   Change the comm
5980: 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  ent on the most 
5990: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
59a0: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a  nstruction.  Or.
59b0: 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f  ** insert a No-o
59c0: 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f  p and add the co
59d0: 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65  mment to that ne
59e0: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  w instruction.  
59f0: 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68  This.** makes th
5a00: 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f  e code easier to
5a10: 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62   read during deb
5a20: 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66  ugging.  None of
5a30: 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a   this happens.**
5a40: 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e   in a production
5a50: 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   build..*/.stati
5a60: 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d  c void vdbeVComm
5a70: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
5a80: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
5a90: 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20  , va_list ap){. 
5aa0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
5ab0: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29  0 || p->aOp==0 )
5ac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
5ad0: 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b  Op==0 || p->aOp[
5ae0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
5af0: 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e  nt==0 || p->db->
5b00: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
5b10: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a    if( p->nOp ){.
5b20: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
5b30: 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Op );.    sqlite
5b40: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
5b50: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
5b60: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70  zComment);.    p
5b70: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
5b80: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74  zComment = sqlit
5b90: 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62  e3VMPrintf(p->db
5ba0: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
5bb0: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
5bc0: 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64  e3VdbeComment(Vd
5bd0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
5be0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
5bf0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
5c00: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76    if( p ){.    v
5c10: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
5c20: 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43  mat);.    vdbeVC
5c30: 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61  omment(p, zForma
5c40: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
5c50: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  nd(ap);.  }.}.vo
5c60: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f  id sqlite3VdbeNo
5c70: 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  opComment(Vdbe *
5c80: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
5c90: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
5ca0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
5cb0: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
5cc0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20  e3VdbeAddOp0(p, 
5cd0: 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61  OP_Noop);.    va
5ce0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
5cf0: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
5d00: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
5d10: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
5d20: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  d(ap);.  }.}.#en
5d30: 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a  dif  /* NDEBUG *
5d40: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
5d50: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f  _VDBE_COVERAGE./
5d60: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
5d70: 75 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69  ue if the iSrcLi
5d80: 6e 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65  ne field for the
5d90: 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65   previously code
5da0: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  d instruction..*
5db0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5dc0: 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28  beSetLineNumber(
5dd0: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69  Vdbe *v, int iLi
5de0: 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  ne){.  sqlite3Vd
5df0: 62 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69  beGetOp(v,-1)->i
5e00: 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b  SrcLine = iLine;
5e10: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
5e20: 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  ITE_VDBE_COVERAG
5e30: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  E */../*.** Retu
5e40: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
5e50: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
5e60: 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65  s.  If the addre
5e70: 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a  ss is -1, then.*
5e80: 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * return the mos
5e90: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
5ea0: 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  ted opcode..**.*
5eb0: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
5ec0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
5ed0: 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f  as occurred prio
5ee0: 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67  r to the calling
5ef0: 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74   of this.** rout
5f00: 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e  ine, then a poin
5f10: 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56  ter to a dummy V
5f20: 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65  dbeOp will be re
5f30: 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70  turned.  That op
5f40: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61  code.** is reada
5f50: 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74  ble but not writ
5f60: 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20  able, though it 
5f70: 69 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69  is cast to a wri
5f80: 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20  table value..** 
5f90: 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20  The return of a 
5fa0: 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c  dummy opcode all
5fb0: 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ows the call to 
5fc0: 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f  continue functio
5fd0: 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 20  ning.** after a 
5fe0: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
5ff0: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
6000: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
6010: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
6020: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6030: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
6040: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
6050: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
6060: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
6070: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
6080: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
6090: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
60a0: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
60b0: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
60c0: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f  ith Valgrind..*/
60d0: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
60e0: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
60f0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
6100: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
6110: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
6120: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
6130: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
6140: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
6150: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
6160: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
6170: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
6180: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
6190: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
61a0: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
61b0: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
61c0: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
61d0: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
61e0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
61f0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
6200: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
6210: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
6220: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
6230: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
6240: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
6250: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
6260: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
6270: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
6280: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
6290: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
62a0: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
62b0: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
62c0: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
62d0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
62e0: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
62f0: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52  OMMENTS)./*.** R
6300: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
6310: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f   value for one o
6320: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
6330: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70   to the opcode p
6340: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  Op.** determined
6350: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e   by character c.
6360: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
6370: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63  ranslateP(char c
6380: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29  , const Op *pOp)
6390: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29  {.  if( c=='1' )
63a0: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b   return pOp->p1;
63b0: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20  .  if( c=='2' ) 
63c0: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a  return pOp->p2;.
63d0: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72    if( c=='3' ) r
63e0: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20  eturn pOp->p3;. 
63f0: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65   if( c=='4' ) re
6400: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  turn pOp->p4.i;.
6410: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35    return pOp->p5
6420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
6430: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20  te a string for 
6440: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69  the "comment" fi
6450: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70  eld of a VDBE op
6460: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a  code listing..**
6470: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73  .** The Synopsis
6480: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65  : field in comme
6490: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e  nts in the vdbe.
64a0: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65  c source file ge
64b0: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ts converted.** 
64c0: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69  to an extra stri
64d0: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e  ng that is appen
64e0: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ded to the sqlit
64f0: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20  e3OpcodeName(). 
6500: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e   In the.** absen
6510: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d  ce of other comm
6520: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70  ents, this synop
6530: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  sis becomes the 
6540: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f  comment on the o
6550: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74  pcode..** Some t
6560: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72  ranslation occur
6570: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22  s:.**.**       "
6580: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b  PX"      ->  "r[
6590: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  X]".**       "PX
65a0: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e  @PY"   ->  "r[X.
65b0: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b  .X+Y-1]"  or "r[
65c0: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72  x]" if y is 0 or
65d0: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40   1.**       "PX@
65e0: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY+1" ->  "r[X..
65f0: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78  X+Y]"    or "r[x
6600: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20  ]" if y is 0.** 
6610: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20        "PY..PY"  
6620: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20  ->  "r[X..Y]"   
6630: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
6640: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y<=x.*/.static i
6650: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  nt displayCommen
6660: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70  t(.  const Op *p
6670: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  Op,     /* The o
6680: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d  pcode to be comm
6690: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ented */.  const
66a0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a   char *zP4,   /*
66b0: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61   Previously obta
66c0: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50  ined value for P
66d0: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  4 */.  char *zTe
66e0: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  mp,       /* Wri
66f0: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  te result here *
6700: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20  /.  int nTemp   
6710: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
6720: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65  available in zTe
6730: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  mp[] */.){.  con
6740: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
6750: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
6760: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74  zSynopsis;.  int
6770: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nOpName;.  int 
6780: 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d  ii, jj;.  zOpNam
6790: 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  e = sqlite3Opcod
67a0: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
67b0: 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20  e);.  nOpName = 
67c0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
67d0: 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zOpName);.  if( 
67e0: 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b  zOpName[nOpName+
67f0: 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65  1] ){.    int se
6800: 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63  enCom = 0;.    c
6810: 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f  har c;.    zSyno
6820: 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b  psis = zOpName +
6830: 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20  = nOpName + 1;. 
6840: 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20     for(ii=jj=0; 
6850: 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63  jj<nTemp-1 && (c
6860: 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d   = zSynopsis[ii]
6870: 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  )!=0; ii++){.   
6880: 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b     if( c=='P' ){
6890: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79  .        c = zSy
68a0: 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20  nopsis[++ii];.  
68b0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27        if( c=='4'
68c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
68d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
68e0: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
68f0: 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20  j, "%s", zP4);. 
6900: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
6910: 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20   c=='X' ){.     
6920: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6930: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
6940: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20  zTemp+jj, "%s", 
6950: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
6960: 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f            seenCo
6970: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  m = 1;.        }
6980: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6990: 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61  int v1 = transla
69a0: 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20  teP(c, pOp);.   
69b0: 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20         int v2;. 
69c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
69d0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
69e0: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
69f0: 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20  d", v1);.       
6a00: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
6a10: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22  Synopsis+ii+1, "
6a20: 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20  @P", 2)==0 ){.  
6a30: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20            ii += 
6a40: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  3;.            j
6a50: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  j += sqlite3Strl
6a60: 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a  en30(zTemp+jj);.
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d              v2 =
6a80: 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e   translateP(zSyn
6a90: 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b  opsis[ii], pOp);
6aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
6ab0: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
6ac0: 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d  is+ii+1,"+1",2)=
6ad0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6ae0: 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20      ii += 2;.   
6af0: 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b             v2++;
6b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
6b10: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76             if( v
6b20: 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  2>1 ){.         
6b30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6b40: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
6b50: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22  zTemp+jj, "..%d"
6b60: 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20  , v1+v2-1);.    
6b70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6b80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
6b90: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b  rncmp(zSynopsis+
6ba0: 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29  ii+1, "..P3", 4)
6bb0: 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d  ==0 && pOp->p3==
6bc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6bd0: 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20   ii += 4;.      
6be0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
6bf0: 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71          jj += sq
6c00: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
6c10: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d  emp+jj);.      }
6c20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54  else{.        zT
6c30: 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20  emp[jj++] = c;. 
6c40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6c50: 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26   if( !seenCom &&
6c60: 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70   jj<nTemp-5 && p
6c70: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
6c80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6c90: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
6ca0: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73   zTemp+jj, "; %s
6cb0: 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  ", pOp->zComment
6cc0: 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  );.      jj += s
6cd0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
6ce0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a  Temp+jj);.    }.
6cf0: 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70      if( jj<nTemp
6d00: 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30   ) zTemp[jj] = 0
6d10: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f  ;.  }else if( pO
6d20: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
6d30: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6d40: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6d50: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
6d60: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d  mment);.    jj =
6d70: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6d80: 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65  (zTemp);.  }else
6d90: 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d  {.    zTemp[0] =
6da0: 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a   0;.    jj = 0;.
6db0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b    }.  return jj;
6dc0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
6dd0: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 0a 23  ITE_DEBUG */...#
6de0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
6df0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29  TE_OMIT_EXPLAIN)
6e00: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45   || !defined(NDE
6e10: 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64  BUG) \.     || d
6e20: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
6e30: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
6e40: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
6e50: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74  .** Compute a st
6e60: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
6e70: 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d  bes the P4 param
6e80: 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f  eter for an opco
6e90: 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70  de..** Use zTemp
6ea0: 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65   for any require
6eb0: 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  d temporary buff
6ec0: 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  er space..*/.sta
6ed0: 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61  tic char *displa
6ee0: 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61  yP4(Op *pOp, cha
6ef0: 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54  r *zTemp, int nT
6f00: 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  emp){.  char *zP
6f10: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73  4 = zTemp;.  ass
6f20: 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29  ert( nTemp>=20 )
6f30: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d  ;.  switch( pOp-
6f40: 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63  >p4type ){.    c
6f50: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20  ase P4_KEYINFO: 
6f60: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  {.      int i, j
6f70: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
6f80: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d  *pKeyInfo = pOp-
6f90: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
6fa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
6fb0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
6fc0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=0 );.      sql
6fd0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6fe0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28 25  emp, zTemp, "k(%
6ff0: 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d", pKeyInfo->nF
7000: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d  ield);.      i =
7010: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7020: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66  (zTemp);.      f
7030: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e  or(j=0; j<pKeyIn
7040: 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29  fo->nField; j++)
7050: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
7060: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49  q *pColl = pKeyI
7070: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  nfo->aColl[j];. 
7080: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
7090: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  r *zColl = pColl
70a0: 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20   ? pColl->zName 
70b0: 3a 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20 20  : "nil";.       
70c0: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
70d0: 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b  Strlen30(zColl);
70e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  .        if( n==
70f0: 36 20 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f 6c  6 && memcmp(zCol
7100: 6c 2c 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d 30  l,"BINARY",6)==0
7110: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43   ){.          zC
7120: 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20  oll = "B";.     
7130: 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
7140: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
7150: 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b  ( i+n>nTemp-6 ){
7160: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
7170: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e  y(&zTemp[i],",..
7180: 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20  .",4);.         
7190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
71a0: 7d 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  }.        zTemp[
71b0: 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  i++] = ',';.    
71c0: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
71d0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20  ->aSortOrder[j] 
71e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65  ){.          zTe
71f0: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20  mp[i++] = '-';. 
7200: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7210: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
7220: 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a  ], zColl, n+1);.
7230: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a          i += n;.
7240: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
7250: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a  emp[i++] = ')';.
7260: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d        zTemp[i] =
7270: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
7280: 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20  ( i<nTemp );.   
7290: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
72a0: 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c      case P4_COLL
72b0: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
72c0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f  lSeq *pColl = pO
72d0: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20  p->p4.pColl;.   
72e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
72f0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7300: 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f  , "(%.20s)", pCo
7310: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
7320: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7330: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
7340: 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  EF: {.      Func
7350: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
7360: 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20  >p4.pFunc;.     
7370: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7380: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7390: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  "%s(%d)", pDef->
73a0: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72  zName, pDef->nAr
73b0: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
73c0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
73d0: 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20  P4_INT64: {.    
73e0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
73f0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7400: 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70   "%lld", *pOp->p
7410: 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62  4.pI64);.      b
7420: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7430: 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b  case P4_INT32: {
7440: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7450: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
7460: 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d  Temp, "%d", pOp-
7470: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
7480: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7490: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
74a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
74b0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
74c0: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f  mp, "%.16g", *pO
74d0: 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20  p->p4.pReal);.  
74e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
74f0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d  .    case P4_MEM
7500: 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  : {.      Mem *p
7510: 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d  Mem = pOp->p4.pM
7520: 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  em;.      if( pM
7530: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
7540: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Str ){.        z
7550: 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  P4 = pMem->z;.  
7560: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
7570: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
7580: 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Int ){.        s
7590: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
75a0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
75b0: 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29  lld", pMem->u.i)
75c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
75d0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
75e0: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
75f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7600: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7610: 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d  p, "%.16g", pMem
7620: 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->r);.      }els
7630: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
7640: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
7650: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7660: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
7670: 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a  zTemp, "NULL");.
7680: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7690: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
76a0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  m->flags & MEM_B
76b0: 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  lob );.        z
76c0: 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20  P4 = "(blob)";. 
76d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
76e0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
76f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
7700: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
7710: 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20  ase P4_VTAB: {. 
7720: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
7730: 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  b *pVtab = pOp->
7740: 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
7750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7760: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
7770: 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25  Temp, "vtab:%p:%
7780: 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62  p", pVtab, pVtab
7790: 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20  ->pModule);.    
77a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
77b0: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
77c0: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
77d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
77e0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
77f0: 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a  p, "intarray");.
7800: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7810: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53   }.    case P4_S
7820: 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20  UBPROGRAM: {.   
7830: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7840: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7850: 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20  , "program");.  
7860: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7870: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56  .    case P4_ADV
7880: 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54  ANCE: {.      zT
7890: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
78a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
78b0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
78c0: 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70      zP4 = pOp->p
78d0: 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  4.z;.      if( z
78e0: 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  P4==0 ){.       
78f0: 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20   zP4 = zTemp;.  
7900: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
7910: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
7920: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
7930: 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  zP4!=0 );.  retu
7940: 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66  rn zP4;.}.#endif
7950: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
7960: 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74  to the Vdbe that
7970: 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63   the BTree objec
7980: 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20  t at db->aDb[i] 
7990: 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  is used..**.** T
79a0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
79b0: 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b  ements need to k
79c0: 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74  now in advance t
79d0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20  he complete set 
79e0: 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  of.** attached d
79f0: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69  atabases that wi
7a00: 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61  ll be use.  A ma
7a10: 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61  sk of these data
7a20: 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e  bases.** is main
7a30: 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72  tained in p->btr
7a40: 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e  eeMask.  The p->
7a50: 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69  lockMask value i
7a60: 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a  s the subset of.
7a70: 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  ** p->btreeMask 
7a80: 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61  of databases tha
7a90: 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  t will require a
7aa0: 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73   lock..*/.void s
7ab0: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
7ac0: 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ree(Vdbe *p, int
7ad0: 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69   i){.  assert( i
7ae0: 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e  >=0 && i<p->db->
7af0: 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69  nDb && i<(int)si
7b00: 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20  zeof(yDbMask)*8 
7b10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28  );.  assert( i<(
7b20: 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74  int)sizeof(p->bt
7b30: 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  reeMask)*8 );.  
7b40: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20  p->btreeMask |= 
7b50: 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b  ((yDbMask)1)<<i;
7b60: 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 73  .  if( i!=1 && s
7b70: 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 61  qlite3BtreeShara
7b80: 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69  ble(p->db->aDb[i
7b90: 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 70 2d  ].pBt) ){.    p-
7ba0: 3e 6c 6f 63 6b 4d 61 73 6b 20 7c 3d 20 28 28 79  >lockMask |= ((y
7bb0: 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20  DbMask)1)<<i;.  
7bc0: 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  }.}..#if !define
7bd0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
7be0: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
7bf0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
7c00: 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  >0./*.** If SQLi
7c10: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
7c20: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
7c30: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
7c40: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
7c50: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
7c60: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
7c70: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
7c80: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
7c90: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
7ca0: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
7cb0: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
7cc0: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
7cd0: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
7ce0: 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73   it also.** sets
7cf0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
7d00: 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20   member of each 
7d10: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20  of the BtShared 
7d20: 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75  structures, ensu
7d30: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
7d40: 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61   correct busy-ha
7d50: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ndler callback i
7d60: 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71  s invoked if req
7d70: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
7d80: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
7d90: 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65  readsafe but doe
7da0: 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  s support shared
7db0: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65  -cache mode, the
7dc0: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  n.** sqlite3Btre
7dd0: 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f  eEnter() is invo
7de0: 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42  ked to set the B
7df0: 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61  tShared.db varia
7e00: 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  bles.** of all o
7e10: 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  f BtShared struc
7e20: 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65  tures accessible
7e30: 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73   via the databas
7e40: 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73  e handle .** ass
7e50: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
7e60: 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   VM..**.** If SQ
7e70: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
7e80: 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20  adsafe and does 
7e90: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
7ea0: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
7eb0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
7ec0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
7ed0: 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61  * The p->btreeMa
7ee0: 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69  sk field is a bi
7ef0: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72  tmask of all btr
7f00: 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65  ees that the pre
7f10: 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d  pared .** statem
7f20: 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20  ent p will ever 
7f30: 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74  use.  Let N be t
7f40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
7f50: 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  s in p->btreeMas
7f60: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  k.** correspondi
7f70: 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61  ng to btrees tha
7f80: 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63  t use shared cac
7f90: 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75  he.  Then the ru
7fa0: 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73  ntime of.** this
7fb0: 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e   routine is N*N.
7fc0: 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61    But as N is ra
7fd0: 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31  rely more than 1
7fe0: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
7ff0: 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65  t.** be a proble
8000: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
8010: 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65  e3VdbeEnter(Vdbe
8020: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
8030: 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20   yDbMask mask;. 
8040: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
8050: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
8060: 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63  Db;.  if( p->loc
8070: 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75 72  kMask==0 ) retur
8080: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
8090: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d  n case */.  db =
80a0: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
80b0: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
80c0: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
80d0: 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e  i=0, mask=1; i<n
80e0: 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d  Db; i++, mask +=
80f0: 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20   mask){.    if( 
8100: 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20  i!=1 && (mask & 
8110: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20  p->lockMask)!=0 
8120: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
8130: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
8140: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
8150: 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ter(aDb[i].pBt);
8160: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
8170: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
8180: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
8190: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
81a0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
81b0: 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  >0./*.** Unlock 
81c0: 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65  all of the btree
81d0: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  s previously loc
81e0: 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  ked by a call to
81f0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
8200: 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  r()..*/.void sql
8210: 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64  ite3VdbeLeave(Vd
8220: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
8230: 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b  .  yDbMask mask;
8240: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
8250: 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74    Db *aDb;.  int
8260: 20 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c   nDb;.  if( p->l
8270: 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74  ockMask==0 ) ret
8280: 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  urn;  /* The com
8290: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62  mon case */.  db
82a0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20   = p->db;.  aDb 
82b0: 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62  = db->aDb;.  nDb
82c0: 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f   = db->nDb;.  fo
82d0: 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69  r(i=0, mask=1; i
82e0: 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20  <nDb; i++, mask 
82f0: 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66  += mask){.    if
8300: 28 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20  ( i!=1 && (mask 
8310: 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d  & p->lockMask)!=
8320: 30 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  0 && ALWAYS(aDb[
8330: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
8340: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
8350: 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74  Leave(aDb[i].pBt
8360: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
8370: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
8380: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
8390: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
83a0: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
83b0: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
83c0: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
83d0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
83e0: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
83f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8400: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
8410: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
8420: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
8430: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50   *zP4;.  char zP
8440: 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a  tr[50];.  char z
8450: 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74  Com[100];.  stat
8460: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
8470: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25  Format1 = "%4d %
8480: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64  -13s %4d %4d %4d
8490: 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e   %-13s %.2X %s\n
84a0: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
84b0: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
84c0: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
84d0: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
84e0: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69  izeof(zPtr));.#i
84f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8500: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
8510: 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d  NTS.  displayCom
8520: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a  ment(pOp, zP4, z
8530: 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d  Com, sizeof(zCom
8540: 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d  ));.#else.  zCom
8550: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
8560: 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71    /* NB:  The sq
8570: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
8580: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  ) function is im
8590: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64  plemented by cod
85a0: 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62  e created.  ** b
85b0: 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  y the mkopcodeh.
85c0: 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65  awk and mkopcode
85d0: 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68  c.awk scripts wh
85e0: 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a  ich extract the.
85f0: 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
8600: 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63   from the vdbe.c
8610: 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a   source text */.
8620: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
8630: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
8640: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
8650: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
8660: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
8670: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
8680: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20  zP4, pOp->p5,.  
8690: 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20      zCom.  );.  
86a0: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
86b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
86c0: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
86d0: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
86e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
86f0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
8700: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
8710: 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a    if( p && N ){.
8720: 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20      Mem *pEnd;. 
8730: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
8740: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d   p->db;.    u8 m
8750: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64  alloc_failed = d
8760: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
8770: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42  .    if( db->pnB
8780: 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20  ytesFreed ){.   
8790: 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e     for(pEnd=&p[N
87a0: 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b  ]; p<pEnd; p++){
87b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
87c0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
87d0: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 0a  alloc);.      }.
87e0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
87f0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 45 6e 64    }.    for(pEnd
8800: 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20  =&p[N]; p<pEnd; 
8810: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  p++){.      asse
8820: 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e  rt( (&p[1])==pEn
8830: 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b  d || p[0].db==p[
8840: 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61  1].db );.      a
8850: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
8860: 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69  beCheckMemInvari
8870: 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20  ants(p) );..    
8880: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
8890: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c  is really an inl
88a0: 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ined version of 
88b0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
88c0: 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a  lease().      **
88d0: 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61   that takes adva
88e0: 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63  ntage of the fac
88f0: 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  t that the memor
8900: 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20  y cell value is 
8910: 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
8920: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65  set to NULL afte
8930: 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20  r releasing any 
8940: 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65  dynamic resource
8950: 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s..      **.    
8960: 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69    ** The justifi
8970: 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  cation for dupli
8980: 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74  cating code is t
8990: 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  hat according to
89a0: 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67   .      ** callg
89b0: 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65  rind, this cause
89c0: 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74  s a certain test
89d0: 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65   case to hit the
89e0: 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20   CPU 4.7 .      
89f0: 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20  ** percent less 
8a00: 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20  (x86 linux, gcc 
8a10: 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d  version 4.1.2, -
8a20: 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20  O6) than if .   
8a30: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d     ** sqlite3Mem
8a40: 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63  Release() were c
8a50: 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e  alled from here.
8a60: 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20   With -O2, this 
8a70: 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74  jumps.      ** t
8a80: 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54  o 6.6 percent. T
8a90: 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20  he test case is 
8aa0: 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72  inserting 1000 r
8ab0: 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ows into a table
8ac0: 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20   .      ** with 
8ad0: 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67  no indexes using
8ae0: 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72   a single prepar
8af0: 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  ed INSERT statem
8b00: 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20  ent, bind() .   
8b10: 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28     ** and reset(
8b20: 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67  ). Inserts are g
8b30: 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72  rouped into a tr
8b40: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
8b50: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
8b60: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
8b70: 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20  EM_Agg );.      
8b80: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
8b90: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a  gs & MEM_Dyn );.
8ba0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8bb0: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46  p->flags & MEM_F
8bc0: 72 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65  rame );.      te
8bd0: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
8be0: 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b   & MEM_RowSet );
8bf0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  .      if( p->fl
8c00: 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d  ags&(MEM_Agg|MEM
8c10: 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d  _Dyn|MEM_Frame|M
8c20: 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20  EM_RowSet) ){.  
8c30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8c40: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a  eMemRelease(p);.
8c50: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8c60: 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20  p->zMalloc ){.  
8c70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8c80: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
8c90: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  oc);.        p->
8ca0: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
8cb0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66     }..      p->f
8cc0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66  lags = MEM_Undef
8cd0: 69 6e 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ined;.    }.    
8ce0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8cf0: 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64   = malloc_failed
8d00: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
8d10: 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d  elete a VdbeFram
8d20: 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73  e object and its
8d30: 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46   contents. VdbeF
8d40: 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65  rame objects are
8d50: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
8d60: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
8d70: 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65  opcode in sqlite
8d80: 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a  3VdbeExec()..*/.
8d90: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8da0: 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65  FrameDelete(Vdbe
8db0: 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Frame *p){.  int
8dc0: 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20   i;.  Mem *aMem 
8dd0: 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  = VdbeFrameMem(p
8de0: 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  );.  VdbeCursor 
8df0: 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43  **apCsr = (VdbeC
8e00: 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70  ursor **)&aMem[p
8e10: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20  ->nChildMem];.  
8e20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
8e30: 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20  hildCsr; i++){. 
8e40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
8e50: 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61  eeCursor(p->v, a
8e60: 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pCsr[i]);.  }.  
8e70: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
8e80: 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d  aMem, p->nChildM
8e90: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  em);.  sqlite3Db
8ea0: 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70  Free(p->v->db, p
8eb0: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
8ec0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
8ed0: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
8ee0: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
8ef0: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
8f00: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
8f10: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
8f20: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
8f30: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
8f40: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
8f50: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
8f60: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
8f70: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
8f80: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
8f90: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
8fa0: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
8fb0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
8fc0: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a   "EXPLAIN"..**.*
8fd0: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
8fe0: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72  n==1, each instr
8ff0: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  uction is listed
9000: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78  .  When.** p->ex
9010: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f  plain==2, only O
9020: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
9030: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65  ctions are liste
9040: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61  d and these.** a
9050: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69  re shown in a di
9060: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20  fferent format. 
9070: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69   p->explain==2 i
9080: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
9090: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51  ent.** EXPLAIN Q
90a0: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a  UERY PLAN..**.**
90b0: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
90c0: 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d  ==1, first the m
90d0: 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  ain program is l
90e0: 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68  isted, then each
90f0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67   of.** the trigg
9100: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
9110: 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79  re listed one by
9120: 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   one..*/.int sql
9130: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
9140: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
9150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9160: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e   VDBE */.){.  in
9170: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
9180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9190: 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20     /* Stop when 
91a0: 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65  row count reache
91b0: 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20  s this */.  int 
91c0: 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  nSub = 0;       
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75   /* Number of su
91f0: 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20  b-vdbes seen so 
9200: 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67  far */.  SubProg
9210: 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b  ram **apSub = 0;
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9230: 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64   Array of sub-vd
9240: 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53  bes */.  Mem *pS
9250: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9270: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c   Memory cell hol
9280: 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  d array of subpr
9290: 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ogs */.  sqlite3
92a0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20   *db = p->db;   
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
92c0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
92d0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
92e0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9300: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
9310: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
9320: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
9330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9340: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
9350: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
9360: 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20  >aMem[1];       
9370: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
9380: 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74  em of result set
9390: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
93a0: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61  ->explain );.  a
93b0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
93c0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
93d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
93e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
93f0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42   p->rc==SQLITE_B
9400: 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  USY || p->rc==SQ
9410: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20  LITE_NOMEM );.. 
9420: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
9430: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  this opcode does
9440: 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63   not use dynamic
9450: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a   strings for.  *
9460: 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65  * the result, re
9470: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79  sult columns may
9480: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
9490: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
94a0: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
94b0: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
94c0: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
94d0: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
94e0: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
94f0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
9500: 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e  (pMem, 8);.  p->
9510: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
9520: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
9530: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
9540: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
9550: 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  s if a malloc() 
9560: 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f  inside a call to
9570: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9580: 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a  text() or.    **
9590: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
95a0: 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e  text16() failed.
95b0: 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c    */.    db->mal
95c0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
95d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
95e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
95f0: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
9600: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
9610: 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74   reaches nRow, t
9620: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20  hat means the.  
9630: 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66  ** listing has f
9640: 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69  inished and sqli
9650: 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c  te3_step() shoul
9660: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
9670: 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20  DONE..  ** nRow 
9680: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
9690: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
96a0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   in the main pro
96b0: 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20  gram, plus.  ** 
96c0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
96d0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
96e0: 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62   all trigger sub
96f0: 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74  programs encount
9700: 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72  ered.  ** so far
9710: 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75  .  The nRow valu
9720: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
9730: 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73  as new trigger s
9740: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20  ubprograms are. 
9750: 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   ** encountered,
9760: 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20   but p->pc will 
9770: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68  eventually catch
9780: 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a   up to nRow..  *
9790: 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f  /.  nRow = p->nO
97a0: 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  p;.  if( p->expl
97b0: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  ain==1 ){.    /*
97c0: 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d   The first 8 mem
97d0: 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73  ory cells are us
97e0: 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ed for the resul
97f0: 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69  t set.  So we wi
9800: 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  ll.    ** comman
9810: 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c  deer the 9th cel
9820: 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72  l to use as stor
9830: 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79  age for an array
9840: 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20   of pointers.   
9850: 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73   ** to trigger s
9860: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65  ubprograms.  The
9870: 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74   VDBE is guarant
9880: 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c  eed to have at l
9890: 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65  east 9.    ** ce
98a0: 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  lls.  */.    ass
98b0: 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29  ert( p->nMem>9 )
98c0: 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d  ;.    pSub = &p-
98d0: 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66  >aMem[9];.    if
98e0: 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45  ( pSub->flags&ME
98f0: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
9900: 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  /* On the first 
9910: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
9920: 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c  step(), pSub wil
9930: 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20  l hold a NULL.  
9940: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  It is.      ** i
9950: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
9960: 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53  BLOB by the P4_S
9970: 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73  UBPROGRAM proces
9980: 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77  sing logic below
9990: 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d   */.      nSub =
99a0: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28   pSub->n/sizeof(
99b0: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70  Vdbe*);.      ap
99c0: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
99d0: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
99e0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
99f0: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20   i<nSub; i++){. 
9a00: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53       nRow += apS
9a10: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[i]->nOp;.    
9a20: 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  }.  }..  do{.   
9a30: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
9a40: 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26  }while( i<nRow &
9a50: 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  & p->explain==2 
9a60: 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  && p->aOp[i].opc
9a70: 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20  ode!=OP_Explain 
9a80: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77  );.  if( i>=nRow
9a90: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
9aa0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
9ab0: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
9ac0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
9ad0: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
9ae0: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
9af0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
9b00: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
9b10: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
9b20: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
9b30: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
9b40: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
9b50: 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d  Str(p->rc));.  }
9b60: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
9b70: 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  zP4;.    Op *pOp
9b80: 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e  ;.    if( i<p->n
9b90: 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  Op ){.      /* T
9ba0: 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e  he output line n
9bb0: 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65  umber is small e
9bc0: 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72  nough that we ar
9bd0: 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20  e still in the. 
9be0: 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f       ** main pro
9bf0: 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70  gram. */.      p
9c00: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
9c10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9c20: 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72    /* We are curr
9c30: 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75  ently listing su
9c40: 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75  bprograms.  Figu
9c50: 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65  re out which one
9c60: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69   and.      ** pi
9c70: 63 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70  ck up the approp
9c80: 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f  riate opcode. */
9c90: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
9ca0: 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b      i -= p->nOp;
9cb0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
9cc0: 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  i>=apSub[j]->nOp
9cd0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
9ce0: 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e  i -= apSub[j]->n
9cf0: 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Op;.      }.    
9d00: 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a    pOp = &apSub[j
9d10: 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  ]->aOp[i];.    }
9d20: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
9d30: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
9d40: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
9d50: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
9d60: 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20  m->u.i = i;     
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
9d90: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f  ogram counter */
9da0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
9db0: 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   .      pMem->fl
9dc0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63  ags = MEM_Static
9dd0: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
9de0: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  m;.      pMem->z
9df0: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
9e00: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
9e10: 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63  >opcode); /* Opc
9e20: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ode */.      ass
9e30: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
9e40: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  );.      pMem->n
9e50: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
9e60: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
9e70: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
9e80: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
9e90: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20    pMem++;..     
9ea0: 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50   /* When an OP_P
9eb0: 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73  rogram opcode is
9ec0: 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20   encounter (the 
9ed0: 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74  only opcode that
9ee0: 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20   has.      ** a 
9ef0: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72  P4_SUBPROGRAM ar
9f00: 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20  gument), expand 
9f10: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
9f20: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  array of subprog
9f30: 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65  rams.      ** ke
9f40: 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d  pt in p->aMem[9]
9f50: 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  .z to hold the n
9f60: 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73  ew program - ass
9f70: 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72  uming this subpr
9f80: 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68  ogram.      ** h
9f90: 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
9fa0: 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20  een seen..      
9fb0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  */.      if( pOp
9fc0: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
9fd0: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
9fe0: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
9ff0: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
a000: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
a010: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
a020: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
a030: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
a040: 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a       if( apSub[j
a050: 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67  ]==pOp->p4.pProg
a060: 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ram ) break;.   
a070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
a080: 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51  f( j==nSub && SQ
a090: 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33  LITE_OK==sqlite3
a0a0: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62  VdbeMemGrow(pSub
a0b0: 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30  , nByte, nSub!=0
a0c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
a0d0: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
a0e0: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
a0f0: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e           apSub[n
a100: 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34  Sub++] = pOp->p4
a110: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
a120: 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73       pSub->flags
a130: 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20   |= MEM_Blob;.  
a140: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20          pSub->n 
a150: 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75  = nSub*sizeof(Su
a160: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
a170: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a180: 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66    }..    pMem->f
a190: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
a1a0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
a1b0: 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20  pOp->p1;        
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1d0: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70    /* P1 */.    p
a1e0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
a1f0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
a200: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
a210: 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20   = pOp->p2;     
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a230: 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20       /* P2 */.  
a240: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
a250: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
a260: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
a270: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20  u.i = pOp->p3;  
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a290: 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f          /* P3 */
a2a0: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
a2b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
a2c0: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33  eMemGrow(pMem, 3
a2d0: 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20 20  2, 0) ){        
a2e0: 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20      /* P4 */.   
a2f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
a300: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
a310: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
a320: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
a330: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61   }.    pMem->fla
a340: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
a350: 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d  _Term;.    zP4 =
a360: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
a370: 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20  pMem->z, 32);.  
a380: 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d    if( zP4!=pMem-
a390: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
a3a0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
a3b0: 28 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20  (pMem, zP4, -1, 
a3c0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b  SQLITE_UTF8, 0);
a3d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a3e0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
a3f0: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
a400: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
a410: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
a420: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
a430: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
a440: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b  .    }.    pMem+
a450: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  +;..    if( p->e
a460: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
a470: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
a480: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20  beMemGrow(pMem, 
a490: 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  4, 0) ){.       
a4a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
a4b0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
a4c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
a4d0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
a4e0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
a4f0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
a500: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
a510: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20   pMem->n = 2;.  
a520: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
a530: 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c  intf(3, pMem->z,
a540: 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35   "%.2x", pOp->p5
a550: 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20  );   /* P5 */.  
a560: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
a570: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
a580: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69     pMem++;.  .#i
a590: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
a5a0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
a5b0: 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 73 71  NTS.      if( sq
a5c0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
a5d0: 28 70 4d 65 6d 2c 20 35 30 30 2c 20 30 29 20 29  (pMem, 500, 0) )
a5e0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
a5f0: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
a600: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
a610: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
a620: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
a630: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
a640: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
a650: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
a660: 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  n = displayComme
a670: 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65  nt(pOp, zP4, pMe
a680: 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20  m->z, 500);.    
a690: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
a6a0: 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65  LITE_UTF8;.#else
a6b0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
a6c0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20  gs = MEM_Null;  
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6e0: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20       /* Comment 
a6f0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  */.#endif.    }.
a700: 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  .    p->nResColu
a710: 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65  mn = 8 - 4*(p->e
a720: 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70  xplain-1);.    p
a730: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26  ->pResultSet = &
a740: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20  p->aMem[1];.    
a750: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
a760: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
a770: 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65  TE_ROW;.  }.  re
a780: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
a790: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
a7a0: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66  _EXPLAIN */..#if
a7b0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a7c0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
a7d0: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
a7e0: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
a7f0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
a800: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
a810: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
a820: 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *p){.  const cha
a830: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  r *z = 0;.  if( 
a840: 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a  p->zSql ){.    z
a850: 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65   = p->zSql;.  }e
a860: 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d  lse if( p->nOp>=
a870: 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56  1 ){.    const V
a880: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
a890: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28  >aOp[0];.    if(
a8a0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
a8b0: 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34  _Init && pOp->p4
a8c0: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  .z!=0 ){.      z
a8d0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
a8e0: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
a8f0: 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20  e3Isspace(*z) ) 
a900: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  z++;.    }.  }. 
a910: 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28   if( z ) printf(
a920: 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  "SQL: [%s]\n", z
a930: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
a940: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
a950: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
a960: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
a970: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f  NABLE_IOTRACE)./
a980: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f  *.** Print an IO
a990: 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68  TRACE message sh
a9a0: 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e  owing SQL conten
a9b0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
a9c0: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
a9d0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
a9e0: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
a9f0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
aa00: 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61  if( sqlite3IoTra
aa10: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
aa20: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
aa30: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
aa40: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20  ->aOp[0];.  if( 
aa50: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
aa60: 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e  Init && pOp->p4.
aa70: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  z!=0 ){.    int 
aa80: 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a  i, j;.    char z
aa90: 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69  [1000];.    sqli
aaa0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
aab0: 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c  eof(z), z, "%s",
aac0: 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20   pOp->p4.z);.   
aad0: 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65   for(i=0; sqlite
aae0: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20  3Isspace(z[i]); 
aaf0: 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a  i++){}.    for(j
ab00: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
ab10: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
ab20: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29  3Isspace(z[i]) )
ab30: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
ab40: 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20  i-1]!=' ' ){.   
ab50: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
ab60: 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ' ';.        }. 
ab70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ab80: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
ab90: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
aba0: 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20  .    z[j] = 0;. 
abb0: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
abc0: 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29  e("SQL %s\n", z)
abd0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
abe0: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  * !SQLITE_OMIT_T
abf0: 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45  RACE && SQLITE_E
ac00: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f  NABLE_IOTRACE */
ac10: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
ac20: 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69   space from a fi
ac30: 78 65 64 20 73 69 7a 65 20 62 75 66 66 65 72 20  xed size buffer 
ac40: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
ac50: 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20  nter to.** that 
ac60: 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66  space.  If insuf
ac70: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 73  ficient space is
ac80: 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75   available, retu
ac90: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
aca0: 68 65 20 70 42 75 66 20 70 61 72 61 6d 65 74 65  he pBuf paramete
acb0: 72 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  r is the initial
acc0: 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e   value of a poin
acd0: 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a  ter which will.*
ace0: 2a 20 72 65 63 65 69 76 65 20 74 68 65 20 6e 65  * receive the ne
acf0: 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20  w memory.  pBuf 
ad00: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c  is normally NULL
ad10: 2e 20 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f  .  If pBuf is no
ad20: 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65  t.** NULL, it me
ad30: 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  ans that memory 
ad40: 73 70 61 63 65 20 68 61 73 20 61 6c 72 65 61 64  space has alread
ad50: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
ad60: 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69   and that.** thi
ad70: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
ad80: 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e   not allocate an
ad90: 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57  y new memory.  W
ada0: 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a  hen pBuf is not.
adb0: 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72  ** NULL simply r
adc0: 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c  eturn pBuf.  Onl
add0: 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d  y allocate new m
ade0: 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e  emory space when
adf0: 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c   pBuf.** is NULL
ae00: 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73  ..**.** nByte is
ae10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
ae20: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65  ytes of space ne
ae30: 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46  eded..**.** *ppF
ae40: 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 76  rom points to av
ae50: 61 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e  ailable space an
ae60: 64 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f  d pEnd points to
ae70: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
ae80: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61  ** available spa
ae90: 63 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65 20  ce.  When space 
aea0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70  is allocated, *p
aeb0: 70 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 65  pFrom is advance
aec0: 64 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e  d past.** the en
aed0: 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  d of the allocat
aee0: 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  ed space..**.** 
aef0: 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75  *pnByte is a cou
af00: 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62  nter of the numb
af10: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
af20: 70 61 63 65 20 74 68 61 74 20 68 61 76 65 20 66  pace that have f
af30: 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f  ailed.** to allo
af40: 63 61 74 65 2e 20 20 49 66 20 74 68 65 72 65 20  cate.  If there 
af50: 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20  is insufficient 
af60: 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d  space in *ppFrom
af70: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a   to satisfy the.
af80: 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e  ** request, then
af90: 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79   increment *pnBy
afa0: 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74  te by the amount
afb0: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 2e   of the request.
afc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
afd0: 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76  *allocSpace(.  v
afe0: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
aff0: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74      /* Where ret
b000: 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c  urn pointer will
b010: 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20   be stored */.  
b020: 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
b030: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b040: 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  f bytes to alloc
b050: 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70  ate */.  u8 **pp
b060: 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a  From,         /*
b070: 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74   IN/OUT: Allocat
b080: 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a  e from *ppFrom *
b090: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20  /.  u8 *pEnd,   
b0a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
b0b0: 74 65 72 20 74 6f 20 31 20 62 79 74 65 20 70 61  ter to 1 byte pa
b0c0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70  st the end of *p
b0d0: 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a  pFrom buffer */.
b0e0: 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 20    int *pnByte   
b0f0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
b100: 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ocation cannot b
b110: 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e  e made, incremen
b120: 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a  t *pnByte */.){.
b130: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
b140: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a  BYTE_ALIGNMENT(*
b150: 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28  ppFrom) );.  if(
b160: 20 70 42 75 66 20 29 20 72 65 74 75 72 6e 20 70   pBuf ) return p
b170: 42 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52  Buf;.  nByte = R
b180: 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20  OUND8(nByte);.  
b190: 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e  if( &(*ppFrom)[n
b1a0: 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b  Byte] <= pEnd ){
b1b0: 0a 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69  .    pBuf = (voi
b1c0: 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20  d*)*ppFrom;.    
b1d0: 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65  *ppFrom += nByte
b1e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
b1f0: 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b  pnByte += nByte;
b200: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42  .  }.  return pB
b210: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77  uf;.}../*.** Rew
b220: 69 6e 64 20 74 68 65 20 56 44 42 45 20 62 61 63  ind the VDBE bac
b230: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
b240: 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  ng in preparatio
b250: 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67  n for.** running
b260: 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c   it..*/.void sql
b270: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 56  ite3VdbeRewind(V
b280: 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66  dbe *p){.#if def
b290: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
b2a0: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44  G) || defined(VD
b2b0: 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e  BE_PROFILE).  in
b2c0: 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  t i;.#endif.  as
b2d0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
b2e0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
b2f0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
b300: 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65  T );..  /* There
b310: 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65   should be at le
b320: 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a  ast one opcode..
b330: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
b340: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ->nOp>0 );..  /*
b350: 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74   Set the magic t
b360: 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  o VDBE_MAGIC_RUN
b370: 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
b380: 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20  han later. */.  
b390: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
b3a0: 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64  MAGIC_RUN;..#ifd
b3b0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b3c0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e    for(i=1; i<p->
b3d0: 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nMem; i++){.    
b3e0: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
b3f0: 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a  i].db==p->db );.
b400: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
b410: 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63  pc = -1;.  p->rc
b420: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
b430: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
b440: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e   OE_Abort;.  p->
b450: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
b460: 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68  IC_RUN;.  p->nCh
b470: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  ange = 0;.  p->c
b480: 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70  acheCtr = 1;.  p
b490: 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f  ->minWriteFileFo
b4a0: 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d  rmat = 255;.  p-
b4b0: 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >iStatement = 0;
b4c0: 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  .  p->nFkConstra
b4d0: 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  int = 0;.#ifdef 
b4e0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66  VDBE_PROFILE.  f
b4f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
b500: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61  ; i++){.    p->a
b510: 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20  Op[i].cnt = 0;. 
b520: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
b530: 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  les = 0;.  }.#en
b540: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  dif.}../*.** Pre
b550: 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  pare a virtual m
b560: 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75  achine for execu
b570: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72  tion for the fir
b580: 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a  st time after.**
b590: 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 76 69   creating the vi
b5a0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20  rtual machine.  
b5b0: 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68  This involves th
b5c0: 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20  ings such.** as 
b5d0: 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b  allocating stack
b5e0: 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69   space and initi
b5f0: 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67  alizing the prog
b600: 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20  ram counter..** 
b610: 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68  After the VDBE h
b620: 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69  as be prepped, i
b630: 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65  t can be execute
b640: 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d by one or more
b650: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
b660: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
b670: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e   .**.** This fun
b680: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
b690: 6c 65 64 20 65 78 61 63 74 20 6f 6e 63 65 20 6f  led exact once o
b6a0: 6e 20 61 20 65 61 63 68 20 76 69 72 74 75 61 6c  n a each virtual
b6b0: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74   machine..** Aft
b6c0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
b6d0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d  is called the VM
b6e0: 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61   has been "packa
b6f0: 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64  ged" and is read
b700: 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66  y.** to run.  Af
b710: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
b720: 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 74 68   is called, futh
b730: 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20  er calls to .** 
b740: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b750: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  () functions are
b760: 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68   prohibited.  Th
b770: 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f  is routine disco
b780: 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64  nnects.** the Vd
b790: 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73  be from the Pars
b7a0: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65  e object that he
b7b0: 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69 74  lped generate it
b7c0: 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20   so that the.** 
b7d0: 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73  the Vdbe becomes
b7e0: 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20   an independent 
b7f0: 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20 50  entity and the P
b800: 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20  arse object can 
b810: 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e  be.** destroyed.
b820: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
b830: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
b840: 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20  () procedure to 
b850: 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75 61  restore a virtua
b860: 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a  l machine back.*
b870: 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c  * to its initial
b880: 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74 20   state after it 
b890: 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f  has been run..*/
b8a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
b8b0: 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64  eMakeReady(.  Vd
b8c0: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b8e0: 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61  The VDBE */.  Pa
b8f0: 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20 20  rse *pParse     
b900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b910: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
b920: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
b930: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
b940: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
b950: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
b960: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b  n */.  int nVar;
b970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b980: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b990: 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  of parameters */
b9a0: 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20  .  int nMem;    
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56    /* Number of V
b9d0: 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  M memory registe
b9e0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72  rs */.  int nCur
b9f0: 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  sor;            
ba00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ba10: 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71 75   of cursors requ
ba20: 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  ired */.  int nA
ba30: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
ba40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ba50: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
ba60: 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a  in subprograms *
ba70: 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20  /.  int nOnce;  
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
baa0: 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74  OP_Once instruct
bab0: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ions */.  int n;
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
bae0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
baf0: 20 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20 20   *zCsr;         
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bb10: 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65  Memory available
bb20: 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   for allocation 
bb30: 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20  */.  u8 *zEnd;  
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb50: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
bb60: 65 20 70 61 73 74 20 61 6c 6c 6f 63 61 74 65 64  e past allocated
bb70: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
bb80: 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
bba0: 6f 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d 65  ow much extra me
bbb0: 6d 6f 72 79 20 69 73 20 6e 65 65 64 65 64 20 2a  mory is needed *
bbc0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  /..  assert( p!=
bbd0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
bbe0: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ->nOp>0 );.  ass
bbf0: 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
bc00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
bc10: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
bc20: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
bc30: 74 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50  t( pParse==p->pP
bc40: 61 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70  arse );.  db = p
bc50: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
bc60: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
bc70: 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20  ==0 );.  nVar = 
bc80: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20  pParse->nVar;.  
bc90: 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nMem = pParse->n
bca0: 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d  Mem;.  nCursor =
bcb0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
bcc0: 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e   nArg = pParse->
bcd0: 6e 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65  nMaxArg;.  nOnce
bce0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65   = pParse->nOnce
bcf0: 3b 0a 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30  ;.  if( nOnce==0
bd00: 20 29 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a   ) nOnce = 1; /*
bd10: 20 45 6e 73 75 72 65 20 61 74 20 6c 65 61 73 74   Ensure at least
bd20: 20 6f 6e 65 20 62 79 74 65 20 69 6e 20 70 2d 3e   one byte in p->
bd30: 61 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20  aOnceFlag[] */. 
bd40: 20 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20   .  /* For each 
bd50: 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c  cursor required,
bd60: 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61   also allocate a
bd70: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65   memory cell. Me
bd80: 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  mory.  ** cells 
bd90: 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29  (nMem+1-nCursor)
bda0: 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76  ..nMem, inclusiv
bdb0: 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  e, will never be
bdc0: 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68   used by.  ** th
bdd0: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20  e vdbe program. 
bde0: 49 6e 73 74 65 61 64 20 74 68 65 79 20 61 72 65  Instead they are
bdf0: 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
be00: 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a  e space for.  **
be10: 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75   VdbeCursor/BtCu
be20: 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e  rsor structures.
be30: 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   The blob of mem
be40: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
be50: 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72  ith .  ** cursor
be60: 20 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   0 is stored in 
be70: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d  memory cell nMem
be80: 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e  . Memory cell (n
be90: 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72  Mem-1).  ** stor
bea0: 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d  es the blob of m
beb0: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
bec0: 20 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20   with cursor 1, 
bed0: 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  etc..  **.  ** S
bee0: 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74  ee also: allocat
bef0: 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a  eCursor()..  */.
bf00: 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f    nMem += nCurso
bf10: 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  r;..  /* Allocat
bf20: 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f  e space for memo
bf30: 72 79 20 72 65 67 69 73 74 65 72 73 2c 20 53 51  ry registers, SQ
bf40: 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42  L variables, VDB
bf50: 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20  E cursors and . 
bf60: 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20   ** an array to 
bf70: 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63  marshal SQL func
bf80: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69  tion arguments i
bf90: 6e 2e 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20 3d  n..  */.  zCsr =
bfa0: 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d   (u8*)&p->aOp[p-
bfb0: 3e 6e 4f 70 5d 3b 20 20 20 20 20 20 20 20 20 20  >nOp];          
bfc0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 6c    /* Memory aval
bfd0: 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61  iable for alloca
bfe0: 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20 3d  tion */.  zEnd =
bff0: 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 50   (u8*)&p->aOp[pP
c000: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b  arse->nOpAlloc];
c010: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
c020: 70 61 73 74 20 65 6e 64 20 6f 66 20 7a 43 73 72  past end of zCsr
c030: 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65  [] */..  resolve
c040: 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72  P2Values(p, &nAr
c050: 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d  g);.  p->usesStm
c060: 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28  tJournal = (u8)(
c070: 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57  pParse->isMultiW
c080: 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e  rite && pParse->
c090: 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28  mayAbort);.  if(
c0a0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
c0b0: 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20   && nMem<10 ){. 
c0c0: 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20     nMem = 10;.  
c0d0: 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c  }.  memset(zCsr,
c0e0: 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a   0, zEnd-zCsr);.
c0f0: 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20    zCsr += (zCsr 
c100: 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 61  - (u8*)0)&7;.  a
c110: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
c120: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72  E_ALIGNMENT(zCsr
c130: 29 20 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65  ) );.  p->expire
c140: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d  d = 0;..  /* Mem
c150: 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72  ory for register
c160: 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63  s, parameters, c
c170: 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61  ursor, etc, is a
c180: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a  llocated in two.
c190: 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e    ** passes.  On
c1a0: 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c   the first pass,
c1b0: 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65   we try to reuse
c1c0: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 61 74   unused space at
c1d0: 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f   the .  ** end o
c1e0: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
c1f0: 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75  ay.  If we are u
c200: 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79  nable to satisfy
c210: 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a   all memory.  **
c220: 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79   requirements by
c230: 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63   reusing the opc
c240: 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20  ode array tail, 
c250: 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a  then the second.
c260: 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66    ** pass will f
c270: 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20  ill in the rest 
c280: 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c  using a fresh al
c290: 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a  location.  .  **
c2a0: 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70  .  ** This two-p
c2b0: 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61  ass approach tha
c2c0: 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68  t reuses as much
c2d0: 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
c2e0: 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  ble from.  ** th
c2f0: 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65  e leftover space
c300: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
c310: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
c320: 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c  can significantl
c330: 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68  y.  ** reduce th
c340: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f  e amount of memo
c350: 72 79 20 68 65 6c 64 20 62 79 20 61 20 70 72 65  ry held by a pre
c360: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
c370: 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20  .  */.  do {.   
c380: 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20   nByte = 0;.    
c390: 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53  p->aMem = allocS
c3a0: 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d  pace(p->aMem, nM
c3b0: 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20  em*sizeof(Mem), 
c3c0: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
c3d0: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61  yte);.    p->aVa
c3e0: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
c3f0: 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  ->aVar, nVar*siz
c400: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
c410: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
c420: 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61      p->apArg = a
c430: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 41  llocSpace(p->apA
c440: 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28  rg, nArg*sizeof(
c450: 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45  Mem*), &zCsr, zE
c460: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
c470: 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f   p->azVar = allo
c480: 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c  cSpace(p->azVar,
c490: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61   nVar*sizeof(cha
c4a0: 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  r*), &zCsr, zEnd
c4b0: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
c4c0: 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53  ->apCsr = allocS
c4d0: 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e  pace(p->apCsr, n
c4e0: 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64  Cursor*sizeof(Vd
c4f0: 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20  beCursor*),.    
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c510: 20 20 20 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e        &zCsr, zEn
c520: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
c530: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61  p->aOnceFlag = a
c540: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4f 6e  llocSpace(p->aOn
c550: 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20 26  ceFlag, nOnce, &
c560: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
c570: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79  te);.    if( nBy
c580: 74 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  te ){.      p->p
c590: 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Free = sqlite3Db
c5a0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
c5b0: 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Byte);.    }.   
c5c0: 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 65   zCsr = p->pFree
c5d0: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43  ;.    zEnd = &zC
c5e0: 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 68  sr[nByte];.  }wh
c5f0: 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21 64  ile( nByte && !d
c600: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c610: 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72  );..  p->nCursor
c620: 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d   = nCursor;.  p-
c630: 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e  >nOnceFlag = nOn
c640: 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61  ce;.  if( p->aVa
c650: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72  r ){.    p->nVar
c660: 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a   = (ynVar)nVar;.
c670: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e      for(n=0; n<n
c680: 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Var; n++){.     
c690: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67   p->aVar[n].flag
c6a0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
c6b0: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
c6c0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20  b = db;.    }.  
c6d0: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56 61 72  }.  if( p->azVar
c6e0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72   ){.    p->nzVar
c6f0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72   = pParse->nzVar
c700: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ;.    memcpy(p->
c710: 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 61  azVar, pParse->a
c720: 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73  zVar, p->nzVar*s
c730: 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30  izeof(p->azVar[0
c740: 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ]));.    memset(
c750: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30  pParse->azVar, 0
c760: 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a  , pParse->nzVar*
c770: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
c780: 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20  zVar[0]));.  }. 
c790: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
c7a0: 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20      p->aMem--;  
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f      /* aMem[] go
c7d0: 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20  es from 1..nMem 
c7e0: 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  */.    p->nMem =
c7f0: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
c800: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20         /*       
c810: 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d  not from 0..nMem
c820: 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d  -1 */.    for(n=
c830: 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29  1; n<=nMem; n++)
c840: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b  {.      p->aMem[
c850: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  n].flags = MEM_U
c860: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 20 20  ndefined;.      
c870: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20  p->aMem[n].db = 
c880: 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  db;.    }.  }.  
c890: 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61  p->explain = pPa
c8a0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20  rse->explain;.  
c8b0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
c8c0: 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  d(p);.}../*.** C
c8d0: 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73  lose a VDBE curs
c8e0: 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  or and release a
c8f0: 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  ll the resources
c900: 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a   that cursor .**
c910: 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64   happens to hold
c920: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
c930: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
c940: 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72  Vdbe *p, VdbeCur
c950: 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28  sor *pCx){.  if(
c960: 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pCx==0 ){.    r
c970: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
c980: 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c  ite3VdbeSorterCl
c990: 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b  ose(p->db, pCx);
c9a0: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20  .  if( pCx->pBt 
c9b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
c9c0: 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42  reeClose(pCx->pB
c9d0: 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  t);.    /* The p
c9e0: 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c  Cx->pCursor will
c9f0: 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61   be close automa
ca00: 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65  tically, if it e
ca10: 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a  xists, by.    **
ca20: 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e   the call above.
ca30: 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
ca40: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pCx->pCursor ){.
ca50: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
ca60: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
ca70: 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23  >pCursor);.  }.#
ca80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ca90: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
caa0: 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62    if( pCx->pVtab
cab0: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71  Cursor ){.    sq
cac0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
cad0: 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d  r *pVtabCursor =
cae0: 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f   pCx->pVtabCurso
caf0: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  r;.    const sql
cb00: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
cb10: 64 75 6c 65 20 3d 20 70 56 74 61 62 43 75 72 73  dule = pVtabCurs
cb20: 6f 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75  or->pVtab->pModu
cb30: 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  le;.    p->inVta
cb40: 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20  bMethod = 1;.   
cb50: 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
cb60: 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20  (pVtabCursor);. 
cb70: 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68     p->inVtabMeth
cb80: 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  od = 0;.  }.#end
cb90: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  if.}../*.** Copy
cba0: 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72   the values stor
cbb0: 65 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72  ed in the VdbeFr
cbc0: 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ame structure to
cbd0: 20 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a   its Vdbe. This.
cbe0: 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20  ** is used, for 
cbf0: 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20  example, when a 
cc00: 74 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67  trigger sub-prog
cc10: 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f  ram is halted to
cc20: 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74   restore.** cont
cc30: 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20  rol to the main 
cc40: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20  program..*/.int 
cc50: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
cc60: 52 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d  Restore(VdbeFram
cc70: 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64  e *pFrame){.  Vd
cc80: 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e  be *v = pFrame->
cc90: 76 3b 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61  v;.  v->aOnceFla
cca0: 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63  g = pFrame->aOnc
ccb0: 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63  eFlag;.  v->nOnc
ccc0: 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e  eFlag = pFrame->
ccd0: 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e  nOnceFlag;.  v->
cce0: 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  aOp = pFrame->aO
ccf0: 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46  p;.  v->nOp = pF
cd00: 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e  rame->nOp;.  v->
cd10: 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61  aMem = pFrame->a
cd20: 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d  Mem;.  v->nMem =
cd30: 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20   pFrame->nMem;. 
cd40: 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61   v->apCsr = pFra
cd50: 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e  me->apCsr;.  v->
cd60: 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65  nCursor = pFrame
cd70: 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e  ->nCursor;.  v->
cd80: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
cd90: 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
cda0: 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20  d;.  v->nChange 
cdb0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67  = pFrame->nChang
cdc0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61  e;.  return pFra
cdd0: 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  me->pc;.}../*.**
cde0: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
cdf0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72  rs..**.** Also r
ce00: 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d  elease any dynam
ce10: 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  ic memory held b
ce20: 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20  y the VM in the 
ce30: 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79  Vdbe.aMem memory
ce40: 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e   .** cell array.
ce50: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
ce60: 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79  ry as the memory
ce70: 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20   cell array may 
ce80: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74  contain.** point
ce90: 65 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65  ers to VdbeFrame
cea0: 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20   objects, which 
ceb0: 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74  may in turn cont
cec0: 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a  ain pointers to.
ced0: 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  ** open cursors.
cee0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cef0: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
cf00: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
cf10: 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20  p->pFrame ){.   
cf20: 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61   VdbeFrame *pFra
cf30: 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61  me;.    for(pFra
cf40: 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46  me=p->pFrame; pF
cf50: 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70  rame->pParent; p
cf60: 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50  Frame=pFrame->pP
cf70: 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69  arent);.    sqli
cf80: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
cf90: 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 7d  ore(pFrame);.  }
cfa0: 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30  .  p->pFrame = 0
cfb0: 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20  ;.  p->nFrame = 
cfc0: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  0;..  if( p->apC
cfd0: 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
cfe0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
cff0: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
d000: 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73  {.      VdbeCurs
d010: 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
d020: 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[i];.      if( 
d030: 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pC ){.        sq
d040: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
d050: 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20  sor(p, pC);.    
d060: 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
d070: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
d080: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
d090: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65  aMem ){.    rele
d0a0: 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e  aseMemArray(&p->
d0b0: 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d  aMem[1], p->nMem
d0c0: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
d0d0: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a  p->pDelFrame ){.
d0e0: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
d0f0: 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61  Del = p->pDelFra
d100: 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46  me;.    p->pDelF
d110: 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61  rame = pDel->pPa
d120: 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rent;.    sqlite
d130: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
d140: 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (pDel);.  }..  /
d150: 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78  * Delete any aux
d160: 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  data allocations
d170: 20 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d 20   made by the VM 
d180: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
d190: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2c  DeleteAuxData(p,
d1a0: 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72   -1, 0);.  asser
d1b0: 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d  t( p->pAuxData==
d1c0: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  0 );.}../*.** Cl
d1d0: 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66  ean up the VM af
d1e0: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a  ter execution..*
d1f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d200: 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  e will automatic
d210: 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63  ally close any c
d220: 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61  ursors, lists, a
d230: 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73  nd/or.** sorters
d240: 20 74 68 61 74 20 77 65 72 65 20 6c 65 66 74 20   that were left 
d250: 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64  open.  It also d
d260: 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75 65  eletes the value
d270: 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65  s of.** variable
d280: 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20  s in the aVar[] 
d290: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
d2a0: 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64   void Cleanup(Vd
d2b0: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
d2c0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
d2d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
d2e0: 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65  BUG.  /* Execute
d2f0: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
d300: 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ents to ensure t
d310: 68 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43  hat the Vdbe.apC
d320: 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56  sr[] and .  ** V
d330: 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79  dbe.aMem[] array
d340: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
d350: 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20  een cleaned up. 
d360: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   */.  int i;.  i
d370: 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f  f( p->apCsr ) fo
d380: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
d390: 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  sor; i++) assert
d3a0: 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30  ( p->apCsr[i]==0
d3b0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65   );.  if( p->aMe
d3c0: 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  m ){.    for(i=1
d3d0: 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  ; i<=p->nMem; i+
d3e0: 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d  +) assert( p->aM
d3f0: 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d  em[i].flags==MEM
d400: 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20  _Undefined );.  
d410: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  }.#endif..  sqli
d420: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
d430: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e  >zErrMsg);.  p->
d440: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70  zErrMsg = 0;.  p
d450: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
d460: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
d470: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
d480: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  ult columns that
d490: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
d4a0: 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a  d by this SQL.**
d4b0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
d4c0: 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63   is now set at c
d4d0: 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74  ompile time, rat
d4e0: 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a  her than during.
d4f0: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
d500: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
d510: 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33   so that sqlite3
d520: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20  _column_count() 
d530: 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64  can.** be called
d540: 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65   on an SQL state
d550: 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69  ment before sqli
d560: 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76  te3_step()..*/.v
d570: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
d580: 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a  etNumCols(Vdbe *
d590: 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d  p, int nResColum
d5a0: 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  n){.  Mem *pColN
d5b0: 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ame;.  int n;.  
d5c0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
d5d0: 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d  >db;..  releaseM
d5e0: 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
d5f0: 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
d600: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
d610: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d620: 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  b, p->aColName);
d630: 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d  .  n = nResColum
d640: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70  n*COLNAME_N;.  p
d650: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28  ->nResColumn = (
d660: 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a  u16)nResColumn;.
d670: 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20    p->aColName = 
d680: 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a  pColName = (Mem*
d690: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
d6a0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
d6b0: 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20  Mem)*n );.  if( 
d6c0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29  p->aColName==0 )
d6d0: 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65   return;.  while
d6e0: 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  ( n-- > 0 ){.   
d6f0: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73   pColName->flags
d700: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
d710: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20   pColName->db = 
d720: 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e  p->db;.    pColN
d730: 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ame++;.  }.}../*
d740: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65  .** Set the name
d750: 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63   of the idx'th c
d760: 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75  olumn to be retu
d770: 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20  rned by the SQL 
d780: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e  statement..** zN
d790: 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ame must be a po
d7a0: 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74  inter to a nul t
d7b0: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
d7c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
d7d0: 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61  l must be made a
d7e0: 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
d7f0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
d800: 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Cols()..**.** Th
d810: 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
d820: 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65  r, xDel, must be
d830: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44   one of SQLITE_D
d840: 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53  YNAMIC, SQLITE_S
d850: 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49  TATIC.** or SQLI
d860: 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66  TE_TRANSIENT. If
d870: 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59   it is SQLITE_DY
d880: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20  NAMIC, then the 
d890: 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a  buffer pointed.*
d8a0: 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69  * to by zName wi
d8b0: 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73  ll be freed by s
d8c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77  qlite3DbFree() w
d8d0: 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20  hen the vdbe is 
d8e0: 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e  destroyed..*/.in
d8f0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  t sqlite3VdbeSet
d900: 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20  ColName(.  Vdbe 
d910: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
d920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
d930: 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67  dbe being config
d940: 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ured */.  int id
d950: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
d960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
d970: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e  dex of column zN
d980: 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a  ame applies to *
d990: 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20  /.  int var,    
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9b0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
d9c0: 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e  he COLNAME_* con
d9d0: 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  stants */.  cons
d9e0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da00: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
da10: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d  r containing nam
da20: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  e */.  void (*xD
da30: 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20  el)(void*)      
da40: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
da50: 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72  y management str
da60: 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20  ategy for zName 
da70: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
da80: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
da90: 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70  .  assert( idx<p
daa0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a  ->nResColumn );.
dab0: 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f    assert( var<CO
dac0: 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28  LNAME_N );.  if(
dad0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
dae0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65  iled ){.    asse
daf0: 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44  rt( !zName || xD
db00: 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d  el!=SQLITE_DYNAM
db10: 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  IC );.    return
db20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
db30: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
db40: 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  aColName!=0 );. 
db50: 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d   pColName = &(p-
db60: 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61  >aColName[idx+va
db70: 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d  r*p->nResColumn]
db80: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
db90: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
dba0: 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ColName, zName, 
dbb0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
dbc0: 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74   xDel);.  assert
dbd0: 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d  ( rc!=0 || !zNam
dbe0: 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e  e || (pColName->
dbf0: 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21  flags&MEM_Term)!
dc00: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
dc10: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65  c;.}../*.** A re
dc20: 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
dc30: 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d  saction may or m
dc40: 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65  ay not be active
dc50: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
dc60: 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20  dle.** db. If a 
dc70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
dc80: 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74  ctive, commit it
dc90: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a  . If there is a.
dca0: 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
dcb0: 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f  tion spanning mo
dcc0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
dcd0: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
dce0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73  routine.** takes
dcf0: 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73   care of the mas
dd00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63  ter journal tric
dd10: 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  kery..*/.static 
dd20: 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73  int vdbeCommit(s
dd30: 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
dd40: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
dd50: 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b   int nTrans = 0;
dd60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64    /* Number of d
dd70: 61 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e  atabases with an
dd80: 20 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72   active write-tr
dd90: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  ansaction */.  i
dda0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ddb0: 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f  K;.  int needXco
ddc0: 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65  mmit = 0;..#ifde
ddd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
dde0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
ddf0: 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e  With this option
de00: 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  , sqlite3VtabSyn
de10: 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74  c() is defined t
de20: 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a  o be simply .  *
de30: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70  * SQLITE_OK so p
de40: 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20   is not used. . 
de50: 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
de60: 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69  AMETER(p);.#endi
de70: 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  f..  /* Before d
de80: 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
de90: 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79  se, call the xSy
dea0: 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f  nc() callback fo
deb0: 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75  r any.  ** virtu
dec0: 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73  al module tables
ded0: 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73   written in this
dee0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
def0: 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62  is has to.  ** b
df00: 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65  e done before de
df10: 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65  termining whethe
df20: 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  r a master journ
df30: 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a  al file is .  **
df40: 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e   required, as an
df50: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
df60: 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74  k may add an att
df70: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20  ached database. 
df80: 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73   ** to the trans
df90: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
dfa0: 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
dfb0: 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f  ync(db, p);..  /
dfc0: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65  * This loop dete
dfd0: 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68  rmines (a) if th
dfe0: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68  e commit hook sh
dff0: 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20  ould be invoked 
e000: 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77  and.  ** (b) how
e010: 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66   many database f
e020: 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77  iles have open w
e030: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
e040: 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63  s, not .  ** inc
e050: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20  luding the temp 
e060: 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73  database. (b) is
e070: 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75   important becau
e080: 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20  se if more than 
e090: 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61  .  ** one databa
e0a0: 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f  se file has an o
e0b0: 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
e0c0: 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20  ction, a master 
e0d0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
e0e0: 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
e0f0: 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d  r an atomic comm
e100: 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  it..  */ .  for(
e110: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
e120: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
e130: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65   i++){ .    Btre
e140: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
e150: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
e160: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
e170: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
e180: 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74       needXcommit
e190: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
e1a0: 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b  i!=1 ) nTrans++;
e1b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
e1c0: 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20  reeEnter(pBt);. 
e1d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e1e0: 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
e1f0: 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65  ock(sqlite3Btree
e200: 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20  Pager(pBt));.   
e210: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
e220: 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d  eave(pBt);.    }
e230: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
e240: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e250: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
e260: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
e270: 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e  e any write-tran
e280: 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c  sactions at all,
e290: 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d   invoke the comm
e2a0: 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28  it hook */.  if(
e2b0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20   needXcommit && 
e2c0: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
e2d0: 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ack ){.    rc = 
e2e0: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
e2f0: 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ack(db->pCommitA
e300: 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rg);.    if( rc 
e310: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
e320: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
e330: 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20  T_COMMITHOOK;.  
e340: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
e350: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20  e simple case - 
e360: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
e370: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
e380: 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
e390: 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  .  ** TEMP datab
e3a0: 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73  ase) has a trans
e3b0: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20  action active.  
e3c0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
e3d0: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  d for the.  ** m
e3e0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  aster-journal.. 
e3f0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
e400: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
e410: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
e420: 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a  ilename() is a z
e430: 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20  ero length.  ** 
e440: 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73  string, it means
e450: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
e460: 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f  se is :memory: o
e470: 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20  r a temp file.  
e480: 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61  In .  ** that ca
e490: 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  se we do not sup
e4a0: 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74  port atomic mult
e4b0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20  i-file commits, 
e4c0: 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  so use the .  **
e4d0: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65   simple case the
e4e0: 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  n too..  */.  if
e4f0: 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  ( 0==sqlite3Strl
e500: 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65  en30(sqlite3Btre
e510: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
e520: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20  >aDb[0].pBt)).  
e530: 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20   || nTrans<=1.  
e540: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
e550: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e560: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
e570: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
e580: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
e590: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
e5a0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
e5b0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
e5c0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
e5d0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
e5e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
e5f0: 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20  the commit only 
e600: 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  if all databases
e610: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
e620: 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20  mplete phase 1. 
e630: 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f  .    ** If one o
e640: 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69  f the BtreeCommi
e650: 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
e660: 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e  s fails, this in
e670: 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a  dicates an.    *
e680: 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65  * IO error while
e690: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
e6a0: 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61  ncating a journa
e6b0: 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e  l file. It is un
e6c0: 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62  likely,.    ** b
e6d0: 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e  ut could happen.
e6e0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62   In this case ab
e6f0: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
e700: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
e710: 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
e720: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
e730: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
e740: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
e750: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
e760: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
e770: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
e780: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
e790: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
e7a0: 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29  PhaseTwo(pBt, 0)
e7b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e7c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e7d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
e7e0: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
e7f0: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
e800: 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
e810: 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
e820: 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
e830: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
e840: 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
e850: 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
e860: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
e870: 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
e880: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
e890: 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
e8a0: 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  omicly..  */.#if
e8b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e8c0: 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
e8d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
e8e0: 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73  *pVfs = db->pVfs
e8f0: 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
e900: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  nc = 0;.    char
e910: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
e920: 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
e930: 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
e940: 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
e950: 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
e960: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
e970: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
e980: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
e990: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
e9a0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
e9b0: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
e9c0: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
e9d0: 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20   int retryCount 
e9e0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
e9f0: 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20  inFile;..    /* 
ea00: 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20  Select a master 
ea10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
ea20: 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69  e */.    nMainFi
ea30: 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  le = sqlite3Strl
ea40: 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b  en30(zMainFile);
ea50: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73  .    zMaster = s
ea60: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
ea70: 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58  , "%s-mjXXXXXX9X
ea80: 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b  Xz", zMainFile);
ea90: 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72  .    if( zMaster
eaa0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
eab0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64  ITE_NOMEM;.    d
eac0: 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52  o {.      u32 iR
ead0: 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28  andom;.      if(
eae0: 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20   retryCount ){. 
eaf0: 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79         if( retry
eb00: 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20  Count>100 ){.   
eb10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
eb20: 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  og(SQLITE_FULL, 
eb30: 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c  "MJ delete: %s",
eb40: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
eb50: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
eb60: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
eb70: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
eb80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
eb90: 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79   }else if( retry
eba0: 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  Count==1 ){.    
ebb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
ebc0: 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
ebd0: 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c  MJ collide: %s",
ebe0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
ebf0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ec00: 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b     retryCount++;
ec10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
ec20: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
ec30: 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e  (iRandom), &iRan
ec40: 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dom);.      sqli
ec50: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c  te3_snprintf(13,
ec60: 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46   &zMaster[nMainF
ec70: 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25  ile], "-mj%06X9%
ec80: 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20  02X",.          
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eca0: 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38       (iRandom>>8
ecb0: 29 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e  )&0xffffff, iRan
ecc0: 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20  dom&0xff);.     
ecd0: 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75   /* The antipenu
ece0: 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65  ltimate characte
ecf0: 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  r of the master 
ed00: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
ed10: 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39  t.      ** be "9
ed20: 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20  " to avoid name 
ed30: 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20  collisions when 
ed40: 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61  using 8+3 filena
ed50: 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  mes. */.      as
ed60: 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71  sert( zMaster[sq
ed70: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
ed80: 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29  aster)-3]=='9' )
ed90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
eda0: 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e  ileSuffix3(zMain
edb0: 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  File, zMaster);.
edc0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
edd0: 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
ede0: 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
edf0: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
ee00: 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c  &res);.    }whil
ee10: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
ee20: 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69   && res );.    i
ee30: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ee40: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65   ){.      /* Ope
ee50: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
ee60: 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rnal. */.      r
ee70: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
ee80: 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d  nMalloc(pVfs, zM
ee90: 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c  aster, &pMaster,
eea0: 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
eeb0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
eec0: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
eed0: 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20  EATE|.          
eee0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
eef0: 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45  USIVE|SQLITE_OPE
ef00: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
ef10: 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
ef20: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
ef30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ef40: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
ef50: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
ef60: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
ef70: 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72     }. .    /* Wr
ef80: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
ef90: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
efa0: 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  le in the transa
efb0: 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e  ction into the n
efc0: 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  ew.    ** master
efd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
efe0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
eff0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
f000: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  close.    ** and
f010: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
f020: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
f030: 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64   All the individ
f040: 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
f050: 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68  s.    ** still h
f060: 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68  ave 'null' as th
f070: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
f080: 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65   pointer, so the
f090: 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20  y will roll.    
f0a0: 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
f0b0: 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75  ently if a failu
f0c0: 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  re occurs..    *
f0d0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
f0e0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
f0f0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
f100: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
f110: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
f120: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
f130: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
f140: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
f150: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
f160: 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
f170: 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
f180: 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a  if( zFile==0 ){.
f190: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
f1a0: 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54  ue;  /* Ignore T
f1b0: 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a  EMP and :memory:
f1c0: 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
f1d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f1e0: 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d  assert( zFile[0]
f1f0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
f200: 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20  f( !needSync && 
f210: 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e  !sqlite3BtreeSyn
f220: 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29  cDisabled(pBt) )
f230: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
f240: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
f250: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
f260: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
f270: 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20  pMaster, zFile, 
f280: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
f290: 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74  zFile)+1, offset
f2a0: 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  );.        offse
f2b0: 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  t += sqlite3Strl
f2c0: 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20  en30(zFile)+1;. 
f2d0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
f2e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
f300: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
f310: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
f320: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
f330: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
f340: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f350: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
f360: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
f370: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
f380: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f390: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
f3a0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f3b0: 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
f3c0: 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
f3d0: 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66   device.    ** f
f3e0: 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20  lag is set this 
f3f0: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
f400: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
f410: 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26  needSync .     &
f420: 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44  & 0==(sqlite3OsD
f430: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
f440: 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51  tics(pMaster)&SQ
f450: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
f460: 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53  NTIAL).     && S
f470: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
f480: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d  sqlite3OsSync(pM
f490: 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59  aster, SQLITE_SY
f4a0: 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20  NC_NORMAL)).    
f4b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f4c0: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
f4d0: 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
f4e0: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
f4f0: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
f500: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
f510: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
f520: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f530: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
f540: 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20  Sync all the db 
f550: 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  files involved i
f560: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
f570: 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c  n. The same call
f580: 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65  .    ** sets the
f590: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f5a0: 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20  pointer in each 
f5b0: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
f5c0: 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e  al. If.    ** an
f5d0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65   error occurs he
f5e0: 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  re, do not delet
f5f0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
f600: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
f610: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
f620: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
f630: 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61  ing the first ca
f640: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
f650: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
f660: 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20  haseOne(), then 
f670: 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
f680: 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
f690: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
f6a0: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72   file will be or
f6b0: 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63  phaned. But we c
f6c0: 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c  annot delete it,
f6d0: 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
f6e0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f6f0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73  al file name was
f700: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
f710: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
f720: 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
f730: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
f740: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
f750: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
f760: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
f770: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
f780: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
f790: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
f7a0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
f7b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f7c0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
f7d0: 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74  seOne(pBt, zMast
f7e0: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
f7f0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73   }.    sqlite3Os
f800: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
f810: 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
f820: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
f830: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
f840: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f850: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
f860: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
f870: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f880: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c     }..    /* Del
f890: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
f8a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
f8b0: 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72  s commits the tr
f8c0: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72  ansaction. After
f8d0: 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68  .    ** doing th
f8e0: 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  is the directory
f8f0: 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e   is synced again
f900: 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69   before any indi
f910: 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72  vidual.    ** tr
f920: 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20  ansaction files 
f930: 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  are deleted..   
f940: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
f950: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
f960: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a  s, zMaster, 1);.
f970: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
f980: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
f990: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
f9a0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
f9b0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
f9c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
f9d0: 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
f9e0: 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
f9f0: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
fa00: 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
fa10: 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
fa20: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
fa30: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
fa40: 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
fa50: 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
fa60: 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
fa70: 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
fa80: 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
fa90: 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
faa0: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
fab0: 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
fac0: 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
fad0: 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
fae0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
faf0: 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
fb00: 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
fb10: 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
fb20: 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
fb30: 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
fb40: 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
fb50: 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
fb60: 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
fb70: 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
fb80: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
fb90: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
fba0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
fbb0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
fbc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
fbd0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
fbe0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
fbf0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
fc00: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
fc10: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
fc20: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
fc30: 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20  seTwo(pBt, 1);. 
fc40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
fc50: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
fc60: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65  nMalloc();.    e
fc70: 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
fc80: 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20  io_errors();..  
fc90: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
fca0: 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  mit(db);.  }.#en
fcb0: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
fcc0: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
fcd0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
fce0: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
fcf0: 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f 75  .nVdbeActive cou
fd00: 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  nt variable.** m
fd10: 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
fd20: 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74  r of vdbe's in t
fd30: 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  he list sqlite3.
fd40: 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a  pVdbe that are.*
fd50: 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  * currently acti
fd60: 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  ve. An assertion
fd70: 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77   fails if the tw
fd80: 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20  o counts do not 
fd90: 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69  match..** This i
fda0: 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65  s an internal se
fdb0: 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20  lf-check only - 
fdc0: 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73  it is not an ess
fdd0: 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  ential processin
fde0: 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a  g.** step..**.**
fdf0: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
fe00: 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65   if NDEBUG is de
fe10: 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  fined..*/.#ifnde
fe20: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
fe30: 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65  void checkActive
fe40: 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20  VdbeCnt(sqlite3 
fe50: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
fe60: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
fe70: 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
fe80: 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20  ;.  int nRead = 
fe90: 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
fea0: 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
feb0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
fec0: 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c  3_stmt_busy((sql
fed0: 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b  ite3_stmt*)p) ){
fee0: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
fef0: 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f      if( p->readO
ff00: 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b  nly==0 ) nWrite+
ff10: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
ff20: 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65 61  bIsReader ) nRea
ff30: 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  d++;.    }.    p
ff40: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
ff50: 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
ff60: 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
ff70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72  );.  assert( nWr
ff80: 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72  ite==db->nVdbeWr
ff90: 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ite );.  assert(
ffa0: 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62   nRead==db->nVdb
ffb0: 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65  eRead );.}.#else
ffc0: 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63  .#define checkAc
ffd0: 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23  tiveVdbeCnt(x).#
ffe0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
fff0: 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
10000 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
10010 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73  ument opened a s
10020 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
10030 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69  tion,.** close i
10040 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20  t now. Argument 
10050 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74 68  eOp must be eith
10060 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
10070 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45  LBACK or.** SAVE
10080 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49  POINT_RELEASE. I
10090 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
100a0 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
100b0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
100c0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
100d0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66   rolled back. If
100e0 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e   eOp is SAVEPOIN
100f0 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
10100 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  the .** statemen
10110 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
10120 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
10130 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
10140 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49   occurs, an SQLI
10150 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
10160 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
10170 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
10180 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
10190 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
101a0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56  CloseStatement(V
101b0 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29  dbe *p, int eOp)
101c0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e  {.  sqlite3 *con
101d0 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  st db = p->db;. 
101e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
101f0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d  _OK;..  /* If p-
10200 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67  >iStatement is g
10210 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
10220 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64 62 65  , then this Vdbe
10230 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20   opened a .  ** 
10240 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
10250 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c  ction that shoul
10260 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65  d be closed here
10270 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70  . The only excep
10280 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61  tion.  ** is tha
10290 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61  t an IO error ma
102a0 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2c  y have occurred,
102b0 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72   causing an emer
102c0 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a  gency rollback..
102d0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
102e0 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  e (db->nStatemen
102f0 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65  t==0), and there
10300 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64   is nothing to d
10310 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  o..  */.  if( db
10320 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20  ->nStatement && 
10330 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b  p->iStatement ){
10340 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
10350 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70  const int iSavep
10360 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65  oint = p->iState
10370 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73  ment-1;..    ass
10380 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f  ert( eOp==SAVEPO
10390 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20  INT_ROLLBACK || 
103a0 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
103b0 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73  ELEASE);.    ass
103c0 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d  ert( db->nStatem
103d0 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ent>0 );.    ass
103e0 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65  ert( p->iStateme
103f0 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d  nt==(db->nStatem
10400 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69  ent+db->nSavepoi
10410 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nt) );..    for(
10420 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
10430 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74  i++){ .      int
10440 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
10450 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  ;.      Btree *p
10460 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
10470 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
10480 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  Bt ){.        if
10490 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
104a0 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
104b0 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
104c0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
104d0 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
104e0 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76  T_ROLLBACK, iSav
104f0 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
10500 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
10510 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2==SQLITE_OK ){
10520 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d  .          rc2 =
10530 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
10540 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
10550 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
10560 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
10570 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
10580 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
105a0 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d  = rc2;.        }
105b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
105c0 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
105d0 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61  t--;.    p->iSta
105e0 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20  tement = 0;..   
105f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10600 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
10610 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
10620 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
10630 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
10640 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c  tabSavepoint(db,
10650 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
10660 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
10670 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10680 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10690 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
106a0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
106b0 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
106c0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
106d0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
106e0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
106f0 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
10700 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
10710 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
10720 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65  ck, also restore
10730 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
10740 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65  abase handles de
10750 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
10760 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65  t counter to the
10770 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68   value it had wh
10780 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  en .    ** the s
10790 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
107a0 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
107b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70    */.    if( eOp
107c0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
107d0 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62  BACK ){.      db
107e0 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
107f0 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e  = p->nStmtDefCon
10800 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65  s;.      db->nDe
10810 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
10820 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f  p->nStmtDefImmCo
10830 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ns;.    }.  }.  
10840 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10850 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
10860 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
10870 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
10880 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61 74  pened by the dat
10890 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65  abase .** handle
108a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
108b0 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
108c0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  s an argument is
108d0 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a   about to be .**
108e0 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74   committed. If t
108f0 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
10900 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f  ding deferred fo
10910 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
10920 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f  aint.** violatio
10930 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ns, return SQLIT
10940 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69  E_ERROR. Otherwi
10950 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
10960 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
10970 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b  e outstanding FK
10980 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20   violations and 
10990 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
109a0 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
109b0 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20  _ERROR, set the 
109c0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d  result of the VM
109d0 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   to SQLITE_CONST
109e0 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
109f0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e  .** and write an
10a00 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
10a10 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72  o it. Then retur
10a20 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
10a30 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
10a40 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
10a50 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  EY.int sqlite3Vd
10a60 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a  beCheckFk(Vdbe *
10a70 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64 29  p, int deferred)
10a80 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
10a90 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  = p->db;.  if( (
10aa0 64 65 66 65 72 72 65 64 20 26 26 20 28 64 62 2d  deferred && (db-
10ab0 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64  >nDeferredCons+d
10ac0 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
10ad0 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28  ons)>0) .   || (
10ae0 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e  !deferred && p->
10af0 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29  nFkConstraint>0)
10b00 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63   .  ){.    p->rc
10b10 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
10b20 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b  AINT_FOREIGNKEY;
10b30 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  .    p->errorAct
10b40 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
10b50 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
10b60 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
10b70 2c 20 64 62 2c 20 22 46 4f 52 45 49 47 4e 20 4b  , db, "FOREIGN K
10b80 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
10b90 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  iled");.    retu
10ba0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
10bb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
10bc0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
10bd0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
10be0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
10bf0 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20  the when a VDBE 
10c00 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20  tries to halt.  
10c10 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68  If the VDBE.** h
10c20 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20  as made changes 
10c30 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  and is in autoco
10c40 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20  mmit mode, then 
10c50 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20  commit those.** 
10c60 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72  changes.  If a r
10c70 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65  ollback is neede
10c80 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72  d, then do the r
10c90 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
10ca0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
10cb0 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
10cc0 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ove the state of
10cd0 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51   a VM from.** SQ
10ce0 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74  LITE_MAGIC_RUN t
10cf0 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  o SQLITE_MAGIC_H
10d00 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d  ALT.  It is harm
10d10 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20  less to.** call 
10d20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61  this on a VM tha
10d30 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49  t is in the SQLI
10d40 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74  TE_MAGIC_HALT st
10d50 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
10d60 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
10d70 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
10d80 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  could not comple
10d90 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a  te because of.**
10da0 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
10db0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
10dc0 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45  BUSY.  If SQLITE
10dd0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
10de0 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  d, it.** means t
10df0 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74  he close did not
10e00 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64   happen and need
10e10 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64  s to be repeated
10e20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10e30 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70  VdbeHalt(Vdbe *p
10e40 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e60 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
10e70 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20  store transient 
10e80 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a  return codes */.
10e90 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
10ea0 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69  p->db;..  /* Thi
10eb0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61  s function conta
10ec0 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68  ins the logic th
10ed0 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  at determines if
10ee0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a   a statement or.
10ef0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
10f00 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74   will be committ
10f10 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
10f20 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  k as a result of
10f30 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74   the.  ** execut
10f40 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74  ion of this virt
10f50 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20  ual machine. .  
10f60 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f  **.  ** If any o
10f70 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
10f80 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20  errors occur:.  
10f90 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  **.  **     SQLI
10fa0 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20  TE_NOMEM.  **   
10fb0 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20    SQLITE_IOERR. 
10fc0 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46   **     SQLITE_F
10fd0 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ULL.  **     SQL
10fe0 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20  ITE_INTERRUPT.  
10ff0 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  **.  ** Then the
11000 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20   internal cache 
11010 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
11020 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
11030 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61  sistent.  ** sta
11040 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  te.  We need to 
11050 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61  rollback the sta
11060 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
11070 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a  on, if there is.
11080 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65    ** one, or the
11090 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61   complete transa
110a0 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69  ction if there i
110b0 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  s no statement t
110c0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
110d0 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ..  if( p->db->m
110e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
110f0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
11100 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
11110 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20  f( p->aOnceFlag 
11120 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63  ) memset(p->aOnc
11130 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e  eFlag, 0, p->nOn
11140 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65  ceFlag);.  close
11150 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
11160 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
11170 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
11180 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11190 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65  TE_OK;.  }.  che
111a0 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
111b0 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f  db);..  /* No co
111c0 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
111d0 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70   needed if the p
111e0 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61  rogram never sta
111f0 72 74 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20  rted or if the. 
11200 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
11210 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20  t does not read 
11220 6f 72 20 77 72 69 74 65 20 61 20 64 61 74 61 62  or write a datab
11230 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20  ase file.  */.  
11240 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20  if( p->pc>=0 && 
11250 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a  p->bIsReader ){.
11260 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f      int mrc;   /
11270 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20  * Primary error 
11280 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20  code from p->rc 
11290 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74  */.    int eStat
112a0 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20  ementOp = 0;.   
112b0 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72   int isSpecialEr
112c0 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ror;            
112d0 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
112e0 66 20 61 20 27 73 70 65 63 69 61 6c 27 20 65 72  f a 'special' er
112f0 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c  ror */..    /* L
11300 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75  ock all btrees u
11310 73 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65  sed by the state
11320 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ment */.    sqli
11330 74 65 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b  te3VdbeEnter(p);
11340 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
11350 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  or one of the sp
11360 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a  ecial errors */.
11370 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20      mrc = p->rc 
11380 26 20 30 78 66 66 3b 0a 20 20 20 20 61 73 73 65  & 0xff;.    asse
11390 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
113a0 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
113b0 29 3b 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f  );  /* This erro
113c0 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 65 78 69 73  r no longer exis
113d0 74 73 20 2a 2f 0a 20 20 20 20 69 73 53 70 65 63  ts */.    isSpec
113e0 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d  ialError = mrc==
113f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
11400 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  mrc==SQLITE_IOER
11410 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R.              
11420 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53         || mrc==S
11430 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
11440 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
11450 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53  ULL;.    if( isS
11460 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20  pecialError ){. 
11470 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
11480 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
11490 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ly and the error
114a0 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
114b0 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20  INTERRUPT, .    
114c0 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b    ** no rollback
114d0 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f   is necessary. O
114e0 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61  therwise, at lea
114f0 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a  st a savepoint .
11500 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
11510 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c  tion must be rol
11520 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74  led back to rest
11530 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
11540 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20   to a .      ** 
11550 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
11560 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
11570 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20   ** Even if the 
11580 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61  statement is rea
11590 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d  d-only, it is im
115a0 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f  portant to perfo
115b0 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74  rm.      ** a st
115c0 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73  atement or trans
115d0 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
115e0 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68  operation. If th
115f0 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a  e error .      *
11600 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  * occurred while
11610 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
11620 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
11630 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
11640 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
11650 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
11660 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
11670 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
11680 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
11690 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
116a0 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
116b0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
116c0 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
116d0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
116e0 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
116f0 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
11700 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
11710 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  p->readOnly || m
11720 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
11730 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
11740 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
11750 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
11760 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70  QLITE_FULL) && p
11770 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
11780 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  l ){.          e
11790 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
117a0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
117b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
117c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
117d0 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
117e0 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
117f0 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
11800 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
11810 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
11820 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
11830 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
11840 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
11850 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
11860 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
11870 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
11880 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
11890 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
118a0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
118b0 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
118c0 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
118d0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
118e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
118f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
11900 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
11910 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
11920 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73  n key violations
11930 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
11940 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11950 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11960 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b  beCheckFk(p, 0);
11970 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
11980 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
11990 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
119a0 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
119b0 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74  only active writ
119c0 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74  er .    ** VM, t
119d0 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72  hen we do either
119e0 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
119f0 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
11a00 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
11a10 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
11a20 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
11a30 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
11a40 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
11a50 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
11a60 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
11a70 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20  as occurred. .  
11a80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71    */.    if( !sq
11a90 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28  lite3VtabInSync(
11aa0 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d  db) .     && db-
11ab0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20  >autoCommit .   
11ac0 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72    && db->nVdbeWr
11ad0 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c  ite==(p->readOnl
11ae0 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  y==0) .    ){.  
11af0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
11b00 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
11b10 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
11b20 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
11b30 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
11b40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11b50 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31  VdbeCheckFk(p, 1
11b60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
11b70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11b80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
11b90 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29  VER(p->readOnly)
11ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
11bb0 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
11bc0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
11bd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
11be0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
11bf0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
11c00 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
11c10 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
11c20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20         }else{ . 
11c30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11c40 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
11c50 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64   is true, the vd
11c60 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73  be program was s
11c70 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20  uccessful .     
11c80 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61       ** or hit a
11c90 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73  n 'OR FAIL' cons
11ca0 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65  traint and there
11cb0 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64   are no deferred
11cc0 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20   foreign.       
11cd0 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72     ** key constr
11ce0 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70  aints to hold up
11cf0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
11d00 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
11d10 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20  ommit .         
11d20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
11d30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
11d40 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
11d50 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , p);.        }.
11d60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
11d70 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
11d80 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
11d90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11da0 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
11db0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
11dc0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
11dd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
11de0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11df0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
11e00 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
11e10 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
11e20 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
11e30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
11e40 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44            db->nD
11e50 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b  eferredCons = 0;
11e60 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
11e70 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
11e80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
11e90 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
11ea0 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20  ITE_DeferFKs;.  
11eb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
11ec0 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
11ed0 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  nges(db);.      
11ee0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
11ef0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11f00 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
11f10 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20  SQLITE_OK);.    
11f20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53    }.      db->nS
11f30 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
11f40 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61    }else if( eSta
11f50 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20  tementOp==0 ){. 
11f60 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
11f70 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
11f80 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
11f90 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Fail ){.        
11fa0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
11fb0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
11fc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11fd0 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
11fe0 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
11ff0 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
12000 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
12010 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d  OLLBACK;.      }
12020 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
12030 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
12040 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
12050 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
12060 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
12070 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
12080 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
12090 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
120a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
120b0 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65    /* If eStateme
120c0 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ntOp is non-zero
120d0 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65  , then a stateme
120e0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e  nt transaction n
120f0 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
12100 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
12110 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c  olled back. Call
12120 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
12130 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a  eStatement() to.
12140 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66      ** do so. If
12150 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
12160 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
12170 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
12180 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  t statement.    
12190 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
121a0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51   SQLITE_OK or SQ
121b0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
121c0 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68   then promote th
121d0 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
121e0 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72   statement error
121f0 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   code..    */.  
12200 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
12210 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  Op ){.      rc =
12220 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
12230 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53  eStatement(p, eS
12240 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20  tatementOp);.   
12250 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
12260 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
12270 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
12280 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  >rc&0xff)==SQLIT
12290 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a  E_CONSTRAINT ){.
122a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
122b0 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
122c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
122d0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
122e0 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72           p->zErr
122f0 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Msg = 0;.       
12300 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
12310 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
12320 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
12330 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
12340 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
12350 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
12360 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
12370 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
12380 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
12390 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
123a0 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
123b0 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f  or DELETE and no
123c0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
123d0 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61  action.    ** ha
123e0 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  s been rolled ba
123f0 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64  ck, update the d
12400 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12410 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  on change-counte
12420 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  r. .    */.    i
12430 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  f( p->changeCntO
12440 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  n ){.      if( e
12450 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56  StatementOp!=SAV
12460 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
12470 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12480 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
12490 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
124a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
124b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
124c0 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
124d0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
124e0 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
124f0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
12500 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
12510 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ks */.    sqlite
12520 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
12530 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65   }..  /* We have
12540 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61   successfully ha
12550 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20  lted and closed 
12560 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20  the VM.  Record 
12570 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
12580 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
12590 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63 74      db->nVdbeAct
125a0 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21  ive--;.    if( !
125b0 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64 62  p->readOnly ) db
125c0 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a  ->nVdbeWrite--;.
125d0 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65      if( p->bIsRe
125e0 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62 65  ader ) db->nVdbe
125f0 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65  Read--;.    asse
12600 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
12610 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65  ive>=db->nVdbeRe
12620 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ad );.    assert
12630 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  ( db->nVdbeRead>
12640 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20  =db->nVdbeWrite 
12650 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
12660 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d 30  b->nVdbeWrite>=0
12670 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67   );.  }.  p->mag
12680 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
12690 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74  HALT;.  checkAct
126a0 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
126b0 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
126c0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
126d0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
126e0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
126f0 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
12700 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
12710 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  to true, then an
12720 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72  y locks that wer
12730 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63  e held.  ** by c
12740 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76  onnection db hav
12750 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61  e now been relea
12760 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  sed. Call sqlite
12770 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
12780 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69  ked() .  ** to i
12790 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72  nvoke any requir
127a0 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  ed unlock-notify
127b0 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f   callbacks..  */
127c0 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43  .  if( db->autoC
127d0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  ommit ){.    sql
127e0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
127f0 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a  locked(db);.  }.
12800 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e  .  assert( db->n
12810 56 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20  VdbeActive>0 || 
12820 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
12830 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d  0 || db->nStatem
12840 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ent==0 );.  retu
12850 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rn (p->rc==SQLIT
12860 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f  E_BUSY ? SQLITE_
12870 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  BUSY : SQLITE_OK
12880 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  );.}.../*.** Eac
12890 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65  h VDBE holds the
128a0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d   result of the m
128b0 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
128c0 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a  e3_step() call.*
128d0 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69  * in p->rc.  Thi
128e0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
128f0 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20  hat result back 
12900 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  to SQLITE_OK..*/
12910 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
12920 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74  eResetStepResult
12930 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
12940 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12950 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
12960 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
12970 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62   error message b
12980 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
12990 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61  VDBE passed.** a
129a0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
129b0 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61  ment to its data
129c0 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20  base handle (so 
129d0 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62  that they will b
129e0 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62  e .** returned b
129f0 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  y calls to sqlit
12a00 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64  e3_errcode() and
12a10 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
12a20 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ))..**.** This f
12a30 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
12a40 20 63 6c 65 61 72 20 74 68 65 20 56 44 42 45 20   clear the VDBE 
12a50 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65  error code or me
12a60 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63  ssage, just.** c
12a70 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68  opies them to th
12a80 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
12a90 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
12aa0 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72  3VdbeTransferErr
12ab0 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  or(Vdbe *p){.  s
12ac0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
12ad0 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  db;.  int rc = p
12ae0 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a  ->rc;.  if( p->z
12af0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 38  ErrMsg ){.    u8
12b00 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20   mallocFailed = 
12b10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12b20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
12b30 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
12b40 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45  ;.    if( db->pE
12b50 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72  rr==0 ) db->pErr
12b60 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
12b70 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ew(db);.    sqli
12b80 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
12b90 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e  b->pErr, -1, p->
12ba0 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f  zErrMsg, SQLITE_
12bb0 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41  UTF8, SQLITE_TRA
12bc0 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
12bd0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
12be0 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d  loc();.    db->m
12bf0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61  allocFailed = ma
12c00 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20  llocFailed;.    
12c10 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  db->errCode = rc
12c20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
12c30 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
12c40 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  rc, 0);.  }.  re
12c50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
12c60 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
12c70 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66  _SQLLOG./*.** If
12c80 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   an SQLITE_CONFI
12c90 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73  G_SQLLOG hook is
12ca0 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 20   registered and 
12cb0 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
12cc0 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20  run, .** invoke 
12cd0 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
12ce0 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  id vdbeInvokeSql
12cf0 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  log(Vdbe *v){.  
12d00 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
12d10 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
12d20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && v->rc==SQLITE
12d30 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26  _OK && v->zSql &
12d40 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & v->pc>=0 ){.  
12d50 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65    char *zExpande
12d60 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45  d = sqlite3VdbeE
12d70 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a  xpandSql(v, v->z
12d80 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Sql);.    assert
12d90 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  ( v->db->init.bu
12da0 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  sy==0 );.    if(
12db0 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20   zExpanded ){.  
12dc0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
12dd0 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
12de0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12df0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
12e00 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62  SqllogArg, v->db
12e10 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20  , zExpanded, 1. 
12e20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
12e30 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
12e40 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20  b, zExpanded);. 
12e50 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
12e60 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e  .# define vdbeIn
12e70 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65  vokeSqllog(x).#e
12e80 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ndif../*.** Clea
12e90 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65  n up a VDBE afte
12ea0 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
12eb0 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
12ec0 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e  e VDBE just yet.
12ed0 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72  .** Write any er
12ee0 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74  ror messages int
12ef0 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65  o *pzErrMsg.  Re
12f00 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
12f10 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  code..**.** Afte
12f20 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
12f30 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20  s run, the VDBE 
12f40 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20  should be ready 
12f50 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a  to be executed.*
12f60 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  * again..**.** T
12f70 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f  o look at it ano
12f80 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72  ther way, this r
12f90 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68  outine resets th
12fa0 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a  e state of the.*
12fb0 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
12fc0 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  e from VDBE_MAGI
12fd0 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41  C_RUN or VDBE_MA
12fe0 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f  GIC_HALT back to
12ff0 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  .** VDBE_MAGIC_I
13000 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NIT..*/.int sqli
13010 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62  te3VdbeReset(Vdb
13020 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
13030 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   *db;.  db = p->
13040 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  db;..  /* If the
13050 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20   VM did not run 
13060 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72  to completion or
13070 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
13080 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72  ed an.  ** error
13090 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
130a0 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61  not have been ha
130b0 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20  lted properly.  
130c0 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20  So halt.  ** it 
130d0 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  now..  */.  sqli
130e0 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a  te3VdbeHalt(p);.
130f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42  .  /* If the VDB
13100 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65  E has be run eve
13110 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65  n partially, the
13120 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65  n transfer the e
13130 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
13140 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
13150 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69   from the VDBE i
13160 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
13170 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
13180 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68    But.  ** if th
13190 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20  e VDBE has just 
131a0 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20  been set to run 
131b0 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75  but has not actu
131c0 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e  ally executed an
131d0 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69  y.  ** instructi
131e0 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74  ons yet, leave t
131f0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
13200 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   error informati
13210 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  on unchanged..  
13220 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
13230 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76  0 ){.    vdbeInv
13240 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20  okeSqllog(p);.  
13250 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
13260 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20  nsferError(p);. 
13270 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13280 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
13290 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
132a0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
132b0 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70  >runOnlyOnce ) p
132c0 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
132d0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
132e0 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
132f0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
13300 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
13310 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
13320 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
13330 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
13340 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
13350 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
13360 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
13370 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
13380 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
13390 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
133a0 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
133b0 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
133c0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
133d0 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d   p->rc, p->zErrM
133e0 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 70  sg ? "%s" : 0, p
133f0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
13400 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
13410 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
13420 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
13430 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63  0;.  }..  /* Rec
13440 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  laim all memory 
13450 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45  used by the VDBE
13460 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28  .  */.  Cleanup(
13470 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70  p);..  /* Save p
13480 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61  rofiling informa
13490 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56  tion from this V
134a0 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69  DBE run..  */.#i
134b0 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
134c0 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a  E.  {.    FILE *
134d0 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62  out = fopen("vdb
134e0 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20  e_profile.out", 
134f0 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75  "a");.    if( ou
13500 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
13510 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
13520 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20  out, "---- ");. 
13530 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
13540 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
13550 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
13560 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f  t, "%02x", p->aO
13570 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20  p[i].opcode);.  
13580 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
13590 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
135a0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71        if( p->zSq
135b0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  l ){.        cha
135c0 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20  r c, pc = 0;.   
135d0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
135e0 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  , "-- ");.      
135f0 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
13600 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20  p->zSql[i])!=0; 
13610 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
13620 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66  if( pc=='\n' ) f
13630 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20  printf(out, "-- 
13640 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  ");.          pu
13650 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(c, out);.    
13660 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20        pc = c;.  
13670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13680 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66  if( pc!='\n' ) f
13690 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
136a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
136b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
136c0 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
136d0 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d    char zHdr[100]
136e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
136f0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
13700 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22  f(zHdr), zHdr, "
13710 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75  %6u %12llu %8llu
13720 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ",.           p
13730 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20  ->aOp[i].cnt,.  
13740 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
13750 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20  i].cycles,.     
13760 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
13770 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69  cnt>0 ? p->aOp[i
13780 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b  ].cycles/p->aOp[
13790 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20  i].cnt : 0.     
137a0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70     );.        fp
137b0 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c  rintf(out, "%s",
137c0 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20   zHdr);.        
137d0 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
137e0 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
137f0 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
13800 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
13810 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
13820 64 69 66 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e  dif.  p->iCurren
13830 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  tTime = 0;.  p->
13840 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
13850 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72  IC_INIT;.  retur
13860 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72  n p->rc & db->er
13870 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a  rMask;.}. ./*.**
13880 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65   Clean up and de
13890 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65  lete a VDBE afte
138a0 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65  r execution.  Re
138b0 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
138c0 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20  which is.** the 
138d0 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72  result code.  Wr
138e0 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
138f0 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20  ssage text into 
13900 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  *pzErrMsg..*/.in
13910 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  t sqlite3VdbeFin
13920 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a  alize(Vdbe *p){.
13930 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13940 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  E_OK;.  if( p->m
13950 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
13960 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  _RUN || p->magic
13970 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  ==VDBE_MAGIC_HAL
13980 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  T ){.    rc = sq
13990 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70  lite3VdbeReset(p
139a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
139b0 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d  rc & p->db->errM
139c0 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a  ask)==rc );.  }.
139d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
139e0 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ete(p);.  return
139f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
13a00 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69   parameter iOp i
13a10 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
13a20 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
13a30 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
13a40 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72  .** all auxiliar
13a50 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20  y data pointers 
13a60 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64  currently cached
13a70 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65   by the VM passe
13a80 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  d as.** the firs
13a90 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
13aa0 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20  * Or, if iOp is 
13ab0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
13ac0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
13ad0 68 65 6e 20 74 68 65 20 64 65 73 74 72 75 63 74  hen the destruct
13ae0 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e  or is.** only in
13af0 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20  voked for those 
13b00 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70  auxiliary data p
13b10 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65 64 20  ointers created 
13b20 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20  by the user .** 
13b30 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64  function invoked
13b40 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74   by the OP_Funct
13b50 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e  ion opcode at in
13b60 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66  struction iOp of
13b70 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61   .** VM pVdbe, a
13b80 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a  nd only then if:
13b90 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
13ba0 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74  associated funct
13bb0 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73  ion parameter is
13bc0 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74   the 32nd or lat
13bd0 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20  er (counting.** 
13be0 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74       from left t
13bf0 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a  o right), or.**.
13c00 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72  **    * the corr
13c10 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
13c20 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69   argument mask i
13c30 73 20 63 6c 65 61 72 20 28 77 68 65 72 65 20 74  s clear (where t
13c40 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20  he first.**     
13c50 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
13c60 74 65 72 20 63 6f 72 72 73 70 6f 6e 64 73 20 74  ter corrsponds t
13c70 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a  o bit 0 etc.)..*
13c80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
13c90 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
13ca0 56 64 62 65 20 2a 70 56 64 62 65 2c 20 69 6e 74  Vdbe *pVdbe, int
13cb0 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b   iOp, int mask){
13cc0 0a 20 20 41 75 78 44 61 74 61 20 2a 2a 70 70 20  .  AuxData **pp 
13cd0 3d 20 26 70 56 64 62 65 2d 3e 70 41 75 78 44 61  = &pVdbe->pAuxDa
13ce0 74 61 3b 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  ta;.  while( *pp
13cf0 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61 20   ){.    AuxData 
13d00 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20  *pAux = *pp;.   
13d10 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20 20   if( (iOp<0).   
13d20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d    || (pAux->iOp=
13d30 3d 69 4f 70 20 26 26 20 28 70 41 75 78 2d 3e 69  =iOp && (pAux->i
13d40 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b  Arg>31 || !(mask
13d50 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75   & MASKBIT32(pAu
13d60 78 2d 3e 69 41 72 67 29 29 29 29 0a 20 20 20 20  x->iArg)))).    
13d70 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
13d80 65 28 20 70 41 75 78 2d 3e 69 41 72 67 3d 3d 33  e( pAux->iArg==3
13d90 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
13da0 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a  Aux->xDelete ){.
13db0 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44          pAux->xD
13dc0 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78  elete(pAux->pAux
13dd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13de0 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65   *pp = pAux->pNe
13df0 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
13e00 33 44 62 46 72 65 65 28 70 56 64 62 65 2d 3e 64  3DbFree(pVdbe->d
13e10 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 20 7d 65  b, pAux);.    }e
13e20 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 3d 20 26  lse{.      pp= &
13e30 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pAux->pNext;.   
13e40 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
13e50 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
13e60 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
13e70 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
13e80 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
13e90 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70  gument,.** excep
13ea0 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 74 73  t for object its
13eb0 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20 70 72  elf, which is pr
13ec0 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eserved..**.** T
13ed0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
13ee0 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
13ef0 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56  ion and sqlite3V
13f00 64 62 65 44 65 6c 65 74 65 28 29 20 69 73 20 74  dbeDelete() is t
13f10 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74  hat.** VdbeDelet
13f20 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73  e() also unlinks
13f30 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74   the Vdbe from t
13f40 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61  he list of VMs a
13f50 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
13f60 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
13f70 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66 72  onnection and fr
13f80 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74 20 69  ees the object i
13f90 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tself..*/.void s
13fa0 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f  qlite3VdbeClearO
13fb0 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64  bject(sqlite3 *d
13fc0 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53  b, Vdbe *p){.  S
13fd0 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c  ubProgram *pSub,
13fe0 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69   *pNext;.  int i
13ff0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
14000 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64  b==0 || p->db==d
14010 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65  b );.  releaseMe
14020 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20  mArray(p->aVar, 
14030 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65  p->nVar);.  rele
14040 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
14050 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
14060 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
14070 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d  );.  for(pSub=p-
14080 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b  >pProgram; pSub;
14090 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20   pSub=pNext){.  
140a0 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e    pNext = pSub->
140b0 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46  pNext;.    vdbeF
140c0 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70  reeOpArray(db, p
140d0 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e  Sub->aOp, pSub->
140e0 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nOp);.    sqlite
140f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
14100 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70  );.  }.  for(i=p
14110 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b  ->nzVar-1; i>=0;
14120 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 62 46   i--) sqlite3DbF
14130 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72  ree(db, p->azVar
14140 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46 72 65 65  [i]);.  vdbeFree
14150 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61  OpArray(db, p->a
14160 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73  Op, p->nOp);.  s
14170 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14180 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
14190 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
141a0 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73  b, p->zSql);.  s
141b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
141c0 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66 20   p->pFree);.#if 
141d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
141e0 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
141f0 49 4e 29 0a 20 20 73 71 6c 69 74 65 33 44 62 46  IN).  sqlite3DbF
14200 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 78 70 6c  ree(db, p->zExpl
14210 61 69 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ain);.  sqlite3D
14220 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 45 78  bFree(db, p->pEx
14230 70 6c 61 69 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d  plain);.#endif.}
14240 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
14250 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a  n entire VDBE..*
14260 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
14270 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70  beDelete(Vdbe *p
14280 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
14290 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  ;..  if( NEVER(p
142a0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ==0) ) return;. 
142b0 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
142c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
142d0 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
142e0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
142f0 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74  3VdbeClearObject
14300 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  (db, p);.  if( p
14310 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
14320 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
14330 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c   p->pNext;.  }el
14340 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
14350 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a  db->pVdbe==p );.
14360 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20      db->pVdbe = 
14370 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
14380 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
14390 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
143a0 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
143b0 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
143c0 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44   VDBE_MAGIC_DEAD
143d0 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20  ;.  p->db = 0;. 
143e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
143f0 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
14400 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75  Make sure the cu
14410 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20  rsor p is ready 
14420 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
14430 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63   the row to whic
14440 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  h it.** was last
14450 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65   positioned.  Re
14460 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
14470 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75  de if an OOM fau
14480 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a  lt or I/O error.
14490 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66  ** prevents us f
144a0 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20  rom positioning 
144b0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74  the cursor to it
144c0 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69  s correct positi
144d0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d  on..**.** If a M
144e0 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20  oveTo operation 
144f0 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68  is pending on th
14500 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20  e given cursor, 
14510 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20  then do that.** 
14520 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20  MoveTo now.  If 
14530 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69  no move is pendi
14540 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ng, check to see
14550 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20   if the row has 
14560 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20  been.** deleted 
14570 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
14580 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66  he cursor and if
14590 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68   it has, mark th
145a0 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55  e row as.** a NU
145b0 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66  LL row..**.** If
145c0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
145d0 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
145e0 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  to the correct r
145f0 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20  ow and that row 
14600 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20  has.** not been 
14610 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
14620 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
14630 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  r, then this rou
14640 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
14650 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
14660 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
14670 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
14680 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65    if( p->deferre
14690 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69  dMoveto ){.    i
146a0 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64  nt res, rc;.#ifd
146b0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
146c0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
146d0 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
146e0 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61  nt;.#endif.    a
146f0 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c  ssert( p->isTabl
14700 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  e );.    rc = sq
14710 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
14720 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43 75 72  Unpacked(p->pCur
14730 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74  sor, 0, p->movet
14740 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73  oTarget, 0, &res
14750 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
14760 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
14770 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 2d  ->lastRowid = p-
14780 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b 0a 20  >movetoTarget;. 
14790 20 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20     if( res!=0 ) 
147a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
147b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
147c0 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  p->rowidIsValid 
147d0 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 1;.#ifdef SQLI
147e0 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69  TE_TEST.    sqli
147f0 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
14800 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  ++;.#endif.    p
14810 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
14820 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63   = 0;.    p->cac
14830 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
14840 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73 65 20  _STALE;.  }else 
14850 69 66 28 20 70 2d 3e 70 43 75 72 73 6f 72 20 29  if( p->pCursor )
14860 7b 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76  {.    int hasMov
14870 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
14880 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
14890 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70  sorHasMoved(p->p
148a0 43 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65  Cursor, &hasMove
148b0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  d);.    if( rc )
148c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
148d0 69 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a  if( hasMoved ){.
148e0 20 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74        p->cacheSt
148f0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
14900 4c 45 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61  LE;.      if( ha
14910 73 4d 6f 76 65 64 3d 3d 32 20 29 20 70 2d 3e 6e  sMoved==2 ) p->n
14920 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  ullRow = 1;.    
14930 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
14940 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
14950 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
14960 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
14970 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
14980 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c  ialType().** sql
14990 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
149a0 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  peLen().** sqlit
149b0 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28  e3VdbeSerialLen(
149c0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
149d0 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73  SerialPut().** s
149e0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
149f0 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61  Get().**.** enca
14a00 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65  psulate the code
14a10 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73   that serializes
14a20 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72   values for stor
14a30 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a  age in SQLite.**
14a40 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20   data and index 
14a50 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65  records. Each se
14a60 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63  rialized value c
14a70 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20  onsists of a.** 
14a80 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e  'serial-type' an
14a90 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  d a blob of data
14aa0 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70  . The serial typ
14ab0 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75  e is an 8-byte u
14ac0 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67  nsigned.** integ
14ad0 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20  er, stored as a 
14ae0 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  varint..**.** In
14af0 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78   an SQLite index
14b00 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72   record, the ser
14b10 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72  ial type is stor
14b20 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f  ed directly befo
14b30 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f  re.** the blob o
14b40 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63  f data that it c
14b50 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49  orresponds to. I
14b60 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64  n a table record
14b70 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20  , all serial.** 
14b80 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64  types are stored
14b90 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
14ba0 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64   the record, and
14bb0 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61   the blobs of da
14bc0 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64  ta at.** the end
14bd0 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75  . Hence these fu
14be0 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68  nctions allow th
14bf0 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64  e caller to hand
14c00 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c  le the.** serial
14c10 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62  -type and data b
14c20 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a  lob separately..
14c30 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
14c40 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69  ing table descri
14c50 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20  bes the various 
14c60 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20  storage classes 
14c70 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20  for data:.**.** 
14c80 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20    serial type   
14c90 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61       bytes of da
14ca0 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20  ta      type.** 
14cb0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
14cc0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
14cd0 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ----    --------
14ce0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20  -------.**      
14cf0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
14d00 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
14d10 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20     NULL.**      
14d20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
14d30 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
14d40 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
14d50 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20  r.**      2     
14d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d70 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  2            sig
14d80 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
14d90 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
14da0 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20            3     
14db0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
14dc0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20  teger.**      4 
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14de0 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
14df0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
14e00 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20  **      5       
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20                6 
14e20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
14e30 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
14e40 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20    6             
14e50 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
14e60 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
14e70 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20  ger.**      7   
14e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e90 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49    8            I
14ea0 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20  EEE float.**    
14eb0 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20    8             
14ec0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
14ed0 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
14ee0 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20  stant 0.**      
14ef0 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  9               
14f00 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
14f10 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
14f20 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c  ant 1.**     10,
14f30 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  11              
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f50 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78   reserved for ex
14f60 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e  pansion.**    N>
14f70 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20  =12 and even    
14f80 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20     (N-12)/2     
14f90 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e     BLOB.**    N>
14fa0 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20  =13 and odd     
14fb0 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20     (N-13)/2     
14fc0 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68     text.**.** Th
14fd0 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20  e 8 and 9 types 
14fe0 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e  were added in 3.
14ff0 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74  3.0, file format
15000 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69   4.  Prior versi
15010 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
15020 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73   will not unders
15030 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61  tand those seria
15040 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  l types..*/../*.
15050 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
15060 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68  rial-type for th
15070 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
15080 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73  n pMem..*/.u32 s
15090 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
150a0 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Type(Mem *pMem, 
150b0 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  int file_format)
150c0 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  {.  int flags = 
150d0 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  pMem->flags;.  i
150e0 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61  nt n;..  if( fla
150f0 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
15100 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
15110 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
15120 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46  _Int ){.    /* F
15130 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65  igure out whethe
15140 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34  r to use 1, 2, 4
15150 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20  , 6 or 8 bytes. 
15160 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41  */.#   define MA
15170 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 29  X_6BYTE ((((i64)
15180 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29  0x00008000)<<32)
15190 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20  -1).    i64 i = 
151a0 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75  pMem->u.i;.    u
151b0 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c  64 u;.    if( i<
151c0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  0 ){.      if( i
151d0 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29 20 29 20  <(-MAX_6BYTE) ) 
151e0 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 20 20  return 6;.      
151f0 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65 73 74  /* Previous test
15200 20 70 72 65 76 65 6e 74 73 3a 20 20 75 20 3d 20   prevents:  u = 
15210 2d 28 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  -(-9223372036854
15220 37 37 35 38 30 38 29 20 2a 2f 0a 20 20 20 20 20  775808) */.     
15230 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65 6c   u = -i;.    }el
15240 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b  se{.      u = i;
15250 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
15260 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20 72  <=127 ){.      r
15270 65 74 75 72 6e 20 28 28 69 26 31 29 3d 3d 69 20  eturn ((i&1)==i 
15280 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  && file_format>=
15290 34 29 20 3f 20 38 2b 28 75 33 32 29 75 20 3a 20  4) ? 8+(u32)u : 
152a0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
152b0 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75   u<=32767 ) retu
152c0 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 2;.    if( u<
152d0 3d 38 33 38 38 36 30 37 20 29 20 72 65 74 75 72  =8388607 ) retur
152e0 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 3;.    if( u<=
152f0 32 31 34 37 34 38 33 36 34 37 20 29 20 72 65 74  2147483647 ) ret
15300 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75  urn 4;.    if( u
15310 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65  <=MAX_6BYTE ) re
15320 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75  turn 5;.    retu
15330 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 6;.  }.  if( 
15340 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29  flags&MEM_Real )
15350 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a  {.    return 7;.
15360 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d    }.  assert( pM
15370 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  em->db->mallocFa
15380 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d  iled || flags&(M
15390 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
153a0 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e   );.  n = pMem->
153b0 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  n;.  if( flags &
153c0 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
153d0 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a   n += pMem->u.nZ
153e0 65 72 6f 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ero;.  }.  asser
153f0 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74  t( n>=0 );.  ret
15400 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20  urn ((n*2) + 12 
15410 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74  + ((flags&MEM_St
15420 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r)!=0));.}../*.*
15430 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e  * Return the len
15440 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
15450 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
15460 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65   the supplied se
15470 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33  rial-type..*/.u3
15480 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
15490 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73  ialTypeLen(u32 s
154a0 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69  erial_type){.  i
154b0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
154c0 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  12 ){.    return
154d0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
154e0 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  )/2;.  }else{.  
154f0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
15500 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c  8 aSize[] = { 0,
15510 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20   1, 2, 3, 4, 6, 
15520 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30  8, 8, 0, 0, 0, 0
15530 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   };.    return a
15540 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65  Size[serial_type
15550 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ];.  }.}../*.** 
15560 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20  If we are on an 
15570 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74  architecture wit
15580 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66  h mixed-endian f
15590 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e  loating .** poin
155a0 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68  ts (ex: ARM7) th
155b0 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65  en swap the lowe
155c0 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  r 4 bytes with t
155d0 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62  he .** upper 4 b
155e0 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68  ytes.  Return th
155f0 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
15600 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65  For most archite
15610 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20  ctures, this is 
15620 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28  a no-op..**.** (
15630 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72  later):  It is r
15640 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68  eported to me th
15650 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64  at the mixed-end
15660 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f  ian problem.** o
15670 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73  n ARM7 is an iss
15680 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74  ue with GCC, not
15690 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63   with the ARM7 c
156a0 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a  hip.  It seems.*
156b0 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72  * that early ver
156c0 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f  sions of GCC sto
156d0 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64  red the two word
156e0 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a  s of a 64-bit.**
156f0 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72   float in the wr
15700 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20  ong order.  And 
15710 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62  that error has b
15720 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a  een propagated.*
15730 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54  * ever since.  T
15740 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20  he blame is not 
15750 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68  necessarily with
15760 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a   GCC, though..**
15770 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20   GCC might have 
15780 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65  just copying the
15790 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20   problem from a 
157a0 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a  prior compiler..
157b0 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c  ** I am also tol
157c0 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72  d that newer ver
157d0 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61  sions of GCC tha
157e0 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65  t follow a diffe
157f0 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20  rent.** ABI get 
15800 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72  the byte order r
15810 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65  ight..**.** Deve
15820 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c  lopers using SQL
15830 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73  ite on an ARM7 s
15840 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e  hould compile an
15850 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61  d run their.** a
15860 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67  pplication using
15870 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d   -DSQLITE_DEBUG=
15880 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e  1 at least once.
15890 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20    With DEBUG.** 
158a0 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73  enabled, some as
158b0 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c  serts below will
158c0 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
158d0 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a   byte order of.*
158e0 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
158f0 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65   values is corre
15900 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d  ct..**.** (2007-
15910 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61  08-30)  Frank va
15920 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69  n Vugt has studi
15930 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  ed this problem 
15940 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68  closely.** and h
15950 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64  as send his find
15960 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69  ings to the SQLi
15970 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20  te developers.  
15980 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20  Frank.** writes 
15990 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20  that some Linux 
159a0 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c  kernels offer fl
159b0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72  oating point har
159c0 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69  dware.** emulati
159d0 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c  on that uses onl
159e0 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73  y 32-bit mantiss
159f0 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  as instead of a 
15a00 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73  full .** 48-bits
15a10 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20   as required by 
15a20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72  the IEEE standar
15a30 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65  d.  (This is the
15a40 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46  .** CONFIG_FPE_F
15a50 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20  ASTFPE option.) 
15a60 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73   On such systems
15a70 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  , floating point
15a80 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e  .** byte swappin
15a90 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63  g becomes very c
15aa0 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20  omplicated.  To 
15ab0 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a  avoid problems,.
15ac0 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ** the necessary
15ad0 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69   byte swapping i
15ae0 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73  s carried out us
15af0 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74  ing a 64-bit int
15b00 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74  eger.** rather t
15b10 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f  han a 64-bit flo
15b20 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72  at.  Frank assur
15b30 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63  es us that the c
15b40 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b  ode here.** work
15b50 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20  s for him.  We, 
15b60 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20  the developers, 
15b70 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69  have no way to i
15b80 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20  ndependently.** 
15b90 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74  verify this, but
15ba0 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20   Frank seems to 
15bb0 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20  know what he is 
15bc0 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a  talking about.**
15bd0 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d   so we trust him
15be0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
15bf0 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
15c00 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74  64BIT_FLOAT.stat
15c10 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70  ic u64 floatSwap
15c20 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f  (u64 in){.  unio
15c30 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20  n {.    u64 r;. 
15c40 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d     u32 i[2];.  }
15c50 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20   u;.  u32 t;..  
15c60 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20  u.r = in;.  t = 
15c70 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d  u.i[0];.  u.i[0]
15c80 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69   = u.i[1];.  u.i
15c90 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72  [1] = t;.  retur
15ca0 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e  n u.r;.}.# defin
15cb0 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
15cc0 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66  nFloat(X)  X = f
15cd0 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73  loatSwap(X).#els
15ce0 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  e.# define swapM
15cf0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
15d00 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
15d10 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61   Write the seria
15d20 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20  lized data blob 
15d30 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
15d40 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74  ored in pMem int
15d50 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73  o .** buf. It is
15d60 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
15d70 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c  e caller has all
15d80 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e  ocated sufficien
15d90 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75  t space..** Retu
15da0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
15db0 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a   bytes written..
15dc0 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68  **.** nBuf is th
15dd0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  e amount of spac
15de0 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e  e left in buf[].
15df0 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20    The caller is 
15e00 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66  responsible.** f
15e10 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e  or allocating en
15e20 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75  ough space to bu
15e30 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  f[] to hold the 
15e40 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78  entire field, ex
15e50 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68  clusive.** of th
15e60 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20  e pMem->u.nZero 
15e70 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f  bytes for a MEM_
15e80 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  Zero value..**.*
15e90 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
15ea0 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
15eb0 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  ually written in
15ec0 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e  to buf[].  The n
15ed0 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65  umber.** of byte
15ee0 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69  s in the zero-fi
15ef0 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63  lled tail is inc
15f00 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74  luded in the ret
15f10 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a  urn value only.*
15f20 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73  * if those bytes
15f30 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20   were zeroed in 
15f40 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73  buf[]..*/ .u32 s
15f50 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15f60 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d  Put(u8 *buf, Mem
15f70 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69   *pMem, u32 seri
15f80 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20  al_type){.  u32 
15f90 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67  len;..  /* Integ
15fa0 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
15fb0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
15fc0 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=7 && serial_ty
15fd0 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20  pe>0 ){.    u64 
15fe0 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20  v;.    u32 i;.  
15ff0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
16000 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73  e==7 ){.      as
16010 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d  sert( sizeof(v)=
16020 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29  =sizeof(pMem->r)
16030 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
16040 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73  (&v, &pMem->r, s
16050 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20  izeof(v));.     
16060 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
16070 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65  Float(v);.    }e
16080 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70  lse{.      v = p
16090 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a  Mem->u.i;.    }.
160a0 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71      len = i = sq
160b0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
160c0 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
160d0 70 65 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  pe);.    while( 
160e0 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66  i-- ){.      buf
160f0 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46  [i] = (u8)(v&0xF
16100 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
16110 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  8;.    }.    ret
16120 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
16130 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
16140 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
16150 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
16160 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
16170 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67  n + ((pMem->flag
16180 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d  s & MEM_Zero)?pM
16190 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20  em->u.nZero:0). 
161a0 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28              == (
161b0 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53  int)sqlite3VdbeS
161c0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
161d0 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20  ial_type) );.   
161e0 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
161f0 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20      memcpy(buf, 
16200 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
16210 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
16220 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72   }..  /* NULL or
16230 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20   constants 0 or 
16240 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  1 */.  return 0;
16250 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22  .}../* Input "x"
16260 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   is a sequence o
16270 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61  f unsigned chara
16280 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65  cters that repre
16290 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e  sent a.** big-en
162a0 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52  dian integer.  R
162b0 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61  eturn the equiva
162c0 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65  lent native inte
162d0 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f  ger.*/.#define O
162e0 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  NE_BYTE_INT(x)  
162f0 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23    ((i8)(x)[0]).#
16300 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f  define TWO_BYTE_
16310 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28  INT(x)    (256*(
16320 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b  i8)((x)[0])|(x)[
16330 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45  1]).#define THRE
16340 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28  E_BYTE_INT(x)  (
16350 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30  65536*(i8)((x)[0
16360 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28  ])|((x)[1]<<8)|(
16370 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[2]).#define F
16380 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29  OUR_BYTE_UINT(x)
16390 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c    (((u32)(x)[0]<
163a0 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  <24)|((x)[1]<<16
163b0 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
163c0 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  )[3])../*.** Des
163d0 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74  erialize the dat
163e0 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74  a blob pointed t
163f0 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69  o by buf as seri
16400 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74  al type serial_t
16410 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65  ype.** and store
16420 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70   the result in p
16430 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Mem.  Return the
16440 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
16450 20 72 65 61 64 2e 0a 2a 2f 20 0a 75 33 32 20 73   read..*/ .u32 s
16460 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16470 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
16480 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
16490 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
164a0 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
164b0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
164c0 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
164d0 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
164e0 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
164f0 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
16500 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
16510 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
16520 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
16530 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
16540 20 20 75 36 34 20 78 3b 0a 20 20 75 33 32 20 79    u64 x;.  u32 y
16550 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  ;.  switch( seri
16560 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
16570 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73  ase 10:   /* Res
16580 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
16590 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
165a0 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   11:   /* Reserv
165b0 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
165c0 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a  e */.    case 0:
165d0 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20   {  /* NULL */. 
165e0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
165f0 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
16600 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16610 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a      case 1: { /*
16620 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   1-byte signed i
16630 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
16640 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f  pMem->u.i = ONE_
16650 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
16660 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
16670 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
16680 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
16690 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
166a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
166b0 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
166c0 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
166d0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
166e0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f   pMem->u.i = TWO
166f0 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
16700 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
16710 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
16720 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
16730 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
16740 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
16750 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
16760 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
16770 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
16780 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48    pMem->u.i = TH
16790 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  REE_BYTE_INT(buf
167a0 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
167b0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
167c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
167d0 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
167e0 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20       return 3;. 
167f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
16800 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
16810 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
16820 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59       y = FOUR_BY
16830 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20  TE_UINT(buf);.  
16840 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
16850 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a  (i64)*(int*)&y;.
16860 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
16870 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
16880 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
16890 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
168a0 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
168b0 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
168c0 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
168d0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
168e0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f    pMem->u.i = FO
168f0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
16900 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
16910 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
16920 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
16930 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
16940 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
16950 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
16960 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
16970 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   6;.    }.    ca
16980 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74  se 6:   /* 8-byt
16990 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
169a0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20   */.    case 7: 
169b0 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69  { /* IEEE floati
169c0 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 23 69 66 20  ng point */.#if 
169d0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
169e0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
169f0 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
16a00 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f  G_POINT).      /
16a10 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e  * Verify that in
16a20 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74  tegers and float
16a30 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
16a40 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20   use the same.  
16a50 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65      ** byte orde
16a60 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20  r.  Or, that if 
16a70 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
16a80 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20  IAN_64BIT_FLOAT 
16a90 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 69  is.      ** defi
16aa0 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20  ned that 64-bit 
16ab0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
16ac0 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65  alues really are
16ad0 20 6d 69 78 65 64 0a 20 20 20 20 20 20 2a 2a 20   mixed.      ** 
16ae0 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f  endian..      */
16af0 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
16b00 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75  nst u64 t1 = ((u
16b10 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c  64)0x3ff00000)<<
16b20 33 32 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63  32;.      static
16b30 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31   const double r1
16b40 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 75 36   = 1.0;.      u6
16b50 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 20  4 t2 = t1;.     
16b60 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
16b70 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 20  Float(t2);.     
16b80 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
16b90 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20  r1)==sizeof(t2) 
16ba0 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26  && memcmp(&r1, &
16bb0 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d  t2, sizeof(r1))=
16bc0 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =0 );.#endif.   
16bd0 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45     x = FOUR_BYTE
16be0 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  _UINT(buf);.    
16bf0 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    y = FOUR_BYTE_
16c00 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 20  UINT(buf+4);.   
16c10 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
16c20 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   y;.      if( se
16c30 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a  rial_type==6 ){.
16c40 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e          pMem->u.
16c50 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
16c60 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
16c70 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
16c80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16c90 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
16ca0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16cb0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
16cc0 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65  of(x)==8 && size
16cd0 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29  of(pMem->r)==8 )
16ce0 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70 4d 69  ;.        swapMi
16cf0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78  xedEndianFloat(x
16d00 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
16d10 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20  y(&pMem->r, &x, 
16d20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
16d30 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
16d40 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70  = sqlite3IsNaN(p
16d50 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75  Mem->r) ? MEM_Nu
16d60 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  ll : MEM_Real;. 
16d70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
16d80 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 8;.    }.   
16d90 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49   case 8:    /* I
16da0 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20  nteger 0 */.    
16db0 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e  case 9: {  /* In
16dc0 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20  teger 1 */.     
16dd0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72   pMem->u.i = ser
16de0 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20  ial_type-8;.    
16df0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
16e00 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
16e10 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
16e20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
16e30 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
16e40 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b   u16 aFlag[] = {
16e50 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70   MEM_Blob|MEM_Ep
16e60 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  hem, MEM_Str|MEM
16e70 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20  _Ephem };.      
16e80 75 33 32 20 6c 65 6e 20 3d 20 28 73 65 72 69 61  u32 len = (seria
16e90 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
16ea0 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63      pMem->z = (c
16eb0 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20  har *)buf;.     
16ec0 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a   pMem->n = len;.
16ed0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c        pMem->xDel
16ee0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d   = 0;.      pMem
16ef0 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b  ->flags = aFlag[
16f00 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a  serial_type&1];.
16f10 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e        return len
16f20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
16f30 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
16f40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
16f50 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
16f60 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
16f70 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b  ce for an Unpack
16f80 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75  edRecord.** stru
16f90 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75  cture large enou
16fa0 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  gh to be used wi
16fb0 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  th sqlite3VdbeRe
16fc0 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a  cordUnpack() if.
16fd0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67  ** the first arg
16fe0 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
16ff0 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74  er to KeyInfo st
17000 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f  ructure pKeyInfo
17010 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63  ..**.** The spac
17020 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f  e is either allo
17030 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69  cated using sqli
17040 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29  te3DbMallocRaw()
17050 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a   or from within.
17060 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64  ** the unaligned
17070 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 76   buffer passed v
17080 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e  ia the second an
17090 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  d third argument
170a0 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a  s (presumably.**
170b0 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49   stack space). I
170c0 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68  f the former, th
170d0 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73 65  en *ppFree is se
170e0 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  t to a pointer t
170f0 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
17100 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
17110 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
17120 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46  using sqlite3DbF
17130 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68  ree(). Or, if th
17140 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  e .** allocation
17150 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20   comes from the 
17160 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62  pSpace/szSpace b
17170 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69  uffer, *ppFree i
17180 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
17190 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
171a0 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f  g..**.** If an O
171b0 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
171c0 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
171d0 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65  d..*/.UnpackedRe
171e0 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62  cord *sqlite3Vdb
171f0 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65  eAllocUnpackedRe
17200 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20  cord(.  KeyInfo 
17210 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
17220 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72          /* Descr
17230 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65  iption of the re
17240 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cord */.  char *
17250 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  pSpace,         
17260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61            /* Una
17270 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76 61  ligned space ava
17280 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  ilable */.  int 
17290 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  szSpace,        
172a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
172b0 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20  ize of pSpace[] 
172c0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
172d0 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20 20  ar **ppFree     
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
172f0 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f   OUT: Caller sho
17300 75 6c 64 20 66 72 65 65 20 74 68 69 73 20 70 6f  uld free this po
17310 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e  inter */.){.  Un
17320 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b  packedRecord *p;
17330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17340 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   Unpacked record
17350 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
17360 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20  int nOff;       
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17380 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53 70  /* Increment pSp
17390 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20 61  ace by nOff to a
173a0 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74  lign it */.  int
173b0 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
173c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
173d0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
173e0 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20  required for *p 
173f0 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74  */..  /* We want
17400 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f   to shift the po
17410 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70 20  inter pSpace up 
17420 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73 20  such that it is 
17430 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a  8-byte aligned..
17440 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65    ** Thus, we ne
17450 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20  ed to calculate 
17460 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62  a value, nOff, b
17470 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20  etween 0 and 7, 
17480 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69  to shift .  ** i
17490 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63 65  t by.  If pSpace
174a0 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79   is already 8-by
174b0 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66  te aligned, nOff
174c0 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e   should be zero.
174d0 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28  .  */.  nOff = (
174e0 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f  8 - (SQLITE_PTR_
174f0 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26  TO_INT(pSpace) &
17500 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79 74   7)) & 7;.  nByt
17510 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
17520 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
17530 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29  )) + sizeof(Mem)
17540 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  *(pKeyInfo->nFie
17550 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79  ld+1);.  if( nBy
17560 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20  te>szSpace+nOff 
17570 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61  ){.    p = (Unpa
17580 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c  ckedRecord *)sql
17590 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
175a0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42  pKeyInfo->db, nB
175b0 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72 65  yte);.    *ppFre
175c0 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a 20  e = (char *)p;. 
175d0 20 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75     if( !p ) retu
175e0 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 0;.  }else{. 
175f0 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64     p = (Unpacked
17600 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65 5b  Record*)&pSpace[
17610 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72  nOff];.    *ppFr
17620 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  ee = 0;.  }..  p
17630 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26  ->aMem = (Mem*)&
17640 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44  ((char*)p)[ROUND
17650 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
17660 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73  dRecord))];.  as
17670 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
17680 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
17690 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  .  p->pKeyInfo =
176a0 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e   pKeyInfo;.  p->
176b0 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
176c0 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20  o->nField + 1;. 
176d0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
176e0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b  .** Given the nK
176f0 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67  ey-byte encoding
17700 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20   of a record in 
17710 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65  pKey[], populate
17720 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65   the .** Unpacke
17730 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
17740 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
17750 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
17760 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63  nt with the.** c
17770 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
17780 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a  ecoded record..*
17790 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  / .void sqlite3V
177a0 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
177b0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
177c0 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66  Info,     /* Inf
177d0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
177e0 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74  he record format
177f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20   */.  int nKey, 
17800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17810 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61  Size of the bina
17820 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ry record */.  c
17830 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
17840 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e        /* The bin
17850 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
17860 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
17870 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61  p      /* Popula
17880 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72  te this structur
17890 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
178a0 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ng. */.){.  cons
178b0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
178c0 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
178d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
178e0 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20  Key;.  int d; . 
178f0 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20 20   u32 idx;       
17900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17910 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b   /* Offset in aK
17920 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f  ey[] to read fro
17930 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20  m */.  u16 u;   
17940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17950 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
17960 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
17970 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  */.  u32 szHdr;.
17980 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d    Mem *pMem = p-
17990 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66  >aMem;..  p->def
179a0 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61  ault_rc = 0;.  a
179b0 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
179c0 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d  E_ALIGNMENT(pMem
179d0 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  ) );.  idx = get
179e0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
179f0 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48  zHdr);.  d = szH
17a00 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77  dr;.  u = 0;.  w
17a10 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
17a20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26  && u<p->nField &
17a30 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20  & d<=nKey ){.   
17a40 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
17a50 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65  ;..    idx += ge
17a60 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b  tVarint32(&aKey[
17a70 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx], serial_typ
17a80 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  e);.    pMem->en
17a90 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
17aa0 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  c;.    pMem->db 
17ab0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
17ac0 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61      /* pMem->fla
17ad0 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74  gs = 0; // sqlit
17ae0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
17af0 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20  ) will set this 
17b00 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d  for us */.    pM
17b10 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  em->zMalloc = 0;
17b20 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65  .    d += sqlite
17b30 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
17b40 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f  aKey[d], serial_
17b50 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  type, pMem);.   
17b60 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b   pMem++;.    u++
17b70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
17b80 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  u<=pKeyInfo->nFi
17b90 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e  eld + 1 );.  p->
17ba0 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23  nField = u;.}..#
17bb0 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
17bc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
17bd0 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77 6f  ion compares two
17be0 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
17bf0 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20 74  record keys in t
17c00 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61  he same way.** a
17c10 73 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  s the sqlite3Vdb
17c20 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
17c30 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65   routine. Unlike
17c40 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
17c50 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  re(),.** this fu
17c60 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69  nction deseriali
17c70 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 73  zes and compares
17c80 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74 68   values using th
17c90 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  e.** sqlite3Vdbe
17ca0 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64 20  SerialGet() and 
17cb0 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
17cc0 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49  e() functions. I
17cd0 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20  t is used.** in 
17ce0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
17cf0 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  nts to ensure th
17d00 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64  at the optimized
17d10 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69   code in.** sqli
17d20 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
17d30 70 61 72 65 28 29 20 72 65 74 75 72 6e 73 20 72  pare() returns r
17d40 65 73 75 6c 74 73 20 77 69 74 68 20 74 68 65 73  esults with thes
17d50 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65 73  e two primitives
17d60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17d70 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
17d80 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b  eDebug(.  int nK
17d90 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
17da0 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
17db0 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55  key */.  const U
17dc0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
17dd0 50 4b 65 79 32 20 20 2f 2a 20 52 69 67 68 74 20  PKey2  /* Right 
17de0 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  key */.){.  u32 
17df0 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  d1;            /
17e00 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
17e10 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
17e20 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
17e30 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
17e40 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
17e50 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
17e60 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a  header element *
17e70 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
17e80 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17e90 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61   of bytes in hea
17ea0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  der */.  int i =
17eb0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   0;.  int rc = 0
17ec0 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
17ed0 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
17ee0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
17ef0 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
17f00 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
17f10 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  fo;.  Mem mem1;.
17f20 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  .  pKeyInfo = pP
17f30 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
17f40 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
17f50 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
17f60 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
17f70 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e  ->db;.  /* mem1.
17f80 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57  flags = 0;  // W
17f90 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ill be initializ
17fa0 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62  ed by sqlite3Vdb
17fb0 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a  eSerialGet() */.
17fc0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
17fd0 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20  .zMalloc = 0; ) 
17fe0 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62  /* Only needed b
17ff0 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  y assert() state
18000 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ments */..  /* C
18010 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d  ompilers may com
18020 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e  plain that mem1.
18030 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c  u.i is potential
18040 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ly uninitialized
18050 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20  ..  ** We could 
18060 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61  initialize it, a
18070 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f  s shown here, to
18080 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63   silence those c
18090 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20  omplaints..  ** 
180a0 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d  But in fact, mem
180b0 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72  1.u.i will never
180c0 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65   actually be use
180d0 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c  d uninitialized,
180e0 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a   and doing .  **
180f0 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79   the unnecessary
18100 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
18110 68 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65  has a measurable
18120 20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72   negative perfor
18130 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63  mance.  ** impac
18140 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f  t, since this ro
18150 75 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20  utine is a very 
18160 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e  high runner.  An
18170 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a  d so, we choose.
18180 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74    ** to ignore t
18190 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  he compiler warn
181a0 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74  ings and leave t
181b0 68 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69  his variable uni
181c0 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
181d0 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20  .  /*  mem1.u.i 
181e0 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65  = 0;  // not nee
181f0 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c  ded, here to sil
18200 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61  ence compiler wa
18210 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64  rning */.  .  id
18220 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x1 = getVarint32
18230 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
18240 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a  .  d1 = szHdr1;.
18250 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
18260 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49  fo->nField+pKeyI
18270 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50  nfo->nXField>=pP
18280 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20  Key2->nField || 
18290 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
182a0 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
182b0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
182c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
182d0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20  yInfo->nField>0 
182e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  );.  assert( idx
182f0 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52  1<=szHdr1 || COR
18300 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b  RUPT_DB );.  do{
18310 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
18320 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52  type1;..    /* R
18330 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74  ead the serial t
18340 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78  ypes for the nex
18350 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63  t element in eac
18360 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64  h key. */.    id
18370 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  x1 += getVarint3
18380 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73  2( aKey1+idx1, s
18390 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a  erial_type1 );..
183a0 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
183b0 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  at there is enou
183c0 67 68 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d  gh key space rem
183d0 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a  aining to avoid.
183e0 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20      ** a buffer 
183f0 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65 20 22  overread.  The "
18400 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  d1+serial_type1+
18410 32 22 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  2" subexpression
18420 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77   will.    ** alw
18430 61 79 73 20 62 65 20 67 72 65 61 74 65 72 20 74  ays be greater t
18440 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
18450 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65  the amount of re
18460 71 75 69 72 65 64 20 6b 65 79 20 73 70 61 63 65  quired key space
18470 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61  ..    ** Use tha
18480 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20  t approximation 
18490 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72  to avoid the mor
184a0 65 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c  e expensive call
184b0 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
184c0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
184d0 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d  Len() in the com
184e0 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  mon case..    */
184f0 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65 72 69  .    if( d1+seri
18500 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29  al_type1+2>(u32)
18510 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31  nKey1.     && d1
18520 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69  +sqlite3VdbeSeri
18530 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
18540 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65  _type1)>(u32)nKe
18550 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  y1 .    ){.     
18560 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
18570 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
18580 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63  e values to be c
18590 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ompared..    */.
185a0 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65      d1 += sqlite
185b0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
185c0 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
185d0 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b  l_type1, &mem1);
185e0 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
185f0 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a  comparison.    *
18600 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
18610 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65  e3MemCompare(&me
18620 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65  m1, &pPKey2->aMe
18630 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  m[i], pKeyInfo->
18640 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69  aColl[i]);.    i
18650 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
18660 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a    assert( mem1.z
18670 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
18680 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
18690 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ow */.      if( 
186a0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
186b0 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
186c0 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a     rc = -rc;  /*
186d0 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75   Invert the resu
186e0 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74  lt for DESC sort
186f0 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20   order. */.     
18700 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
18710 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b  rc;.    }.    i+
18720 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  +;.  }while( idx
18730 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  1<szHdr1 && i<pP
18740 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a  Key2->nField );.
18750 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20  .  /* No memory 
18760 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76  allocation is ev
18770 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e  er used on mem1.
18780 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69    Prove this usi
18790 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  ng.  ** the foll
187a0 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
187b0 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29   If the assert()
187c0 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63   fails, it indic
187d0 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f  ates a.  ** memo
187e0 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65  ry leak and a ne
187f0 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ed to call sqlit
18800 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
18810 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20  (&mem1)..  */.  
18820 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61  assert( mem1.zMa
18830 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lloc==0 );..  /*
18840 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
18850 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
18860 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
18870 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a  f fields and.  *
18880 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  * all the fields
18890 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
188a0 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65  t were equal. Re
188b0 74 75 72 6e 20 74 68 65 20 74 68 65 20 64 65 66  turn the the def
188c0 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c  ault_rc.  ** val
188d0 75 65 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ue.  */.  return
188e0 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
188f0 5f 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _rc;.}.#endif../
18900 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31  *.** Both *pMem1
18910 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74   and *pMem2 cont
18920 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c 75 65  ain string value
18930 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74  s. Compare the t
18940 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69  wo values.** usi
18950 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ng the collation
18960 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
18970 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74 75 72   As usual, retur
18980 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c 20 7a  n a negative , z
18990 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69  ero.** or positi
189a0 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70 4d 65  ve value if *pMe
189b0 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  m1 is less than,
189c0 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65   equal to or gre
189d0 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70  ater than .** *p
189e0 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69 76 65  Mem2, respective
189f0 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20 73  ly. Similar in s
18a00 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d 20 28  pirit to "rc = (
18a10 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d  *pMem1) - (*pMem
18a20 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  2);"..*/.static 
18a30 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  int vdbeCompareM
18a40 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73  emString(.  cons
18a50 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20  t Mem *pMem1,.  
18a60 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32  const Mem *pMem2
18a70 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65  ,.  const CollSe
18a80 71 20 2a 70 43 6f 6c 6c 0a 29 7b 0a 20 20 69 66  q *pColl.){.  if
18a90 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43  ( pMem1->enc==pC
18aa0 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
18ab0 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20 61  /* The strings a
18ac0 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  re already in th
18ad0 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64 69  e correct encodi
18ae0 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20 20  ng.  Call the.  
18af0 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
18b00 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63 74   function direct
18b10 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ly */.    return
18b20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
18b30 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d  ll->pUser,pMem1-
18b40 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d  >n,pMem1->z,pMem
18b50 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a  2->n,pMem2->z);.
18b60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
18b70 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76   rc;.    const v
18b80 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20  oid *v1, *v2;.  
18b90 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20    int n1, n2;.  
18ba0 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65    Mem c1;.    Me
18bb0 6d 20 63 32 3b 0a 20 20 20 20 6d 65 6d 73 65 74  m c2;.    memset
18bc0 28 26 63 31 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (&c1, 0, sizeof(
18bd0 63 31 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  c1));.    memset
18be0 28 26 63 32 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (&c2, 0, sizeof(
18bf0 63 32 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  c2));.    sqlite
18c00 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
18c10 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20  opy(&c1, pMem1, 
18c20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
18c30 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
18c40 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70  allowCopy(&c2, p
18c50 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29  Mem2, MEM_Ephem)
18c60 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74  ;.    v1 = sqlit
18c70 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
18c80 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c  ite3_value*)&c1,
18c90 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
18ca0 20 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20 30    n1 = v1==0 ? 0
18cb0 20 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32 20   : c1.n;.    v2 
18cc0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
18cd0 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt((sqlite3_valu
18ce0 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65  e*)&c2, pColl->e
18cf0 6e 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76 32  nc);.    n2 = v2
18d00 3d 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a  ==0 ? 0 : c2.n;.
18d10 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e      rc = pColl->
18d20 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
18d30 72 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20 76  r, n1, v1, n2, v
18d40 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  2);.    sqlite3V
18d50 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
18d60 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
18d70 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
18d80 32 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  2);.    return r
18d90 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
18da0 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75  Compare the valu
18db0 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20  es contained by 
18dc0 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63  the two memory c
18dd0 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a  ells, returning.
18de0 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  ** negative, zer
18df0 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  o or positive if
18e00 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74   pMem1 is less t
18e10 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
18e20 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61  r greater.** tha
18e30 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67  n pMem2. Sorting
18e40 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73   order is NULL's
18e50 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64   first, followed
18e60 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74   by numbers (int
18e70 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61  egers.** and rea
18e80 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72  ls) sorted numer
18e90 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64  ically, followed
18ea0 20 62 79 20 74 65 78 74 20 6f 72 64 65 72 65 64   by text ordered
18eb0 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   by the collatin
18ec0 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43  g.** sequence pC
18ed0 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20  oll and finally 
18ee0 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62  blob's ordered b
18ef0 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a  y memcmp()..**.*
18f00 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  * Two NULL value
18f10 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
18f20 20 65 71 75 61 6c 20 62 79 20 74 68 69 73 20 66   equal by this f
18f30 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
18f40 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
18f50 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65  e(const Mem *pMe
18f60 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  m1, const Mem *p
18f70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c  Mem2, const Coll
18f80 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69  Seq *pColl){.  i
18f90 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 66 31 2c  nt rc;.  int f1,
18fa0 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69   f2;.  int combi
18fb0 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31  ned_flags;..  f1
18fc0 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b   = pMem1->flags;
18fd0 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66  .  f2 = pMem2->f
18fe0 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64  lags;.  combined
18ff0 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a  _flags = f1|f2;.
19000 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69    assert( (combi
19010 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ned_flags & MEM_
19020 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a  RowSet)==0 );. .
19030 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75    /* If one valu
19040 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73  e is NULL, it is
19050 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f   less than the o
19060 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61  ther. If both va
19070 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55  lues.  ** are NU
19080 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  LL, return 0..  
19090 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
190a0 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  d_flags&MEM_Null
190b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
190c0 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28  f2&MEM_Null) - (
190d0 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  f1&MEM_Null);.  
190e0 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76  }..  /* If one v
190f0 61 6c 75 65 20 69 73 20 61 20 6e 75 6d 62 65 72  alue is a number
19100 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69   and the other i
19110 73 20 6e 6f 74 2c 20 74 68 65 20 6e 75 6d 62 65  s not, the numbe
19120 72 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20  r is less..  ** 
19130 49 66 20 62 6f 74 68 20 61 72 65 20 6e 75 6d 62  If both are numb
19140 65 72 73 2c 20 63 6f 6d 70 61 72 65 20 61 73 20  ers, compare as 
19150 72 65 61 6c 73 20 69 66 20 6f 6e 65 20 69 73 20  reals if one is 
19160 61 20 72 65 61 6c 2c 20 6f 72 20 61 73 20 69 6e  a real, or as in
19170 74 65 67 65 72 73 0a 20 20 2a 2a 20 69 66 20 62  tegers.  ** if b
19180 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65 20 69  oth values are i
19190 6e 74 65 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20  ntegers..  */.  
191a0 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
191b0 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f  gs&(MEM_Int|MEM_
191c0 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 64 6f 75  Real) ){.    dou
191d0 62 6c 65 20 72 31 2c 20 72 32 3b 0a 20 20 20 20  ble r1, r2;.    
191e0 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d  if( (f1 & f2 & M
191f0 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
19200 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
19210 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20  .i < pMem2->u.i 
19220 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
19230 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
19240 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29  i > pMem2->u.i )
19250 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
19260 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
19270 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d  .    if( (f1&MEM
19280 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Real)!=0 ){.   
19290 20 20 20 72 31 20 3d 20 70 4d 65 6d 31 2d 3e 72     r1 = pMem1->r
192a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
192b0 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  (f1&MEM_Int)!=0 
192c0 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 28 64  ){.      r1 = (d
192d0 6f 75 62 6c 65 29 70 4d 65 6d 31 2d 3e 75 2e 69  ouble)pMem1->u.i
192e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
192f0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
19300 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 26 4d   }.    if( (f2&M
19310 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
19320 20 20 20 20 20 72 32 20 3d 20 70 4d 65 6d 32 2d       r2 = pMem2-
19330 3e 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  >r;.    }else if
19340 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d  ( (f2&MEM_Int)!=
19350 30 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20  0 ){.      r2 = 
19360 28 64 6f 75 62 6c 65 29 70 4d 65 6d 32 2d 3e 75  (double)pMem2->u
19370 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  .i;.    }else{. 
19380 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
19390 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 31      }.    if( r1
193a0 3c 72 32 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  <r2 ) return -1;
193b0 0a 20 20 20 20 69 66 28 20 72 31 3e 72 32 20 29  .    if( r1>r2 )
193c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72   return 1;.    r
193d0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
193e0 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
193f0 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20  is a string and 
19400 74 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62  the other is a b
19410 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20  lob, the string 
19420 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66  is less..  ** If
19430 20 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67   both are string
19440 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67  s, compare using
19450 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66   the collating f
19460 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  unctions..  */. 
19470 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
19480 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ags&MEM_Str ){. 
19490 20 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d     if( (f1 & MEM
194a0 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Str)==0 ){.    
194b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
194c0 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20  }.    if( (f2 & 
194d0 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20  MEM_Str)==0 ){. 
194e0 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
194f0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
19500 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70  t( pMem1->enc==p
19510 4d 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20 20 20  Mem2->enc );.   
19520 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e   assert( pMem1->
19530 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc==SQLITE_UTF8
19540 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
19550 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
19560 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70  ITE_UTF16LE || p
19570 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
19580 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20  E_UTF16BE );..  
19590 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
195a0 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74  on sequence must
195b0 20 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74   be defined at t
195c0 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20  his point, even 
195d0 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73  if.    ** the us
195e0 65 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63  er deletes the c
195f0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
19600 65 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65  e after the vdbe
19610 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20   program is.    
19620 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69  ** compiled (thi
19630 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73  s was not always
19640 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20   the case)..    
19650 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
19660 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e  pColl || pColl->
19670 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28  xCmp );..    if(
19680 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
19690 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61  return vdbeCompa
196a0 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d  reMemString(pMem
196b0 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 29  1, pMem2, pColl)
196c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
196d0 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  f a NULL pointer
196e0 20 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74   was passed as t
196f0 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74  he collate funct
19700 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  ion, fall throug
19710 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  h.    ** to the 
19720 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73  blob case and us
19730 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a  e memcmp().  */.
19740 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20    }. .  /* Both 
19750 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62  values must be b
19760 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75  lobs.  Compare u
19770 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20  sing memcmp().  
19780 2a 2f 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70  */.  rc = memcmp
19790 28 70 4d 65 6d 31 2d 3e 7a 2c 20 70 4d 65 6d 32  (pMem1->z, pMem2
197a0 2d 3e 7a 2c 20 28 70 4d 65 6d 31 2d 3e 6e 3e 70  ->z, (pMem1->n>p
197b0 4d 65 6d 32 2d 3e 6e 29 3f 70 4d 65 6d 32 2d 3e  Mem2->n)?pMem2->
197c0 6e 3a 70 4d 65 6d 31 2d 3e 6e 29 3b 0a 20 20 69  n:pMem1->n);.  i
197d0 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
197e0 72 63 20 3d 20 70 4d 65 6d 31 2d 3e 6e 20 2d 20  rc = pMem1->n - 
197f0 70 4d 65 6d 32 2d 3e 6e 3b 0a 20 20 7d 0a 20 20  pMem2->n;.  }.  
19800 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
19810 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
19820 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
19830 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
19840 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70 65  is a serial-type
19850 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70   that.** corresp
19860 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65 67  onds to an integ
19870 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20  er - all values 
19880 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39 20  between 1 and 9 
19890 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78  inclusive .** ex
198a0 63 65 70 74 20 37 2e 20 54 68 65 20 73 65 63 6f  cept 7. The seco
198b0 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  nd points to a b
198c0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
198d0 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75   an integer valu
198e0 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 20  e.** serialized 
198f0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65 72  according to ser
19900 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20 66  ial_type. This f
19910 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c  unction deserial
19920 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75  izes.** and retu
19930 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a  rns the value..*
19940 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76 64 62  /.static i64 vdb
19950 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74  eRecordDecodeInt
19960 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
19970 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79  , const u8 *aKey
19980 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61 73  ){.  u32 y;.  as
19990 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
199a0 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65   || (serial_type
199b0 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74 79  >=1 && serial_ty
199c0 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c 5f  pe<=9 && serial_
199d0 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73 77  type!=7) );.  sw
199e0 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
199f0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a  e ){.    case 0:
19a00 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20  .    case 1:.   
19a10 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
19a20 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
19a30 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59     return ONE_BY
19a40 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
19a50 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20    case 2:.      
19a60 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
19a70 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
19a80 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f  return TWO_BYTE_
19a90 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
19aa0 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65 73  ase 3:.      tes
19ab0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
19ac0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
19ad0 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f 49  urn THREE_BYTE_I
19ae0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61  NT(aKey);.    ca
19af0 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74 65  se 4: {.      te
19b00 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
19b10 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79 20  0x80 );.      y 
19b20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
19b30 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72 65  (aKey);.      re
19b40 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a  turn (i64)*(int*
19b50 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  )&y;.    }.    c
19b60 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20 74  ase 5: {.      t
19b70 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
19b80 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
19b90 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f  eturn FOUR_BYTE_
19ba0 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28  UINT(aKey+2) + (
19bb0 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
19bc0 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
19bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19be0 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34 20   6: {.      u64 
19bf0 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
19c00 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
19c10 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
19c20 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
19c30 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f  x = (x<<32) | FO
19c40 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
19c50 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74 75  y+4);.      retu
19c60 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29 26  rn (i64)*(i64*)&
19c70 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  x;.    }.  }..  
19c80 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
19c90 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a  ype - 8);.}../*.
19ca0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
19cb0 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77   compares the tw
19cc0 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20  o table rows or 
19cd0 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a  index records.**
19ce0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e   specified by {n
19cf0 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64  Key1, pKey1} and
19d00 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74   pPKey2.  It ret
19d10 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c  urns a negative,
19d20 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
19d30 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20  tive integer if 
19d40 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
19d50 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a  n, equal to or .
19d60 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
19d70 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79  key2.  The {nKey
19d80 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75  1, pKey1} key mu
19d90 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20  st be a blob.** 
19da0 63 72 65 61 74 65 64 20 62 79 20 74 68 20 4f 50  created by th OP
19db0 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
19dc0 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20  de of the VDBE. 
19dd0 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b   The pPKey2.** k
19de0 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72  ey must be a par
19df0 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20  sed key such as 
19e00 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
19e10 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73   sqlite3VdbePars
19e20 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49  eRecord..**.** I
19e30 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70  f argument bSkip
19e40 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74   is non-zero, it
19e50 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
19e60 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
19e70 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72  already.** deter
19e80 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66  mined that the f
19e90 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74  irst fields of t
19ea0 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  he keys are equa
19eb0 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e  l..**.** Key1 an
19ec0 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61  d Key2 do not ha
19ed0 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ve to contain th
19ee0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
19ef0 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20   fields. If all 
19f00 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20  .** fields that 
19f10 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b  appear in both k
19f20 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74  eys are equal, t
19f30 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  hen pPKey2->defa
19f40 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65  ult_rc is .** re
19f50 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
19f60 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
19f70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72  tion is discover
19f80 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e  ed, set pPKey2->
19f90 69 73 43 6f 72 72 75 70 74 20 74 6f 20 6e 6f 6e  isCorrupt to non
19fa0 2d 7a 65 72 6f 0a 2a 2a 20 61 6e 64 20 72 65 74  -zero.** and ret
19fb0 75 72 6e 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urn 0..*/.int sq
19fc0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
19fd0 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b  ompare(.  int nK
19fe0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
19ff0 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66  *pKey1,   /* Lef
1a000 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
1a010 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
1a020 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69  2,         /* Ri
1a030 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ght key */.  int
1a040 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20   bSkip          
1a050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a060 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68  If true, skip th
1a070 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f  e first field */
1a080 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20  .){.  u32 d1;   
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0a0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1a0b0 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
1a0c0 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
1a0d0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0f0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1a100 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20  f next field to 
1a110 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32  compare */.  u32
1a120 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a140 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68  Size of record h
1a150 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a  eader in bytes *
1a160 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
1a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a180 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
1a190 20 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68   first type in h
1a1a0 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  eader */.  int r
1a1b0 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
1a1c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1a1d0 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  turn value */.  
1a1e0 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65  Mem *pRhs = pPKe
1a1f0 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20  y2->aMem;       
1a200 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66  /* Next field of
1a210 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61   pPKey2 to compa
1a220 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  re */.  KeyInfo 
1a230 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65  *pKeyInfo = pPKe
1a240 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
1a250 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1a260 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
1a270 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1a280 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d  r *)pKey1;.  Mem
1a290 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20   mem1;..  /* If 
1a2a0 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74  bSkip is true, t
1a2b0 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hen the caller h
1a2c0 61 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72  as already deter
1a2d0 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66  mined that the f
1a2e0 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c  irst.  ** two el
1a2f0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65  ements in the ke
1a300 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69  ys are equal. Fi
1a310 78 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  x the various st
1a320 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f  ack variables so
1a330 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20  .  ** that this 
1a340 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63  routine begins c
1a350 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20  omparing at the 
1a360 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f  second field. */
1a370 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a  .  if( bSkip ){.
1a380 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20      u32 s1;.    
1a390 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61  idx1 = 1 + getVa
1a3a0 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d  rint32(&aKey1[1]
1a3b0 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72  , s1);.    szHdr
1a3c0 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20  1 = aKey1[0];.  
1a3d0 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20    d1 = szHdr1 + 
1a3e0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1a3f0 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20  lTypeLen(s1);.  
1a400 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68    i = 1;.    pRh
1a410 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s++;.  }else{.  
1a420 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69    idx1 = getVari
1a430 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64  nt32(aKey1, szHd
1a440 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a  r1);.    d1 = sz
1a450 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31  Hdr1;.    if( d1
1a460 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  >(unsigned)nKey1
1a470 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79   ){ .      pPKey
1a480 32 2d 3e 69 73 43 6f 72 72 75 70 74 20 3d 20 28  2->isCorrupt = (
1a490 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
1a4a0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
1a4b0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72  turn 0;  /* Corr
1a4c0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a  uption */.    }.
1a4d0 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a      i = 0;.  }..
1a4e0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
1a4f0 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20  .zMalloc = 0; ) 
1a500 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62  /* Only needed b
1a510 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  y assert() state
1a520 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  ments */.  asser
1a530 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  t( pPKey2->pKeyI
1a540 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65  nfo->nField+pPKe
1a550 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58  y2->pKeyInfo->nX
1a560 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e  Field>=pPKey2->n
1a570 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c  Field .       ||
1a580 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1a590 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
1a5a0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74  >pKeyInfo->aSort
1a5b0 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Order!=0 );.  as
1a5c0 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
1a5d0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30  eyInfo->nField>0
1a5e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
1a5f0 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f  x1<=szHdr1 || CO
1a600 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f  RRUPT_DB );.  do
1a610 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
1a620 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52  _type;..    /* R
1a630 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  HS is an integer
1a640 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73   */.    if( pRhs
1a650 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
1a660 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61  t ){.      seria
1a670 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
1a680 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74  dx1];.      test
1a690 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
1a6a0 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
1a6b0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
1a6c0 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  12 ){.        rc
1a6d0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1a6e0 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
1a6f0 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pe==0 ){.       
1a700 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1a710 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
1a720 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
1a730 20 20 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d      double rhs =
1a740 20 28 64 6f 75 62 6c 65 29 70 52 68 73 2d 3e 75   (double)pRhs->u
1a750 2e 69 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  .i;.        sqli
1a760 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1a770 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
1a780 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29  ial_type, &mem1)
1a790 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65  ;.        if( me
1a7a0 6d 31 2e 72 3c 72 68 73 20 29 7b 0a 20 20 20 20  m1.r<rhs ){.    
1a7b0 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1a7c0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1a7d0 20 6d 65 6d 31 2e 72 3e 72 68 73 20 29 7b 0a 20   mem1.r>rhs ){. 
1a7e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
1a7f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a810 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52   i64 lhs = vdbeR
1a820 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73  ecordDecodeInt(s
1a830 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65  erial_type, &aKe
1a840 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20  y1[d1]);.       
1a850 20 69 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d   i64 rhs = pRhs-
1a860 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66  >u.i;.        if
1a870 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20  ( lhs<rhs ){.   
1a880 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1a890 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1a8a0 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20  ( lhs>rhs ){.   
1a8b0 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1a8c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a8d0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1a8e0 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20  RHS is real */. 
1a8f0 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73     else if( pRhs
1a900 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
1a910 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69  al ){.      seri
1a920 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
1a930 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28  idx1];.      if(
1a940 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
1a950 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1a960 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1a970 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1a980 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1a990 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1a9a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 6f 75  lse{.        dou
1a9b0 62 6c 65 20 72 68 73 20 3d 20 70 52 68 73 2d 3e  ble rhs = pRhs->
1a9c0 72 3b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c  r;.        doubl
1a9d0 65 20 6c 68 73 3b 0a 20 20 20 20 20 20 20 20 73  e lhs;.        s
1a9e0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1a9f0 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
1aa00 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65  serial_type, &me
1aa10 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  m1);.        if(
1aa20 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
1aa30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 68 73  ){.          lhs
1aa40 20 3d 20 6d 65 6d 31 2e 72 3b 0a 20 20 20 20 20   = mem1.r;.     
1aa50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1aa60 20 20 20 20 6c 68 73 20 3d 20 28 64 6f 75 62 6c      lhs = (doubl
1aa70 65 29 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20  e)mem1.u.i;.    
1aa80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1aa90 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20  ( lhs<rhs ){.   
1aaa0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1aab0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1aac0 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20  ( lhs>rhs ){.   
1aad0 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1aae0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1aaf0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1ab00 52 48 53 20 69 73 20 61 20 73 74 72 69 6e 67 20  RHS is a string 
1ab10 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
1ab20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1ab30 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67  M_Str ){.      g
1ab40 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1ab50 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f  1[idx1], serial_
1ab60 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73  type);.      tes
1ab70 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
1ab80 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
1ab90 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
1aba0 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  12 ){.        rc
1abb0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1abc0 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f  se if( !(serial_
1abd0 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a  type & 0x01) ){.
1abe0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1abf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ac00 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28        mem1.n = (
1ac10 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32  serial_type - 12
1ac20 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74  ) / 2;.        t
1ac30 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d  estcase( (d1+mem
1ac40 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  1.n)==(unsigned)
1ac50 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
1ac60 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d   testcase( (d1+m
1ac70 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67  em1.n+1)==(unsig
1ac80 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
1ac90 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d       if( (d1+mem
1aca0 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64  1.n) > (unsigned
1acb0 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20  )nKey1 ){.      
1acc0 20 20 20 20 70 50 4b 65 79 32 2d 3e 69 73 43 6f      pPKey2->isCo
1acd0 72 72 75 70 74 20 3d 20 28 75 38 29 53 51 4c 49  rrupt = (u8)SQLI
1ace0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1acf0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1ad00 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1ad10 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
1ad20 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  n */.        }el
1ad30 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  se if( pKeyInfo-
1ad40 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20  >aColl[i] ){.   
1ad50 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20         mem1.enc 
1ad60 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1ad70 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
1ad80 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
1ad90 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  b;.          mem
1ada0 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  1.flags = MEM_St
1adb0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  r;.          mem
1adc0 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b  1.z = (char*)&aK
1add0 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20  ey1[d1];.       
1ade0 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70     rc = vdbeComp
1adf0 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 26 6d 65  areMemString(&me
1ae00 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e  m1, pRhs, pKeyIn
1ae10 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20  fo->aColl[i]);. 
1ae20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ae30 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70          int nCmp
1ae40 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70   = MIN(mem1.n, p
1ae50 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  Rhs->n);.       
1ae60 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26     rc = memcmp(&
1ae70 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d  aKey1[d1], pRhs-
1ae80 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20  >z, nCmp);.     
1ae90 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29       if( rc==0 )
1aea0 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70   rc = mem1.n - p
1aeb0 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20  Rhs->n; .       
1aec0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1aed0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1aee0 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c  a blob */.    el
1aef0 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1af00 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b  gs & MEM_Blob ){
1af10 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74  .      getVarint
1af20 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c  32(&aKey1[idx1],
1af30 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
1af40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
1af50 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29  erial_type==12 )
1af60 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
1af70 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28 73  al_type<12 || (s
1af80 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
1af90 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
1afa0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1afb0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
1afc0 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74  nStr = (serial_t
1afd0 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20  ype - 12) / 2;. 
1afe0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1aff0 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73   (d1+nStr)==(uns
1b000 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
1b010 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1b020 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75   (d1+nStr+1)==(u
1b030 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1b040 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31  .        if( (d1
1b050 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67 6e  +nStr) > (unsign
1b060 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20  ed)nKey1 ){.    
1b070 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 69 73        pPKey2->is
1b080 43 6f 72 72 75 70 74 20 3d 20 28 75 38 29 53 51  Corrupt = (u8)SQ
1b090 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1b0a0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  T;.          ret
1b0b0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1b0c0 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74        /* Corrupt
1b0d0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ion */.        }
1b0e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1b0f0 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e  int nCmp = MIN(n
1b100 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20  Str, pRhs->n);. 
1b110 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65           rc = me
1b120 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c  mcmp(&aKey1[d1],
1b130 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b   pRhs->z, nCmp);
1b140 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1b150 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72  c==0 ) rc = nStr
1b160 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20   - pRhs->n;.    
1b170 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b180 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
1b190 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65  is null */.    e
1b1a0 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61  lse{.      seria
1b1b0 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
1b1c0 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d  dx1];.      rc =
1b1d0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30   (serial_type!=0
1b1e0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1b1f0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
1b200 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
1b210 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
1b220 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63          rc = -rc
1b230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b240 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
1b250 44 42 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  DB.          || 
1b260 28 72 63 3c 30 20 26 26 20 76 64 62 65 52 65 63  (rc<0 && vdbeRec
1b270 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1b280 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1b290 4b 65 79 32 29 3c 30 29 0a 20 20 20 20 20 20 20  Key2)<0).       
1b2a0 20 20 20 7c 7c 20 28 72 63 3e 30 20 26 26 20 76     || (rc>0 && v
1b2b0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1b2c0 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
1b2d0 79 31 2c 20 70 50 4b 65 79 32 29 3e 30 29 0a 20  y1, pPKey2)>0). 
1b2e0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4b 65 79           || pKey
1b2f0 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
1b300 46 61 69 6c 65 64 0a 20 20 20 20 20 20 29 3b 0a  Failed.      );.
1b310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
1b320 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  m1.zMalloc==0 );
1b330 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    /* See comment
1b340 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
1b350 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1b360 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70  ..    i++;.    p
1b370 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d  Rhs++;.    d1 +=
1b380 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1b390 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
1b3a0 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31  _type);.    idx1
1b3b0 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e   += sqlite3Varin
1b3c0 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  tLen(serial_type
1b3d0 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  );.  }while( idx
1b3e0 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64  1<(unsigned)szHd
1b3f0 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
1b400 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75  nField && d1<=(u
1b410 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1b420 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
1b430 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
1b440 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
1b450 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
1b460 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
1b470 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
1b480 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
1b490 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
1b4a0 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
1b4b0 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
1b4c0 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
1b4d0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
1b4e0 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20  e(&mem1).  */.  
1b4f0 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61  assert( mem1.zMa
1b500 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lloc==0 );..  /*
1b510 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
1b520 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f  s that one or bo
1b530 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  th of the keys r
1b540 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
1b550 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68   and.  ** all th
1b560 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
1b570 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65  hat point were e
1b580 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65  qual. Return the
1b590 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a   the default_rc.
1b5a0 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a    ** value.  */.
1b5b0 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
1b5c0 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  T_DB .       || 
1b5d0 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1b5e0 72 63 3d 3d 76 64 62 65 52 65 63 6f 72 64 43 6f  rc==vdbeRecordCo
1b5f0 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
1b600 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29  , pKey1, pPKey2)
1b610 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b 65 79   .       || pKey
1b620 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
1b630 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65  Failed.  );.  re
1b640 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  turn pPKey2->def
1b650 61 75 6c 74 5f 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  ault_rc;.}../*.*
1b660 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1b670 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
1b680 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
1b690 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1b6a0 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28  are() .** that (
1b6b0 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  a) the first fie
1b6c0 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20  ld of pPKey2 is 
1b6d0 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20  an integer, and 
1b6e0 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65  (b) the .** size
1b6f0 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
1b700 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
1b710 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  f (pKey1/nKey1) 
1b720 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
1b730 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69  .** byte (i.e. i
1b740 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29  s less than 128)
1b750 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
1b760 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20   concerns about 
1b770 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73  buffer overreads
1b780 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1b790 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f  s only used.** o
1b7a0 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72 65 20  n schemas where 
1b7b0 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69  the maximum vali
1b7c0 64 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73  d header size is
1b7d0 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73   63 bytes or les
1b7e0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1b7f0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1b800 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65  reInt(.  int nKe
1b810 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1b820 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
1b830 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1b840 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20  Record *pPKey2, 
1b850 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
1b860 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69  ey */.  int bSki
1b870 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
1b880 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 64        /* Ignored
1b890 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
1b8a0 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e  8 *aKey = &((con
1b8b0 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28  st u8*)pKey1)[*(
1b8c0 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20  const u8*)pKey1 
1b8d0 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73  & 0x3F];.  int s
1b8e0 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63  erial_type = ((c
1b8f0 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b  onst u8*)pKey1)[
1b900 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  1];.  int res;. 
1b910 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b   u32 y;.  u64 x;
1b920 0a 20 20 69 36 34 20 76 20 3d 20 70 50 4b 65 79  .  i64 v = pPKey
1b930 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a  2->aMem[0].u.i;.
1b940 20 20 69 36 34 20 6c 68 73 3b 0a 20 20 55 4e 55    i64 lhs;.  UNU
1b950 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 62 53  SED_PARAMETER(bS
1b960 6b 69 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  kip);..  assert(
1b970 20 62 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 61   bSkip==0 );.  a
1b980 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b  ssert( (*(u8*)pK
1b990 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f  ey1)<=0x3F || CO
1b9a0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77  RRUPT_DB );.  sw
1b9b0 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
1b9c0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a  e ){.    case 1:
1b9d0 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67   { /* 1-byte sig
1b9e0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1b9f0 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42       lhs = ONE_B
1ba00 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1ba10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1ba20 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1ba30 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1ba40 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
1ba50 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1ba60 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
1ba70 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b   TWO_BYTE_INT(aK
1ba80 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1ba90 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1baa0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bab0 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
1bac0 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
1bad0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1bae0 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54   lhs = THREE_BYT
1baf0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1bb00 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1bb10 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1bb20 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1bb30 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
1bb40 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1bb50 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55  */.      y = FOU
1bb60 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1bb70 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28  );.      lhs = (
1bb80 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20  i64)*(int*)&y;. 
1bb90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1bba0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1bbb0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1bbc0 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
1bbd0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1bbe0 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
1bbf0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1bc00 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34  aKey+2) + (((i64
1bc10 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
1bc20 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1bc30 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1bc40 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1bc50 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1bc60 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65  e 6: { /* 8-byte
1bc70 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1bc80 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55  */.      x = FOU
1bc90 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1bca0 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  );.      x = (x<
1bcb0 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45  <32) | FOUR_BYTE
1bcc0 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20  _UINT(aKey+4);. 
1bcd0 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34       lhs = *(i64
1bce0 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&x;.      test
1bcf0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1bd00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bd10 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20  }.    case 8: . 
1bd20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20       lhs = 0;.  
1bd30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1bd40 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73  ase 9:.      lhs
1bd50 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
1bd60 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  k;..    /* This 
1bd70 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65  case could be re
1bd80 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 68  moved without ch
1bd90 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c  anging the resul
1bda0 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20  ts of running.  
1bdb0 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20    ** this code. 
1bdc0 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75  Including it cau
1bdd0 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72  ses gcc to gener
1bde0 61 74 65 20 61 20 66 61 73 74 65 72 20 73 77 69  ate a faster swi
1bdf0 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74  tch .    ** stat
1be00 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65  ement (since the
1be10 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68   range of switch
1be20 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61   targets now sta
1be30 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a  rts at zero and.
1be40 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67      ** is contig
1be50 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e  uous) but does n
1be60 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 70  ot cause any dup
1be70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62  licate code to b
1be80 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20  e generated.    
1be90 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 6c  ** (as gcc is cl
1bea0 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63  ever enough to c
1beb0 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c  ombine the two l
1bec0 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65  ike cases). Othe
1bed0 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  r .    ** compil
1bee0 65 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d  ers might be sim
1bef0 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63  ilar.  */ .    c
1bf00 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20  ase 0: case 7:. 
1bf10 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1bf20 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1bf30 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79  pare(nKey1, pKey
1bf40 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a 0a  1, pPKey2, 0);..
1bf50 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
1bf60 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1bf70 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1bf80 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  re(nKey1, pKey1,
1bf90 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a 20 20 7d   pPKey2, 0);.  }
1bfa0 0a 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29 7b  ..  if( v>lhs ){
1bfb0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
1bfc0 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69  2->r1;.  }else i
1bfd0 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20  f( v<lhs ){.    
1bfe0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
1bff0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
1c000 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29  Key2->nField>1 )
1c010 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
1c020 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  st fields of the
1c030 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71   two keys are eq
1c040 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68 65  ual. Compare the
1c050 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a   trailing .    *
1c060 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20  * fields.  */.  
1c070 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56    res = sqlite3V
1c080 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c090 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1c0a0 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c  PKey2, 1);.  }el
1c0b0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  se{.    /* The f
1c0c0 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74  irst fields of t
1c0d0 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20  he two keys are 
1c0e0 65 71 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20  equal and there 
1c0f0 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a  are no trailing.
1c100 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52      ** fields. R
1c110 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65  eturn pPKey2->de
1c120 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73  fault_rc in this
1c130 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65   case. */.    re
1c140 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  s = pPKey2->defa
1c150 75 6c 74 5f 72 63 3b 0a 20 20 7d 0a 0a 20 20 61  ult_rc;.  }..  a
1c160 73 73 65 72 74 28 20 28 72 65 73 3d 3d 30 20 26  ssert( (res==0 &
1c170 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  & vdbeRecordComp
1c180 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1c190 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3d 3d  pKey1, pPKey2)==
1c1a0 30 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 72 65  0).       || (re
1c1b0 73 3c 30 20 26 26 20 76 64 62 65 52 65 63 6f 72  s<0 && vdbeRecor
1c1c0 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1c1d0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1c1e0 79 32 29 3c 30 29 0a 20 20 20 20 20 20 20 7c 7c  y2)<0).       ||
1c1f0 20 28 72 65 73 3e 30 20 26 26 20 76 64 62 65 52   (res>0 && vdbeR
1c200 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1c210 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
1c220 70 50 4b 65 79 32 29 3e 30 29 0a 20 20 20 20 20  pPKey2)>0).     
1c230 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a    || CORRUPT_DB.
1c240 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65    );.  return re
1c250 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s;.}../*.** This
1c260 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
1c270 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f  optimized versio
1c280 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
1c290 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1c2a0 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65  .** that (a) the
1c2b0 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20   first field of 
1c2c0 70 50 4b 65 79 32 20 69 73 20 61 20 73 74 72 69  pPKey2 is a stri
1c2d0 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74 68 65  ng, that (b) the
1c2e0 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20   first field.** 
1c2f0 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  uses the collati
1c300 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41  on sequence BINA
1c310 52 59 20 61 6e 64 20 28 63 29 20 74 68 61 74 20  RY and (c) that 
1c320 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64  the size-of-head
1c330 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74  er varint .** at
1c340 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70   the start of (p
1c350 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73  Key1/nKey1) fits
1c360 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74   in a single byt
1c370 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1c380 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1c390 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20  reString(.  int 
1c3a0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1c3b0 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
1c3c0 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
1c3d0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
1c3e0 32 2c 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2,       /* Righ
1c3f0 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  t key */.  int b
1c400 53 6b 69 70 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  Skip.){.  const 
1c410 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  u8 *aKey1 = (con
1c420 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20  st u8*)pKey1;.  
1c430 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  int serial_type;
1c440 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 55 4e  .  int res;.  UN
1c450 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 62  USED_PARAMETER(b
1c460 53 6b 69 70 29 3b 0a 0a 20 20 61 73 73 65 72 74  Skip);..  assert
1c470 28 20 62 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20  ( bSkip==0 );.  
1c480 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1c490 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  y1[1], serial_ty
1c4a0 70 65 29 3b 0a 0a 20 20 69 66 28 20 73 65 72 69  pe);..  if( seri
1c4b0 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20  al_type<12 ){.  
1c4c0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1c4d0 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65  r1;      /* (pKe
1c4e0 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e  y1/nKey1) is a n
1c4f0 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20  umber or a null 
1c500 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  */.  }else if( !
1c510 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30  (serial_type & 0
1c520 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73  x01) ){ .    res
1c530 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20   = pPKey2->r2;  
1c540 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b      /* (pKey1/nK
1c550 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a  ey1) is a blob *
1c560 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  /.  }else{.    i
1c570 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74  nt nCmp;.    int
1c580 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73   nStr;.    int s
1c590 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b  zHdr = aKey1[0];
1c5a0 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65  ..    nStr = (se
1c5b0 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20  rial_type-12) / 
1c5c0 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64  2;.    if( (szHd
1c5d0 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79  r + nStr) > nKey
1c5e0 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79  1 ){.      pPKey
1c5f0 32 2d 3e 69 73 43 6f 72 72 75 70 74 20 3d 20 28  2->isCorrupt = (
1c600 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
1c610 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
1c620 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f  turn 0;    /* Co
1c630 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1c640 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e  }.    nCmp = MIN
1c650 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  ( pPKey2->aMem[0
1c660 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20  ].n, nStr );.   
1c670 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61   res = memcmp(&a
1c680 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b  Key1[szHdr], pPK
1c690 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20  ey2->aMem[0].z, 
1c6a0 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20  nCmp);..    if( 
1c6b0 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
1c6c0 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b  res = nStr - pPK
1c6d0 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a  ey2->aMem[0].n;.
1c6e0 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
1c6f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1c700 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31  pPKey2->nField>1
1c710 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1c720 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
1c730 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65  ecordCompare(nKe
1c740 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1c750 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  2, 1);.        }
1c760 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1c770 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65  res = pPKey2->de
1c780 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20  fault_rc;.      
1c790 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
1c7a0 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
1c7b0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
1c7c0 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c  2->r2;.      }el
1c7d0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20  se{.        res 
1c7e0 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
1c7f0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
1c800 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
1c810 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1c820 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >r2;.    }else{.
1c830 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
1c840 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20  y2->r1;.    }.  
1c850 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 72 65  }..  assert( (re
1c860 73 3d 3d 30 20 26 26 20 76 64 62 65 52 65 63 6f  s==0 && vdbeReco
1c870 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
1c880 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1c890 65 79 32 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  ey2)==0).       
1c8a0 7c 7c 20 28 72 65 73 3c 30 20 26 26 20 76 64 62  || (res<0 && vdb
1c8b0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1c8c0 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
1c8d0 2c 20 70 50 4b 65 79 32 29 3c 30 29 0a 20 20 20  , pPKey2)<0).   
1c8e0 20 20 20 20 7c 7c 20 28 72 65 73 3e 30 20 26 26      || (res>0 &&
1c8f0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1c900 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1c910 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3e 30 29  Key1, pPKey2)>0)
1c920 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55  .       || CORRU
1c930 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20  PT_DB.       || 
1c940 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1c950 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1c960 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  ed.  );.  return
1c970 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   res;.}../*.** R
1c980 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1c990 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62  to an sqlite3Vdb
1c9a0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1c9b0 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63   compatible func
1c9c0 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65  tion.** suitable
1c9d0 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73   for comparing s
1c9e0 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64  erialized record
1c9f0 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65  s to the unpacke
1ca00 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a  d record passed.
1ca10 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ** as the only a
1ca20 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f  rgument..*/.Reco
1ca30 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65  rdCompare sqlite
1ca40 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65  3VdbeFindCompare
1ca50 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
1ca60 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74  *p){.  /* varint
1ca70 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
1ca80 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63  () and varintRec
1ca90 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
1caa0 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20  () both assume. 
1cab0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a   ** that the siz
1cac0 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
1cad0 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 20 61  nt that occurs a
1cae0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
1caf0 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20  ach record.  ** 
1cb00 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
1cb10 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31   byte (i.e. is 1
1cb20 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72  27 or less). var
1cb30 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
1cb40 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20  Int().  ** also 
1cb50 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20  assumes that it 
1cb60 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72  is safe to overr
1cb70 65 61 64 20 61 20 62 75 66 66 65 72 20 62 79 20  ead a buffer by 
1cb80 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20  at least the .  
1cb90 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69  ** maximum possi
1cba0 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72  ble legal header
1cbb0 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74   size plus 8 byt
1cbc0 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 65 72  es. Because ther
1cbd0 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e  e is.  ** guaran
1cbe0 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65  teed to be at le
1cbf0 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20  ast 74 (but not 
1cc00 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 70 61  136) bytes of pa
1cc10 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20  dding following 
1cc20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72  each.  ** buffer
1cc30 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e   passed to varin
1cc40 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
1cc50 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69  t() this makes i
1cc60 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a  t convenient to.
1cc70 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73    ** limit the s
1cc80 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
1cc90 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e  r to 64 bytes in
1cca0 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
1ccb0 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a   first field.  *
1ccc0 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  * is an integer.
1ccd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65  .  **.  ** The e
1cce0 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e  asiest way to en
1ccf0 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74  force this limit
1cd00 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20   is to consider 
1cd10 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74  only records wit
1cd20 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73  h.  ** 13 fields
1cd30 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65   or less. If the
1cd40 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 73 20   first field is 
1cd50 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20  an integer, the 
1cd60 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20  maximum legal.  
1cd70 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20 69  ** header size i
1cd80 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29  s (12*5 + 1 + 1)
1cd90 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66   bytes.  */.  if
1cda0 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  ( (p->pKeyInfo->
1cdb0 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79  nField + p->pKey
1cdc0 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d  Info->nXField)<=
1cdd0 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c  13 ){.    int fl
1cde0 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d  ags = p->aMem[0]
1cdf0 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20  .flags;.    if( 
1ce00 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  p->pKeyInfo->aSo
1ce10 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20  rtOrder[0] ){.  
1ce20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20      p->r1 = 1;. 
1ce30 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b       p->r2 = -1;
1ce40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ce50 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20    p->r1 = -1;.  
1ce60 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20      p->r2 = 1;. 
1ce70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c     }.    if( (fl
1ce80 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29  ags & MEM_Int) )
1ce90 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  {.      return v
1cea0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1ceb0 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  Int;.    }.    t
1cec0 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
1ced0 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20   MEM_Real );.   
1cee0 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
1cef0 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20   & MEM_Null );. 
1cf00 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
1cf10 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
1cf20 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
1cf30 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  & (MEM_Real|MEM_
1cf40 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d  Null|MEM_Blob))=
1cf50 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66  =0 && p->pKeyInf
1cf60 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29  o->aColl[0]==0 )
1cf70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1cf80 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
1cf90 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1cfa0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1cfb0 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20  eString;.    }. 
1cfc0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   }..  return sql
1cfd0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1cfe0 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mpare;.}../*.** 
1cff0 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
1d000 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
1d010 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
1d020 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
1d030 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
1d040 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
1d050 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
1d060 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
1d070 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
1d080 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
1d090 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
1d0a0 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
1d0b0 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
1d0c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d  se..**.** pCur m
1d0d0 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  ight be pointing
1d0e0 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65   to text obtaine
1d0f0 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74  d from a corrupt
1d100 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1d110 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ** So the conten
1d120 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  t cannot be trus
1d130 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72  ted.  Do appropr
1d140 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74  iate checks on t
1d150 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69  he content..*/.i
1d160 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
1d170 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  xRowid(sqlite3 *
1d180 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43  db, BtCursor *pC
1d190 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b  ur, i64 *rowid){
1d1a0 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
1d1b0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
1d1c0 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
1d1d0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1d1e0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
1d1f0 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
1d200 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
1d210 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
1d220 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20   u32 lenRowid;  
1d230 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1d240 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d  e rowid */.  Mem
1d250 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53 45 44   m, v;..  UNUSED
1d260 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
1d270 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69  .  /* Get the si
1d280 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
1d290 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64  entry.  Only ind
1d2a0 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20  ices entries of 
1d2b0 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32  less.  ** than 2
1d2c0 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20  GiB are support 
1d2d0 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65  - anything large
1d2e0 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73   must be databas
1d2f0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
1d300 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f  ** Any corruptio
1d310 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e  n is detected in
1d320 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
1d330 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f  seCellPtr(), tho
1d340 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69  ugh, so.  ** thi
1d350 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c  s code can safel
1d360 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43  y assume that nC
1d370 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74  ellKey is 32-bit
1d380 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s  .  */.  asser
1d390 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
1d3a0 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
1d3b0 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  r) );.  VVA_ONLY
1d3c0 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74  (rc =) sqlite3Bt
1d3d0 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
1d3e0 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61   &nCellKey);.  a
1d3f0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
1d400 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70  E_OK );     /* p
1d410 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61  Cur is always va
1d420 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63  lid so KeySize c
1d430 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20  annot fail */.  
1d440 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65  assert( (nCellKe
1d450 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55  y & SQLITE_MAX_U
1d460 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b  32)==(u64)nCellK
1d470 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  ey );..  /* Read
1d480 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   in the complete
1d490 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
1d4a0 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20  index entry */. 
1d4b0 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73   memset(&m, 0, s
1d4c0 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20  izeof(m));.  rc 
1d4d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
1d4e0 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
1d4f0 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79  0, (u32)nCellKey
1d500 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
1d510 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
1d520 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   rc;.  }..  /* T
1d530 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d  he index entry m
1d540 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  ust begin with a
1d550 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a   header size */.
1d560 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
1d570 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a  t32((u8*)m.z, sz
1d580 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65  Hdr);.  testcase
1d590 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20  ( szHdr==3 );.  
1d5a0 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
1d5b0 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e  =m.n );.  if( un
1d5c0 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c  likely(szHdr<3 |
1d5d0 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e  | (int)szHdr>m.n
1d5e0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
1d5f0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
1d600 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  on;.  }..  /* Th
1d610 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20  e last field of 
1d620 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  the index should
1d630 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   be an integer -
1d640 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a   the ROWID..  **
1d650 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1d660 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c   last entry real
1d670 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ly is an integer
1d680 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
1d690 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
1d6a0 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70  .z[szHdr-1], typ
1d6b0 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
1d6c0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1d6d0 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
1d6e0 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b   typeRowid==2 );
1d6f0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1d700 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74  eRowid==3 );.  t
1d710 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1d720 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63  id==4 );.  testc
1d730 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1d740 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  5 );.  testcase(
1d750 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b   typeRowid==6 );
1d760 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1d770 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74  eRowid==8 );.  t
1d780 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1d790 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75  id==9 );.  if( u
1d7a0 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69  nlikely(typeRowi
1d7b0 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d<1 || typeRowid
1d7c0 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d  >9 || typeRowid=
1d7d0 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =7) ){.    goto 
1d7e0 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
1d7f0 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52  tion;.  }.  lenR
1d800 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64  owid = sqlite3Vd
1d810 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1d820 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65  typeRowid);.  te
1d830 73 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e  stcase( (u32)m.n
1d840 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  ==szHdr+lenRowid
1d850 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
1d860 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64  ly((u32)m.n<szHd
1d870 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20  r+lenRowid) ){. 
1d880 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
1d890 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
1d8a0 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68  }..  /* Fetch th
1d8b0 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68  e integer off th
1d8c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
1d8d0 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73  ex record */.  s
1d8e0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1d8f0 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e  Get((u8*)&m.z[m.
1d900 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70  n-lenRowid], typ
1d910 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a  eRowid, &v);.  *
1d920 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20  rowid = v.u.i;. 
1d930 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1d940 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
1d950 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d960 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
1d970 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  if database corr
1d980 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
1d990 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62  ed after m has b
1d9a0 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  een.  ** allocat
1d9b0 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20  ed.  Free the m 
1d9c0 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
1d9d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1d9e0 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63  . */.idx_rowid_c
1d9f0 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73  orruption:.  tes
1da00 74 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63  tcase( m.zMalloc
1da10 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
1da20 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1da30 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
1da40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1da50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
1da60 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  re the key of th
1da70 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68  e index entry th
1da80 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20  at cursor pC is 
1da90 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69  pointing to agai
1daa0 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
1dab0 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b  tring in pUnpack
1dac0 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  ed.  Write into 
1dad0 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
1dae0 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
1daf0 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
1db00 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
1db10 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1db20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
1db30 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64  r than pUnpacked
1db40 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1db50 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
1db60 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20  **.** pUnpacked 
1db70 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65  is either create
1db80 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69  d without a rowi
1db90 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65  d or is truncate
1dba0 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  d so that it.** 
1dbb0 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20  omits the rowid 
1dbc0 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65  at the end.  The
1dbd0 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
1dbe0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  d of the index e
1dbf0 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  ntry.** is ignor
1dc00 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e  ed as well.  Hen
1dc10 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ce, this routine
1dc20 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74   only compares t
1dc30 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20  he prefixes .** 
1dc40 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f  of the keys prio
1dc50 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72  r to the final r
1dc60 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e  owid, not the en
1dc70 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74  tire key..*/.int
1dc80 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
1dc90 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 56 64 62  eyCompare(.  Vdb
1dca0 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20  eCursor *pC,    
1dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dcc0 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
1dcd0 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
1dce0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1dcf0 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20  rd *pUnpacked,  
1dd00 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64       /* Unpacked
1dd10 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20   version of key 
1dd20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20  */.  int *res   
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd40 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1dd50 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65  he comparison re
1dd60 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  sult here */.){.
1dd70 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
1dd80 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
1dd90 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  BtCursor *pCur =
1dda0 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20   pC->pCursor;.  
1ddb0 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74  Mem m;..  assert
1ddc0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
1ddd0 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
1dde0 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) );.  VVA_ONLY(
1ddf0 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72  rc =) sqlite3Btr
1de00 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
1de10 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73  &nCellKey);.  as
1de20 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
1de30 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75  _OK );    /* pCu
1de40 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  r is always vali
1de50 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e  d so KeySize can
1de60 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a  not fail */.  /*
1de70 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61   nCellKey will a
1de80 6c 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e  lways be between
1de90 20 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66   0 and 0xfffffff
1dea0 66 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  f because of the
1deb0 20 77 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62   way.  ** that b
1dec0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
1ded0 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65  () and sqlite3Ge
1dee0 74 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20  tVarint32() are 
1def0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20  implemented */. 
1df00 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30   if( nCellKey<=0
1df10 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37   || nCellKey>0x7
1df20 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a  fffffff ){.    *
1df30 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  res = 0;.    ret
1df40 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1df50 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d  PT_BKPT;.  }.  m
1df60 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a  emset(&m, 0, siz
1df70 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20  eof(m));.  rc = 
1df80 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
1df90 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72  omBtree(pC->pCur
1dfa0 73 6f 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65  sor, 0, (u32)nCe
1dfb0 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
1dfc0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
1dfd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1dfe0 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64  *res = sqlite3Vd
1dff0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1e000 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63  m.n, m.z, pUnpac
1e010 6b 65 64 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ked, 0);.  sqlit
1e020 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1e030 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
1e040 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1e050 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e060 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74  sets the value t
1e070 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
1e080 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
1e090 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  s to.** sqlite3_
1e0a0 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65  changes() on the
1e0b0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1e0c0 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20   'db'. .*/.void 
1e0d0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
1e0e0 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
1e0f0 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b  b, int nChange){
1e100 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1e110 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
1e120 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62  ->mutex) );.  db
1e130 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61  ->nChange = nCha
1e140 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61  nge;.  db->nTota
1e150 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e  lChange += nChan
1e160 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ge;.}../*.** Set
1e170 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76   a flag in the v
1e180 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  dbe to update th
1e190 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1e1a0 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61   when it is fina
1e1b0 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65  lised.** or rese
1e1c0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1e1d0 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67  e3VdbeCountChang
1e1e0 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76  es(Vdbe *v){.  v
1e1f0 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20  ->changeCntOn = 
1e200 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  1;.}../*.** Mark
1e210 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20   every prepared 
1e220 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69  statement associ
1e230 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
1e240 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
1e250 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a  ** as expired..*
1e260 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20  *.** An expired 
1e270 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20  statement means 
1e280 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69  that recompilati
1e290 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  on of the statem
1e2a0 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d  ent is.** recomm
1e2b0 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73  end.  Statements
1e2c0 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69   expire when thi
1e2d0 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20  ngs happen that 
1e2e0 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72  make their.** pr
1e2f0 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e  ograms obsolete.
1e300 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d    Removing user-
1e310 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
1e320 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  s or collating.*
1e330 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20  * sequences, or 
1e340 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68  changing an auth
1e350 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69  orization functi
1e360 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73  on are the types
1e370 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68   of.** things th
1e380 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64  at make prepared
1e390 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f   statements obso
1e3a0 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lete..*/.void sq
1e3b0 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
1e3c0 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71  redStatements(sq
1e3d0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
1e3e0 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d  be *p;.  for(p =
1e3f0 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70   db->pVdbe; p; p
1e400 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1e410 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a  p->expired = 1;.
1e420 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
1e430 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  urn the database
1e440 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1e450 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71   the Vdbe..*/.sq
1e460 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64  lite3 *sqlite3Vd
1e470 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20  beDb(Vdbe *v){. 
1e480 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d   return v->db;.}
1e490 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1e4a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
1e4b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72  qlite3_value str
1e4c0 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
1e4d0 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e  g the value boun
1e4e0 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
1e4f0 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63  Var of VM v. Exc
1e500 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75  ept, if the valu
1e510 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  e is an SQL NULL
1e520 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69  , return .** 0 i
1e530 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69  nstead. Unless i
1e540 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79  t is NULL, apply
1e550 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f   affinity aff (o
1e560 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  ne of the SQLITE
1e570 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61  _AFF_*.** consta
1e580 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75  nts) to the valu
1e590 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
1e5a0 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ng it..**.** The
1e5b0 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
1e5c0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
1e5d0 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
1e5e0 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  g sqlite3ValueFr
1e5f0 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ee()..*/.sqlite3
1e600 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56  _value *sqlite3V
1e610 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65  dbeGetBoundValue
1e620 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56  (Vdbe *v, int iV
1e630 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61  ar, u8 aff){.  a
1e640 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
1e650 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1e660 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e  Mem *pMem = &v->
1e670 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20  aVar[iVar-1];.  
1e680 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e    if( 0==(pMem->
1e690 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
1e6a0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1e6b0 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d  e3_value *pRet =
1e6c0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
1e6d0 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69  (v->db);.      i
1e6e0 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20  f( pRet ){.     
1e6f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1e700 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65  mCopy((Mem *)pRe
1e710 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20  t, pMem);.      
1e720 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70    sqlite3ValueAp
1e730 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 74  plyAffinity(pRet
1e740 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54  , aff, SQLITE_UT
1e750 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  F8);.      }.   
1e760 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a     return pRet;.
1e770 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1e780 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
1e790 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72  onfigure SQL var
1e7a0 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68  iable iVar so th
1e7b0 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77  at binding a new
1e7c0 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67   value to it sig
1e7d0 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  nals.** to sqlit
1e7e0 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20  e3_reoptimize() 
1e7f0 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e  that re-preparin
1e800 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  g the statement 
1e810 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  may result.** in
1e820 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20   a better query 
1e830 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  plan..*/.void sq
1e840 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
1e850 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ask(Vdbe *v, int
1e860 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74   iVar){.  assert
1e870 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66  ( iVar>0 );.  if
1e880 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20  ( iVar>32 ){.   
1e890 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78   v->expmask = 0x
1e8a0 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73  ffffffff;.  }els
1e8b0 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  e{.    v->expmas
1e8c0 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20  k |= ((u32)1 << 
1e8d0 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d  (iVar-1));.  }.}
1e8e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1e8f0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1e900 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  LE./*.** Transfe
1e910 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  r error message 
1e920 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c  text from an sql
1e930 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73  ite3_vtab.zErrMs
1e940 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a  g (text stored.*
1e950 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  * in memory obta
1e960 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
1e970 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61  3_malloc) into a
1e980 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74   Vdbe.zErrMsg (t
1e990 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  ext stored.** in
1e9a0 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
1e9b0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
1e9c0 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20  alloc)..*/.void 
1e9d0 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72  sqlite3VtabImpor
1e9e0 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c  tErrmsg(Vdbe *p,
1e9f0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
1ea00 56 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33  Vtab){.  sqlite3
1ea10 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
1ea20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1ea30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
1ea40 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71   p->zErrMsg = sq
1ea50 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
1ea60 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
1ea70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1ea80 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e(pVtab->zErrMsg
1ea90 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72  );.  pVtab->zErr
1eaa0 4d 73 67 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  Msg = 0;.}.#endi
1eab0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1eac0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
1ead0 0a                                               .