/ Hex Artifact Content
Login

Artifact 80e5315957377554c9011858f5afde61afedc181:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
02e0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74   new virtual dat
02f0: 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f  abase engine..*/
0300: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64  .Vdbe *sqlite3Vd
0310: 62 65 43 72 65 61 74 65 28 50 61 72 73 65 20 2a  beCreate(Parse *
0320: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
0330: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
0340: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  >db;.  Vdbe *p;.
0350: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
0360: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
0370: 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20 20  zeof(Vdbe) );.  
0380: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
0390: 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  n 0;.  p->db = d
03a0: 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64  b;.  if( db->pVd
03b0: 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56  be ){.    db->pV
03c0: 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  dbe->pPrev = p;.
03d0: 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d    }.  p->pNext =
03e0: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70 2d   db->pVdbe;.  p-
03f0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64 62  >pPrev = 0;.  db
0400: 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 70  ->pVdbe = p;.  p
0410: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
0420: 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e  AGIC_INIT;.  p->
0430: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
0440: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0450: 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->aLabel==0 );.
0460: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
0470: 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a 20  ->nLabel==0 );. 
0480: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
0490: 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  >nOpAlloc==0 );.
04a0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
04b0: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
04c0: 65 20 53 51 4c 20 73 74 72 69 6e 67 20 66 6f 72  e SQL string for
04d0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
04e0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
04f0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c  qlite3VdbeSetSql
0500: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
0510: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
0520: 69 6e 74 20 69 73 50 72 65 70 61 72 65 56 32 29  int isPrepareV2)
0530: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 50 72  {.  assert( isPr
0540: 65 70 61 72 65 56 32 3d 3d 31 20 7c 7c 20 69 73  epareV2==1 || is
0550: 50 72 65 70 61 72 65 56 32 3d 3d 30 20 29 3b 0a  PrepareV2==0 );.
0560: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
0570: 75 72 6e 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  urn;.#if defined
0580: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
0590: 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
05a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
05b0: 4c 4c 4f 47 29 0a 20 20 69 66 28 20 21 69 73 50  LLOG).  if( !isP
05c0: 72 65 70 61 72 65 56 32 20 29 20 72 65 74 75 72  repareV2 ) retur
05d0: 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  n;.#endif.  asse
05e0: 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29  rt( p->zSql==0 )
05f0: 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71  ;.  p->zSql = sq
0600: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
0610: 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 70  ->db, z, n);.  p
0620: 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d 20  ->isPrepareV2 = 
0630: 28 75 38 29 69 73 50 72 65 70 61 72 65 56 32 3b  (u8)isPrepareV2;
0640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0650: 20 74 68 65 20 53 51 4c 20 61 73 73 6f 63 69 61   the SQL associa
0660: 74 65 64 20 77 69 74 68 20 61 20 70 72 65 70 61  ted with a prepa
0670: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f  red statement.*/
0680: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
0690: 69 74 65 33 5f 73 71 6c 28 73 71 6c 69 74 65 33  ite3_sql(sqlite3
06a0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  _stmt *pStmt){. 
06b0: 20 56 64 62 65 20 2a 70 20 3d 20 28 56 64 62 65   Vdbe *p = (Vdbe
06c0: 20 2a 29 70 53 74 6d 74 3b 0a 20 20 72 65 74 75   *)pStmt;.  retu
06d0: 72 6e 20 28 70 20 26 26 20 70 2d 3e 69 73 50 72  rn (p && p->isPr
06e0: 65 70 61 72 65 56 32 29 20 3f 20 70 2d 3e 7a 53  epareV2) ? p->zS
06f0: 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ql : 0;.}../*.**
0700: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0710: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
0720: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
0730: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0740: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
0750: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
0760: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
0770: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 74   char *zTmp;.  t
0780: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
0790: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
07a0: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
07b0: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
07c0: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
07d0: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
07e0: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
07f0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
0800: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
0810: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
0820: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
0830: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
0840: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
0850: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
0860: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61  p;.  pB->isPrepa
0870: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65  reV2 = pA->isPre
0880: 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pareV2;.}../*.**
0890: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65   Resize the Vdbe
08a0: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68  .aOp array so th
08b0: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73  at it is at leas
08c0: 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67 65 72 20  t one op larger 
08d0: 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77 61 73 2e  than .** it was.
08e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74  .**.** If an out
08f0: 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72  -of-memory error
0900: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
0910: 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79  sizing the array
0920: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  , return.** SQLI
0930: 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69  TE_NOMEM. In thi
0940: 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20  s case Vdbe.aOp 
0950: 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f  and Vdbe.nOpAllo
0960: 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63  c remain .** unc
0970: 68 61 6e 67 65 64 20 28 74 68 69 73 20 69 73 20  hanged (this is 
0980: 73 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 63 6f  so that any opco
0990: 64 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f  des already allo
09a0: 63 61 74 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a  cated can be .**
09b0: 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c   correctly deall
09c0: 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
09d0: 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  h the rest of th
09e0: 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74  e Vdbe)..*/.stat
09f0: 69 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 72 72  ic int growOpArr
0a00: 61 79 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 56  ay(Vdbe *v){.  V
0a10: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0a20: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0a30: 72 73 65 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20  rse;.  int nNew 
0a40: 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f  = (p->nOpAlloc ?
0a50: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a   p->nOpAlloc*2 :
0a60: 20 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65   (int)(1024/size
0a70: 6f 66 28 4f 70 29 29 29 3b 0a 20 20 70 4e 65 77  of(Op)));.  pNew
0a80: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
0a90: 6c 6f 63 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f  loc(p->db, v->aO
0aa0: 70 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f  p, nNew*sizeof(O
0ab0: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  p));.  if( pNew 
0ac0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  ){.    p->nOpAll
0ad0: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
0ae0: 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20  llocSize(p->db, 
0af0: 70 4e 65 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29  pNew)/sizeof(Op)
0b00: 3b 0a 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70  ;.    v->aOp = p
0b10: 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  New;.  }.  retur
0b20: 6e 20 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45  n (pNew ? SQLITE
0b30: 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d  _OK : SQLITE_NOM
0b40: 45 4d 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  EM);.}..#ifdef S
0b50: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
0b60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
0b70: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74  ust a convenient
0b80: 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
0b90: 62 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20  breakpoint that 
0ba0: 77 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74  will.** fire aft
0bb0: 65 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69  er each opcode i
0bc0: 73 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64  s inserted and d
0bd0: 69 73 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a  isplayed using.*
0be0: 2a 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61  * "PRAGMA vdbe_a
0bf0: 64 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a  ddoptrace=on"..*
0c00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
0c10: 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f  st_addop_breakpo
0c20: 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  int(void){.  sta
0c30: 74 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  tic int n = 0;. 
0c40: 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   n++;.}.#endif..
0c50: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
0c60: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74  instruction to t
0c70: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72  he list of instr
0c80: 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20  uctions current 
0c90: 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20  in the.** VDBE. 
0ca0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
0cb0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69  ess of the new i
0cc0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
0cd0: 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a  * Parameters:.**
0ce0: 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20  .**    p        
0cf0: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
0d00: 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a  o the VDBE.**.**
0d10: 20 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20      op          
0d20: 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66      The opcode f
0d30: 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  or this instruct
0d40: 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c  ion.**.**    p1,
0d50: 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65   p2, p3      Ope
0d60: 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20  rands.**.** Use 
0d70: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
0d80: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75  esolveLabel() fu
0d90: 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e  nction to fix an
0da0: 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20   address and.** 
0db0: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43  the sqlite3VdbeC
0dc0: 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69  hangeP4() functi
0dd0: 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  on to change the
0de0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
0df0: 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a  .** operand..*/.
0e00: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
0e10: 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69  ddOp3(Vdbe *p, i
0e20: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
0e30: 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a  nt p2, int p3){.
0e40: 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f    int i;.  VdbeO
0e50: 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70  p *pOp;..  i = p
0e60: 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->nOp;.  assert(
0e70: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
0e80: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
0e90: 61 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20  assert( op>0 && 
0ea0: 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28  op<0xff );.  if(
0eb0: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
0ec0: 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69  lloc<=i ){.    i
0ed0: 66 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  f( growOpArray(p
0ee0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
0ef0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
0f00: 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70   p->nOp++;.  pOp
0f10: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
0f20: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28   pOp->opcode = (
0f30: 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35  u8)op;.  pOp->p5
0f40: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20   = 0;.  pOp->p1 
0f50: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20  = p1;.  pOp->p2 
0f60: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  = p2;.  pOp->p3 
0f70: 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  = p3;.  pOp->p4.
0f80: 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34  p = 0;.  pOp->p4
0f90: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
0fa0: 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  D;.#ifdef SQLITE
0fb0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
0fc0: 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e  COMMENTS.  pOp->
0fd0: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65  zComment = 0;.#e
0fe0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
0ff0: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1000: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1010: 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
1020: 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  ace ){.    int j
1030: 6a 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65  j, kk;.    Parse
1040: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
1050: 61 72 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a  arse;.    for(jj
1060: 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49 54 45  =kk=0; jj<SQLITE
1070: 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b  _N_COLCACHE; jj+
1080: 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1090: 20 79 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20   yColCache *x = 
10a0: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
10b0: 65 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 69 66  e + jj;.      if
10c0: 28 20 78 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72  ( x->iLevel>pPar
10d0: 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20  se->iCacheLevel 
10e0: 7c 7c 20 78 2d 3e 69 52 65 67 3d 3d 30 20 29 20  || x->iReg==0 ) 
10f0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1100: 70 72 69 6e 74 66 28 22 20 72 5b 25 64 5d 3d 7b  printf(" r[%d]={
1110: 25 64 3a 25 64 7d 22 2c 20 78 2d 3e 69 52 65 67  %d:%d}", x->iReg
1120: 2c 20 78 2d 3e 69 54 61 62 6c 65 2c 20 78 2d 3e  , x->iTable, x->
1130: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
1140: 6b 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  kk++;.    }.    
1150: 69 66 28 20 6b 6b 20 29 20 70 72 69 6e 74 66 28  if( kk ) printf(
1160: 22 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  "\n");.    sqlit
1170: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
1180: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
1190: 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f  .    test_addop_
11a0: 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20  breakpoint();.  
11b0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
11c0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70  VDBE_PROFILE.  p
11d0: 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  Op->cycles = 0;.
11e0: 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a    pOp->cnt = 0;.
11f0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1200: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
1210: 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69  GE.  pOp->iSrcLi
1220: 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ne = 0;.#endif. 
1230: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74   return i;.}.int
1240: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1250: 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p0(Vdbe *p, int 
1260: 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  op){.  return sq
1270: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1280: 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b  p, op, 0, 0, 0);
1290: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
12a0: 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70  beAddOp1(Vdbe *p
12b0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
12c0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
12d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
12e0: 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a   op, p1, 0, 0);.
12f0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1300: 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c  eAddOp2(Vdbe *p,
1310: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
1320: 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75   int p2){.  retu
1330: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1340: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
1350: 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  p2, 0);.}.../*.*
1360: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
1370: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
1380: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
1390: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
13a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13b0: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
13c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
13d0: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
13e0: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
13f0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1400: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
1410: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
1420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1430: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1440: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1450: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1460: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1470: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1480: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1490: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
14a0: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
14b0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
14c0: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
14d0: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
14e0: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
14f0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1500: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1510: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1520: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1530: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1540: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
1550: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1560: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50  ./*.** Add an OP
1570: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63  _ParseSchema opc
1580: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
1590: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74  ne is broken out
15a0: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
15b0: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e  VdbeAddOp4() sin
15c0: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61  ce it needs to a
15d0: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72  lso needs to mar
15e0: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20  k all btrees.** 
15f0: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75  as having been u
1600: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  sed..**.** The z
1610: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73  Where string mus
1620: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
1630: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
1640: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54  3_malloc()..** T
1650: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1660: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
1670: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
1680: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64   memory..*/.void
1690: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
16a0: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62  arseSchemaOp(Vdb
16b0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63  e *p, int iDb, c
16c0: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20  har *zWhere){.  
16d0: 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64  int j;.  int add
16e0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
16f0: 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73  ddOp3(p, OP_Pars
1700: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
1710: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
1720: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1730: 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44  dr, zWhere, P4_D
1740: 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a  YNAMIC);.  for(j
1750: 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62  =0; j<p->db->nDb
1760: 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64  ; j++) sqlite3Vd
1770: 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a  beUsesBtree(p, j
1780: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
1790: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
17a0: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
17b0: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
17c0: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
17d0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
17e0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
17f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1800: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1810: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1830: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1840: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1850: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1860: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
1870: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
1880: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1890: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
18a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
18b0: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
18c0: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
18d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18e0: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
18f0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
1900: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1910: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1920: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1930: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1940: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1950: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
1960: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32  TR(p4), P4_INT32
1970: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
1980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1990: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
19a0: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
19b0: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
19c0: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
19d0: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
19e0: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
19f0: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
1a00: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
1a10: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
1a20: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
1a30: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
1a40: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
1a50: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
1a60: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
1a70: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
1a80: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
1a90: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
1aa0: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
1ab0: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
1ac0: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
1ad0: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
1ae0: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
1af0: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
1b00: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
1b10: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
1b20: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
1b30: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
1b40: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
1b50: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
1b60: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
1b70: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
1b80: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
1b90: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
1ba0: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
1bb0: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
1bc0: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
1bd0: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
1be0: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
1bf0: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
1c00: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
1c10: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29  keLabel(Vdbe *v)
1c20: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76  {.  Parse *p = v
1c30: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
1c40: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b  i = p->nLabel++;
1c50: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
1c60: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1c70: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69  INIT );.  if( (i
1c80: 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (i-1))==0 ){.
1c90: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1ca0: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1cb0: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1cc0: 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20  >aLabel, .      
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28   (i*2+1)*sizeof(
1d00: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
1d10: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61    }.  if( p->aLa
1d20: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
1d30: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
1d40: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b  }.  return -1-i;
1d50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
1d60: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62  e label "x" to b
1d70: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  e the address of
1d80: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
1d90: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69  ction to.** be i
1da0: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61  nserted.  The pa
1db0: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74  rameter "x" must
1dc0: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
1dd0: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
1de0: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
1df0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1e00: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
1e10: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1e20: 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  bel(Vdbe *v, int
1e30: 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20   x){.  Parse *p 
1e40: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
1e50: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
1e60: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
1e70: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1e80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   );.  assert( j<
1e90: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69  p->nLabel );.  i
1ea0: 66 28 20 6a 3e 3d 30 20 26 26 20 70 2d 3e 61 4c  f( j>=0 && p->aL
1eb0: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
1ec0: 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f  Label[j] = v->nO
1ed0: 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 46 69 78  p;.  }.  p->iFix
1ee0: 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f 70 20 2d 20  edOp = v->nOp - 
1ef0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  1;.}../*.** Mark
1f00: 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65   the VDBE as one
1f10: 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62   that can only b
1f20: 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a  e run one time..
1f30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1f40: 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56  dbeRunOnlyOnce(V
1f50: 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75  dbe *p){.  p->ru
1f60: 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d  nOnlyOnce = 1;.}
1f70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1f80: 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65 33  DEBUG /* sqlite3
1f90: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
1fa0: 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   logic */../*.**
1fb0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
1fc0: 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e  ype and function
1fd0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 74 65   are used to ite
1fe0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c  rate through all
1ff0: 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20 61   opcodes.** in a
2000: 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67 72   Vdbe main progr
2010: 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20 74  am and each of t
2020: 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20  he sub-programs 
2030: 28 74 72 69 67 67 65 72 73 29 20 69 74 20 6d 61  (triggers) it ma
2040: 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69 72  y .** invoke dir
2050: 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63  ectly or indirec
2060: 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  tly. It should b
2070: 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77  e used as follow
2080: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70  s:.**.**   Op *p
2090: 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70 49  Op;.**   VdbeOpI
20a0: 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a  ter sIter;.**.**
20b0: 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72     memset(&sIter
20c0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65  , 0, sizeof(sIte
20d0: 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72 2e  r));.**   sIter.
20e0: 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20 20  v = v;          
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79 70    // v is of typ
2110: 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77 68  e Vdbe* .**   wh
2120: 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74  ile( (pOp = opIt
2130: 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 20  erNext(&sIter)) 
2140: 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20  ){.**     // Do 
2150: 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 70  something with p
2160: 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 73  Op.**   }.**   s
2170: 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
2180: 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29  db, sIter.apSub)
2190: 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65 66  ;.** .*/.typedef
21a0: 20 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74   struct VdbeOpIt
21b0: 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a 73  er VdbeOpIter;.s
21c0: 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65 72  truct VdbeOpIter
21d0: 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20   {.  Vdbe *v;   
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72 61  /* Vdbe to itera
2200: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6f  te through the o
2210: 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20 53  pcodes of */.  S
2220: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
2230: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72  b;        /* Arr
2240: 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d  ay of subprogram
2250: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 3b  s */.  int nSub;
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2270: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
2280: 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75 62 20  ntries in apSub 
2290: 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 20  */.  int iAddr; 
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
22c0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
22d0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
22e0: 74 20 69 53 75 62 3b 20 20 20 20 20 20 20 20 20  t iSub;         
22f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d 20           /* 0 = 
2300: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31 20  main program, 1 
2310: 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f 67  = first sub-prog
2320: 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73  ram etc. */.};.s
2330: 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65 72  tatic Op *opIter
2340: 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65 72 20  Next(VdbeOpIter 
2350: 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  *p){.  Vdbe *v =
2360: 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52 65   p->v;.  Op *pRe
2370: 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f 70  t = 0;.  Op *aOp
2380: 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20  ;.  int nOp;..  
2390: 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e  if( p->iSub<=p->
23a0: 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66 28  nSub ){..    if(
23b0: 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a 20   p->iSub==0 ){. 
23c0: 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61 4f       aOp = v->aO
23d0: 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 76  p;.      nOp = v
23e0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65  ->nOp;.    }else
23f0: 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70 2d  {.      aOp = p-
2400: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
2410: 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f  ]->aOp;.      nO
2420: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
2430: 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20  iSub-1]->nOp;.  
2440: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2450: 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b 0a  p->iAddr<nOp );.
2460: 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f 70  .    pRet = &aOp
2470: 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20 20  [p->iAddr];.    
2480: 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20 20  p->iAddr++;.    
2490: 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f  if( p->iAddr==nO
24a0: 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 53  p ){.      p->iS
24b0: 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69  ub++;.      p->i
24c0: 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Addr = 0;.    }.
24d0: 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d    .    if( pRet-
24e0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
24f0: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
2500: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e  int nByte = (p->
2510: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
2520: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
2530: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
2540: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53  for(j=0; j<p->nS
2550: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
2560: 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b 6a    if( p->apSub[j
2570: 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f  ]==pRet->p4.pPro
2580: 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  gram ) break;.  
2590: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
25a0: 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20 20  j==p->nSub ){.  
25b0: 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20 3d        p->apSub =
25c0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
25d0: 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20 70  cOrFree(v->db, p
25e0: 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29 3b  ->apSub, nByte);
25f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 2d  .        if( !p-
2600: 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20  >apSub ){.      
2610: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
2620: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2630: 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 5b         p->apSub[
2640: 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52 65  p->nSub++] = pRe
2650: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  t->p4.pProgram;.
2660: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2670: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
2680: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
2690: 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
26a0: 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64  e program stored
26b0: 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f 63   in the VM assoc
26c0: 69 61 74 65 64 20 77 69 74 68 20 70 50 61 72 73  iated with pPars
26d0: 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61  e may.** throw a
26e0: 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f  n ABORT exceptio
26f0: 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65 20 73  n (causing the s
2700: 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  tatement, but no
2710: 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  t entire transac
2720: 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 6f  tion.** to be ro
2730: 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69 73  lled back). This
2740: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72   condition is tr
2750: 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 70  ue if the main p
2760: 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a  rogram or any.**
2770: 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 6f   sub-programs co
2780: 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74 68  ntains any of th
2790: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
27a0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20  **   *  OP_Halt 
27b0: 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43  with P1=SQLITE_C
27c0: 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32  ONSTRAINT and P2
27d0: 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20  =OE_Abort..**   
27e0: 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c  *  OP_HaltIfNull
27f0: 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f   with P1=SQLITE_
2800: 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50  CONSTRAINT and P
2810: 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20  2=OE_Abort..**  
2820: 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a   *  OP_Destroy.*
2830: 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61 74  *   *  OP_VUpdat
2840: 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65  e.**   *  OP_VRe
2850: 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  name.**   *  OP_
2860: 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20 50  FkCounter with P
2870: 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65 20  2==0 (immediate 
2880: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
2890: 74 72 61 69 6e 74 29 0a 2a 2a 0a 2a 2a 20 54 68  traint).**.** Th
28a0: 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  en check that th
28b0: 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73 65  e value of Parse
28c0: 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72 75  .mayAbort is tru
28d0: 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54  e if an.** ABORT
28e0: 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c 20   may be thrown, 
28f0: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
2900: 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20  se. Return true 
2910: 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61  if it does.** ma
2920: 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  tch, or false ot
2930: 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66 75  herwise. This fu
2940: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64  nction is intend
2950: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61 73  ed to be used as
2960: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20 61  .** part of an a
2970: 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20  ssert statement 
2980: 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e  in the compiler.
2990: 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a   Similar to:.**.
29a0: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  **   assert( sql
29b0: 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61  ite3VdbeAssertMa
29c0: 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e 70  yAbort(pParse->p
29d0: 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61  Vdbe, pParse->ma
29e0: 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e  yAbort) );.*/.in
29f0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  t sqlite3VdbeAss
2a00: 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62 65  ertMayAbort(Vdbe
2a10: 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72   *v, int mayAbor
2a20: 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62 6f  t){.  int hasAbo
2a30: 72 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f  rt = 0;.  Op *pO
2a40: 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20  p;.  VdbeOpIter 
2a50: 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  sIter;.  memset(
2a60: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
2a70: 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74  f(sIter));.  sIt
2a80: 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69  er.v = v;..  whi
2a90: 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65  le( (pOp = opIte
2aa0: 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21 3d  rNext(&sIter))!=
2ab0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63  0 ){.    int opc
2ac0: 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64  ode = pOp->opcod
2ad0: 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  e;.    if( opcod
2ae0: 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c  e==OP_Destroy ||
2af0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
2b00: 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ate || opcode==O
2b10: 50 5f 56 52 65 6e 61 6d 65 20 0a 23 69 66 6e 64  P_VRename .#ifnd
2b20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
2b30: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 20  OREIGN_KEY.     
2b40: 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  || (opcode==OP_F
2b50: 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 2d  kCounter && pOp-
2b60: 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1==0 && pOp->p
2b70: 32 3d 3d 31 29 20 0a 23 65 6e 64 69 66 0a 20 20  2==1) .#endif.  
2b80: 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d     || ((opcode==
2b90: 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64  OP_Halt || opcod
2ba0: 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c  e==OP_HaltIfNull
2bb0: 29 20 0a 20 20 20 20 20 20 26 26 20 28 28 70 4f  ) .      && ((pO
2bc0: 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53 51 4c  p->p1&0xff)==SQL
2bd0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26  ITE_CONSTRAINT &
2be0: 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62  & pOp->p2==OE_Ab
2bf0: 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ort)).    ){.   
2c00: 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b     hasAbort = 1;
2c10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2c20: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2c30: 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73  3DbFree(v->db, s
2c40: 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20  Iter.apSub);..  
2c50: 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  /* Return true i
2c60: 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41  f hasAbort==mayA
2c70: 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61  bort. Or if a ma
2c80: 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
2c90: 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d  urred..  ** If m
2ca0: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68  alloc failed, th
2cb0: 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c  en the while() l
2cc0: 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f  oop above may no
2cd0: 74 20 68 61 76 65 20 69 74 65 72 61 74 65 64 0a  t have iterated.
2ce0: 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c    ** through all
2cf0: 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73   opcodes and has
2d00: 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74  Abort may be set
2d10: 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65   incorrectly. Re
2d20: 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66  turn.  ** true f
2d30: 6f 72 20 74 68 69 73 20 63 61 73 65 20 74 6f 20  or this case to 
2d40: 70 72 65 76 65 6e 74 20 74 68 65 20 61 73 73 65  prevent the asse
2d50: 72 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c  rt() in the call
2d60: 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66  ers frame.  ** f
2d70: 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f  rom failing.  */
2d80: 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64  .  return ( v->d
2d90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2da0: 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79  || hasAbort==may
2db0: 41 62 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69  Abort );.}.#endi
2dc0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
2dd0: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41  G - the sqlite3A
2de0: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
2df0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a  function */../*.
2e00: 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  ** Loop through 
2e10: 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b  the program look
2e20: 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65  ing for P2 value
2e30: 73 20 74 68 61 74 20 61 72 65 20 6e 65 67 61 74  s that are negat
2e40: 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69  ive.** on jump i
2e50: 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61  nstructions.  Ea
2e60: 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69 73  ch such value is
2e70: 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c   a label.  Resol
2e80: 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20  ve the.** label 
2e90: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  by setting the P
2ea0: 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63  2 value to its c
2eb0: 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20  orrect non-zero 
2ec0: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  value..**.** Thi
2ed0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2ee0: 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61  led once after a
2ef0: 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20  ll opcodes have 
2f00: 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  been inserted..*
2f10: 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70  *.** Variable *p
2f20: 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20 73  MaxFuncArgs is s
2f30: 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  et to the maximu
2f40: 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50  m value of any P
2f50: 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74  2 argument .** t
2f60: 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  o an OP_Function
2f70: 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20  , OP_AggStep or 
2f80: 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64  OP_VFilter opcod
2f90: 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  e. This is used 
2fa0: 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  by .** sqlite3Vd
2fb0: 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f  beMakeReady() to
2fc0: 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61   size the Vdbe.a
2fd0: 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a  pArg[] array..**
2fe0: 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61  .** The Op.opfla
2ff0: 67 73 20 66 69 65 6c 64 20 69 73 20 73 65 74 20  gs field is set 
3000: 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a  on all opcodes..
3010: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
3020: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56  esolveP2Values(V
3030: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61  dbe *p, int *pMa
3040: 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e  xFuncArgs){.  in
3050: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41  t i;.  int nMaxA
3060: 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41  rgs = *pMaxFuncA
3070: 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a  rgs;.  Op *pOp;.
3080: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
3090: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = p->pParse;.  i
30a0: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61  nt *aLabel = pPa
30b0: 72 73 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70  rse->aLabel;.  p
30c0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
30d0: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
30e0: 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d   0;.  for(pOp=p-
30f0: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
3100: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
3110: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f  ++){.    u8 opco
3120: 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  de = pOp->opcode
3130: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20  ;..    /* NOTE: 
3140: 42 65 20 73 75 72 65 20 74 6f 20 75 70 64 61 74  Be sure to updat
3150: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
3160: 77 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72  when adding or r
3170: 65 6d 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 63  emoving.    ** c
3180: 61 73 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73  ases from this s
3190: 77 69 74 63 68 21 20 2a 2f 0a 20 20 20 20 73 77  witch! */.    sw
31a0: 69 74 63 68 28 20 6f 70 63 6f 64 65 20 29 7b 0a  itch( opcode ){.
31b0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 46 75        case OP_Fu
31c0: 6e 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20 63 61  nction:.      ca
31d0: 73 65 20 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b  se OP_AggStep: {
31e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
31f0: 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20  ->p5>nMaxArgs ) 
3200: 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e  nMaxArgs = pOp->
3210: 70 35 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  p5;.        brea
3220: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3230: 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63   case OP_Transac
3240: 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  tion: {.        
3250: 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29  if( pOp->p2!=0 )
3260: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30   p->readOnly = 0
3270: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c  ;.        /* fal
3280: 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20  l thru */.      
3290: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
32a0: 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20  AutoCommit:.    
32b0: 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f    case OP_Savepo
32c0: 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70  int: {.        p
32d0: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b  ->bIsReader = 1;
32e0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
32f0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
3300: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
3310: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68        case OP_Ch
3320: 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66  eckpoint:.#endif
3330: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56  .      case OP_V
3340: 61 63 75 75 6d 3a 0a 20 20 20 20 20 20 63 61 73  acuum:.      cas
3350: 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65  e OP_JournalMode
3360: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72  : {.        p->r
3370: 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20  eadOnly = 0;.   
3380: 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65       p->bIsReade
3390: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62  r = 1;.        b
33a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
33b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33c0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
33d0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70       case OP_VUp
33e0: 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  date: {.        
33f0: 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78  if( pOp->p2>nMax
3400: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
3410: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
3420: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3430: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
3440: 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20  VFilter: {.     
3450: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
3460: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
3470: 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20   - i >= 3 );.   
3480: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
3490: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
34a0: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
34b0: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70     n = pOp[-1].p
34c0: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  1;.        if( n
34d0: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
34e0: 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20  Args = n;.      
34f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3500: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61  .#endif.      ca
3510: 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20  se OP_Next:.    
3520: 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66    case OP_NextIf
3530: 4f 70 65 6e 3a 0a 20 20 20 20 20 20 63 61 73 65  Open:.      case
3540: 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20   OP_SorterNext: 
3550: 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  {.        pOp->p
3560: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
3570: 69 74 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20  ite3BtreeNext;. 
3580: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79         pOp->p4ty
3590: 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b  pe = P4_ADVANCE;
35a0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
35b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
35c0: 73 65 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20  se OP_Prev:.    
35d0: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66    case OP_PrevIf
35e0: 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  Open: {.        
35f0: 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
3600: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
3610: 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20  revious;.       
3620: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
3630: 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20  4_ADVANCE;.     
3640: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3650: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70  }.    }..    pOp
3660: 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69  ->opflags = sqli
3670: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
3680: 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69  y[opcode];.    i
3690: 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73  f( (pOp->opflags
36a0: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d   & OPFLG_JUMP)!=
36b0: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29  0 && pOp->p2<0 )
36c0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
36d0: 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 50 61 72 73  -1-pOp->p2<pPars
36e0: 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20  e->nLabel );.   
36f0: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61     pOp->p2 = aLa
3700: 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b  bel[-1-pOp->p2];
3710: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
3720: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
3730: 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c  , pParse->aLabel
3740: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61  );.  pParse->aLa
3750: 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  bel = 0;.  pPars
3760: 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  e->nLabel = 0;. 
3770: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d   *pMaxFuncArgs =
3780: 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73   nMaxArgs;.  ass
3790: 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65  ert( p->bIsReade
37a0: 72 21 3d 30 20 7c 7c 20 70 2d 3e 62 74 72 65 65  r!=0 || p->btree
37b0: 4d 61 73 6b 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  Mask==0 );.}../*
37c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
37d0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
37e0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
37f0: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  o be inserted..*
3800: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
3810: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62  eCurrentAddr(Vdb
3820: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
3830: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
3840: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
3850: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d  return p->nOp;.}
3860: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
3870: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
3880: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
3890: 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20  rray of opcodes 
38a0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
38b0: 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 73 73  ** the Vdbe pass
38c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
38d0: 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20  argument. It is 
38e0: 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
38f0: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f  onsibility.** to
3900: 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65   arrange for the
3910: 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20   returned array 
3920: 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  to be eventually
3930: 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 68 65   freed using the
3940: 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41   .** vdbeFreeOpA
3950: 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e  rray() function.
3960: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
3970: 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69  turning, *pnOp i
3980: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
3990: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
39a0: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  n the returned.*
39b0: 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a  * array. Also, *
39c0: 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74 20  pnMaxArg is set 
39d0: 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  to the larger of
39e0: 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
39f0: 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e  ue and .** the n
3a00: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
3a10: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41   in the Vdbe.apA
3a20: 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69  rg[] array requi
3a30: 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74  red to execute t
3a40: 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  he .** returned 
3a50: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65  program..*/.Vdbe
3a60: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54  Op *sqlite3VdbeT
3a70: 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  akeOpArray(Vdbe 
3a80: 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69  *p, int *pnOp, i
3a90: 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20  nt *pnMaxArg){. 
3aa0: 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70   VdbeOp *aOp = p
3ab0: 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->aOp;.  assert(
3ac0: 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e   aOp && !p->db->
3ad0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
3ae0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
3af0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
3b00: 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20  Btree() was not 
3b10: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56  called on this V
3b20: 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  M */.  assert( p
3b30: 2d 3e 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20 29  ->btreeMask==0 )
3b40: 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  ;..  resolveP2Va
3b50: 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67  lues(p, pnMaxArg
3b60: 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e  );.  *pnOp = p->
3b70: 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20  nOp;.  p->aOp = 
3b80: 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b  0;.  return aOp;
3b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
3ba0: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
3bb0: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
3bc0: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
3bd0: 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
3be0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66  address of the f
3bf0: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61  irst operation a
3c00: 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dded..*/.int sql
3c10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3c20: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  t(Vdbe *p, int n
3c30: 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63  Op, VdbeOpList c
3c40: 6f 6e 73 74 20 2a 61 4f 70 2c 20 69 6e 74 20 69  onst *aOp, int i
3c50: 4c 69 6e 65 6e 6f 29 7b 0a 20 20 69 6e 74 20 61  Lineno){.  int a
3c60: 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ddr;.  assert( p
3c70: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3c80: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
3c90: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
3ca0: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
3cb0: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
3cc0: 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 72 65  ray(p) ){.    re
3cd0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64  turn 0;.  }.  ad
3ce0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  dr = p->nOp;.  i
3cf0: 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29  f( ALWAYS(nOp>0)
3d00: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
3d10: 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f     VdbeOpList co
3d20: 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a  nst *pIn = aOp;.
3d30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
3d40: 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b  Op; i++, pIn++){
3d50: 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20  .      int p2 = 
3d60: 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56  pIn->p2;.      V
3d70: 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70  dbeOp *pOut = &p
3d80: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20  ->aOp[i+addr];. 
3d90: 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64       pOut->opcod
3da0: 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b  e = pIn->opcode;
3db0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20  .      pOut->p1 
3dc0: 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20  = pIn->p1;.     
3dd0: 20 69 66 28 20 70 32 3c 30 20 29 7b 0a 20 20 20   if( p2<0 ){.   
3de0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
3df0: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
3e00: 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 5d  ty[pOut->opcode]
3e10: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 20 29 3b   & OPFLG_JUMP );
3e20: 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  .        pOut->p
3e30: 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28  2 = addr + ADDR(
3e40: 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  p2);.      }else
3e50: 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  {.        pOut->
3e60: 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d  p2 = p2;.      }
3e70: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20  .      pOut->p3 
3e80: 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20  = pIn->p3;.     
3e90: 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20   pOut->p4type = 
3ea0: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
3eb0: 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30    pOut->p4.p = 0
3ec0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35  ;.      pOut->p5
3ed0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
3ee0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
3ef0: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
3f00: 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74    pOut->zComment
3f10: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
3f20: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
3f30: 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20 70  COVERAGE.      p
3f40: 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20  Out->iSrcLine = 
3f50: 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65  iLineno+i;.#else
3f60: 0a 20 20 20 20 20 20 28 76 6f 69 64 29 69 4c 69  .      (void)iLi
3f70: 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66  neno;.#endif.#if
3f80: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3f90: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 64 62  .      if( p->db
3fa0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
3fb0: 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
3fc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3fd0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
3fe0: 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70   i+addr, &p->aOp
3ff0: 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20  [i+addr]);.     
4000: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
4010: 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f      p->nOp += nO
4020: 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
4030: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
4040: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
4050: 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e  of the P1 operan
4060: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
4070: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
4080: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4090: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
40a0: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
40b0: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
40c0: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
40d0: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
40e0: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
40f0: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
4100: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
4110: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
4120: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
4130: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
4140: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
4150: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
4160: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
4170: 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f   if( ((u32)p->nO
4180: 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70  p)>addr ){.    p
4190: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d  ->aOp[addr].p1 =
41a0: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
41b0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
41c0: 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70  lue of the P2 op
41d0: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
41e0: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
41f0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
4200: 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20  e is useful for 
4210: 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64  setting a jump d
4220: 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  estination..*/.v
4230: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
4240: 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c  hangeP2(Vdbe *p,
4250: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
4260: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
4270: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75  !=0 );.  if( ((u
4280: 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20  32)p->nOp)>addr 
4290: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
42a0: 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20  dr].p2 = val;.  
42b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
42c0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
42d0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f  he P3 operand fo
42e0: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
42f0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
4300: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
4310: 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75  ngeP3(Vdbe *p, u
4320: 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  32 addr, int val
4330: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
4340: 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32  0 );.  if( ((u32
4350: 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b  )p->nOp)>addr ){
4360: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72  .    p->aOp[addr
4370: 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p3 = val;.  }.
4380: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
4390: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
43a0: 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P5 operand for 
43b0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
43c0: 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61  y.** added opera
43d0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
43e0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
43f0: 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61  5(Vdbe *p, u8 va
4400: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
4410: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
4420: 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Op ){.    assert
4430: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20  ( p->nOp>0 );.  
4440: 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d    p->aOp[p->nOp-
4450: 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d  1].p5 = val;.  }
4460: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
4470: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
4480: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  of instruction a
4490: 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ddr so that it p
44a0: 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
44b0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
44c0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
44d0: 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a  to be coded..*/.
44e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
44f0: 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70  JumpHere(Vdbe *p
4500: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73  , int addr){.  s
4510: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4520: 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e  P2(p, addr, p->n
4530: 4f 70 29 3b 0a 20 20 70 2d 3e 70 50 61 72 73 65  Op);.  p->pParse
4540: 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e  ->iFixedOp = p->
4550: 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nOp - 1;.}.../*.
4560: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
4570: 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
4580: 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20  e is ephemeral, 
4590: 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49  then free it.  I
45a0: 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66  f.** the FuncDef
45b0: 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c   is not ephermal
45c0: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e  , then do nothin
45d0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
45e0: 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46  d freeEphemeralF
45f0: 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  unction(sqlite3 
4600: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44  *db, FuncDef *pD
4610: 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59  ef){.  if( ALWAY
4620: 53 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66  S(pDef) && (pDef
4630: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
4640: 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29  LITE_FUNC_EPHEM)
4650: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
4660: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65  e3DbFree(db, pDe
4670: 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  f);.  }.}..stati
4680: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
4690: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
46a0: 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  , Op *, int);../
46b0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34  *.** Delete a P4
46c0: 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73   value if necess
46d0: 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
46e0: 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74  oid freeP4(sqlit
46f0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79  e3 *db, int p4ty
4700: 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20  pe, void *p4){. 
4710: 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61   if( p4 ){.    a
4720: 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20  ssert( db );.   
4730: 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20   switch( p4type 
4740: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  ){.      case P4
4750: 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73  _REAL:.      cas
4760: 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20  e P4_INT64:.    
4770: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49    case P4_DYNAMI
4780: 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  C:.      case P4
4790: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
47a0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
47b0: 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20  ee(db, p4);.    
47c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
47d0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
47e0: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
47f0: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
4800: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71  tesFreed==0 ) sq
4810: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
4820: 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b  f((KeyInfo*)p4);
4830: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4840: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4850: 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b  se P4_MPRINTF: {
4860: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
4870: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4880: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
4890: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
48a0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
48b0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
48c0: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65  F: {.        fre
48d0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
48e0: 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a  on(db, (FuncDef*
48f0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
4900: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4910: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
4920: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4930: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4940: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
4950: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
4960: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
4970: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  p4);.        }el
4980: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65  se{.          Me
4990: 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b  m *p = (Mem*)p4;
49a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
49b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
49c0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
49d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
49e0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
49f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
4a00: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4a10: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
4a20: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4a30: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4a40: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
4a50: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
4a60: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4a70: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4a80: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
4a90: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
4aa0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
4ab0: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
4ac0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
4ad0: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
4ae0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
4af0: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
4b00: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
4b10: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
4b20: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
4b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
4b40: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
4b50: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
4b60: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
4b70: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
4b80: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
4b90: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
4ba0: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
4bb0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
4bc0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
4bd0: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66  p->p4.p);.#ifdef
4be0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
4bf0: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
4c00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4c10: 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f  ree(db, pOp->zCo
4c20: 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20  mment);.#endif  
4c30: 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20     .    }.  }.  
4c40: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4c50: 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , aOp);.}../*.**
4c60: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f   Link the SubPro
4c70: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73  gram object pass
4c80: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
4c90: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74   argument into t
4ca0: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73  he linked.** lis
4cb0: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72  t at Vdbe.pSubPr
4cc0: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74  ogram. This list
4cd0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65   is used to dele
4ce0: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72  te all sub-progr
4cf0: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68  am.** objects wh
4d00: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20  en the VM is no 
4d10: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
4d20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4d30: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
4d40: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  am(Vdbe *pVdbe, 
4d50: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a  SubProgram *p){.
4d60: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64    p->pNext = pVd
4d70: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  be->pProgram;.  
4d80: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20  pVdbe->pProgram 
4d90: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = p;.}../*.** Ch
4da0: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20  ange the opcode 
4db0: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f  at addr into OP_
4dc0: 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  Noop.*/.void sql
4dd0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
4de0: 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  Noop(Vdbe *p, in
4df0: 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20 70  t addr){.  if( p
4e00: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62  ->aOp ){.    Vdb
4e10: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
4e20: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71  Op[addr];.    sq
4e30: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
4e40: 62 3b 0a 20 20 20 20 66 72 65 65 50 34 28 64 62  b;.    freeP4(db
4e50: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
4e60: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d  Op->p4.p);.    m
4e70: 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69  emset(pOp, 0, si
4e80: 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20  zeof(pOp[0]));. 
4e90: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
4ea0: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 66   OP_Noop;.    if
4eb0: 28 20 61 64 64 72 3d 3d 70 2d 3e 6e 4f 70 2d 31  ( addr==p->nOp-1
4ec0: 20 29 20 70 2d 3e 6e 4f 70 2d 2d 3b 0a 20 20 7d   ) p->nOp--;.  }
4ed0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
4ee0: 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65   the last opcode
4ef0: 20 69 6e 73 65 72 74 65 64 0a 2a 2f 0a 69 6e 74   inserted.*/.int
4f00: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
4f10: 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64  tePriorOpcode(Vd
4f20: 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20  be *p, u8 op){. 
4f30: 20 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e   if( (p->nOp-1)>
4f40: 28 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78  (p->pParse->iFix
4f50: 65 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f 70 5b  edOp) && p->aOp[
4f60: 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65  p->nOp-1].opcode
4f70: 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  ==op ){.    sqli
4f80: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
4f90: 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29  oop(p, p->nOp-1)
4fa0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
4fb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
4fc0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
4fd0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
4fe0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f  alue of the P4 o
4ff0: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
5000: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
5010: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
5020: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
5030: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
5040: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
5050: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
5060: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
5070: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
5080: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
5090: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
50a0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
50b0: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
50c0: 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  f n>=0 then the 
50d0: 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79  P4 operand is dy
50e0: 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74  namic, meaning t
50f0: 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a  hat a copy of.**
5100: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d   the string is m
5110: 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ade into memory 
5120: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
5130: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
5140: 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d  ** A value of n=
5150: 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79  =0 means copy by
5160: 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f  tes of zP4 up to
5170: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74   and including t
5180: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c  he.** first null
5190: 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74   byte.  If n>0 t
51a0: 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74  hen copy n+1 byt
51b0: 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a  es of zP4..** .*
51c0: 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  * Other values o
51d0: 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20  f n (P4_STATIC, 
51e0: 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29  P4_COLLSEQ etc.)
51f0: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a   indicate that z
5200: 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  P4 points.** to 
5210: 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75  a string or stru
5220: 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75  cture that is gu
5230: 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73  aranteed to exis
5240: 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69  t for the lifeti
5250: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62  me of.** the Vdb
5260: 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  e. In these case
5270: 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f  s we can just co
5280: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a  py the pointer..
5290: 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20  **.** If addr<0 
52a0: 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f  then change P4 o
52b0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
52c0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73  tly inserted ins
52d0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
52e0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
52f0: 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69  ngeP4(Vdbe *p, i
5300: 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63  nt addr, const c
5310: 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29  har *zP4, int n)
5320: 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73  {.  Op *pOp;.  s
5330: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73  qlite3 *db;.  as
5340: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
5350: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
5360: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
5370: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
5380: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d  );.  if( p->aOp=
5390: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
53a0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66  Failed ){.    if
53b0: 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 7b 0a  ( n!=P4_VTAB ){.
53c0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
53d0: 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61   n, (void*)*(cha
53e0: 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d  r**)&zP4);.    }
53f0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
5400: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
5410: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
5420: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a   addr<p->nOp );.
5430: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
5440: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
5450: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70  p - 1;.  }.  pOp
5460: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
5470: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
5480: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55  >p4type==P4_NOTU
5490: 53 45 44 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79  SED || pOp->p4ty
54a0: 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a  pe==P4_INT32 );.
54b0: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70    freeP4(db, pOp
54c0: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
54d0: 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  4.p);.  pOp->p4.
54e0: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d  p = 0;.  if( n==
54f0: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
5500: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
5510: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
5520: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
5530: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
5540: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
5550: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
5560: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
5570: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
5580: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
5590: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
55a0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
55b0: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
55c0: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
55d0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
55e0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
55f0: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d   P4_NOTUSED;.  }
5600: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b  else if( n==P4_K
5610: 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4f  EYINFO ){.    pO
5620: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
5630: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
5640: 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e  4type = P4_KEYIN
5650: 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FO;.  }else if( 
5660: 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20  n==P4_VTAB ){.  
5670: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
5680: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
5690: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56  p->p4type = P4_V
56a0: 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  TAB;.    sqlite3
56b0: 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65  VtabLock((VTable
56c0: 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73   *)zP4);.    ass
56d0: 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29  ert( ((VTable *)
56e0: 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20  zP4)->db==p->db 
56f0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  );.  }else if( n
5700: 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  <0 ){.    pOp->p
5710: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
5720: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5730: 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  e = (signed char
5740: 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )n;.  }else{.   
5750: 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20   if( n==0 ) n = 
5760: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
5770: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
5780: 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53  4.z = sqlite3DbS
5790: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50  trNDup(p->db, zP
57a0: 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  4, n);.    pOp->
57b0: 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41  p4type = P4_DYNA
57c0: 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  MIC;.  }.}../*.*
57d0: 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20  * Set the P4 on 
57e0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
57f0: 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74  y added opcode t
5800: 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f  o the KeyInfo fo
5810: 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67  r the.** index g
5820: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
5830: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
5840: 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  yInfo(Parse *pPa
5850: 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  rse, Index *pIdx
5860: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
5870: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5880: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
5890: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
58a0: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
58b0: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
58c0: 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
58d0: 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
58e0: 50 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20 20  Parse, pIdx),.  
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
5910: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
5920: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
5930: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20  _COMMENTS./*.** 
5940: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
5950: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
5960: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
5970: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
5980: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
5990: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
59a0: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
59b0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
59c0: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
59d0: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
59e0: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
59f0: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
5a00: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
5a10: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
5a20: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
5a30: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65   void vdbeVComme
5a40: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
5a50: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
5a60: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
5a70: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
5a80: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
5a90: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
5aa0: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
5ab0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
5ac0: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
5ad0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
5ae0: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
5af0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
5b00: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
5b10: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
5b20: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
5b30: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d  Comment);.    p-
5b40: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
5b50: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
5b60: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
5b70: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
5b80: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
5b90: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
5ba0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
5bb0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
5bc0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
5bd0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61   if( p ){.    va
5be0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
5bf0: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
5c00: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
5c10: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
5c20: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
5c30: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
5c40: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
5c50: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
5c60: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
5c70: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
5c80: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
5c90: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
5ca0: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f  P_Noop);.    va_
5cb0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
5cc0: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
5cd0: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
5ce0: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
5cf0: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
5d00: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
5d10: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5d20: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a  VDBE_COVERAGE./*
5d30: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
5d40: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e  e if the iSrcLin
5d50: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20  e field for the 
5d60: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64  previously coded
5d70: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
5d80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5d90: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56  eSetLineNumber(V
5da0: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e  dbe *v, int iLin
5db0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
5dc0: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53  eGetOp(v,-1)->iS
5dd0: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a  rcLine = iLine;.
5de0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
5df0: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
5e00: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
5e10: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
5e20: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
5e30: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
5e40: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
5e50: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
5e60: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
5e70: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
5e80: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
5e90: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
5ea0: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
5eb0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
5ec0: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
5ed0: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
5ee0: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
5ef0: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
5f00: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
5f10: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
5f20: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
5f30: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
5f40: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
5f50: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
5f60: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
5f70: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
5f80: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
5f90: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
5fa0: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f  ing.** after a O
5fb0: 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74  OM fault without
5fc0: 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b   having to check
5fd0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
5fe0: 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74  eturn from .** t
5ff0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
6000: 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20   valid pointer. 
6010: 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
6020: 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73   dummy.opcode is
6030: 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c   0,.** dummy wil
6040: 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74  l never be writt
6050: 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20  en to.  This is 
6060: 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65  verified by code
6070: 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a   inspection and.
6080: 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69  ** by running wi
6090: 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a  th Valgrind..*/.
60a0: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
60b0: 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70  dbeGetOp(Vdbe *p
60c0: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f  , int addr){.  /
60d0: 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20  * C89 specifies 
60e0: 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e  that the constan
60f0: 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62  t "dummy" will b
6100: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
6110: 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c   all.  ** zeros,
6120: 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63   which is correc
6130: 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74  t.  MSVC generat
6140: 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65  es a warning, ne
6150: 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20  vertheless. */. 
6160: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64   static VdbeOp d
6170: 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  ummy;  /* Ignore
6180: 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e   the MSVC warnin
6190: 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69  g about no initi
61a0: 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65  alizer */.  asse
61b0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
61c0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
61d0: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
61e0: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
61f0: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73  Op - 1;.  }.  as
6200: 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26  sert( (addr>=0 &
6210: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c  & addr<p->nOp) |
6220: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
6230: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
6240: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
6250: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
6260: 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79   (VdbeOp*)&dummy
6270: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
6280: 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64  eturn &p->aOp[ad
6290: 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  dr];.  }.}..#if 
62a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
62b0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
62c0: 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65  MMENTS)./*.** Re
62d0: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
62e0: 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66  value for one of
62f0: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
6300: 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f  to the opcode pO
6310: 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20  p.** determined 
6320: 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a  by character c..
6330: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72  */.static int tr
6340: 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c  anslateP(char c,
6350: 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b   const Op *pOp){
6360: 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20  .  if( c=='1' ) 
6370: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a  return pOp->p1;.
6380: 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72    if( c=='2' ) r
6390: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20  eturn pOp->p2;. 
63a0: 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65   if( c=='3' ) re
63b0: 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  turn pOp->p3;.  
63c0: 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74  if( c=='4' ) ret
63d0: 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  urn pOp->p4.i;. 
63e0: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b   return pOp->p5;
63f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
6400: 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74  e a string for t
6410: 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65  he "comment" fie
6420: 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63  ld of a VDBE opc
6430: 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a  ode listing..**.
6440: 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a  ** The Synopsis:
6450: 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e   field in commen
6460: 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63  ts in the vdbe.c
6470: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74   source file get
6480: 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74  s converted.** t
6490: 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e  o an extra strin
64a0: 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e 64  g that is append
64b0: 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ed to the sqlite
64c0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20  3OpcodeName().  
64d0: 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63  In the.** absenc
64e0: 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65  e of other comme
64f0: 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73  nts, this synops
6500: 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  is becomes the c
6510: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70  omment on the op
6520: 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72  code..** Some tr
6530: 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73  anslation occurs
6540: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50  :.**.**       "P
6550: 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58  X"      ->  "r[X
6560: 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40  ]".**       "PX@
6570: 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY"   ->  "r[X..
6580: 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78  X+Y-1]"  or "r[x
6590: 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72 20  ]" if y is 0 or 
65a0: 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50  1.**       "PX@P
65b0: 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58  Y+1" ->  "r[X..X
65c0: 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d  +Y]"    or "r[x]
65d0: 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20  " if y is 0.**  
65e0: 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d       "PY..PY"  -
65f0: 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20  >  "r[X..Y]"    
6600: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
6610: 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  <=x.*/.static in
6620: 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74  t displayComment
6630: 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f  (.  const Op *pO
6640: 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  p,     /* The op
6650: 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65  code to be comme
6660: 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  nted */.  const 
6670: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20  char *zP4,   /* 
6680: 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69  Previously obtai
6690: 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34  ned value for P4
66a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d   */.  char *zTem
66b0: 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  p,       /* Writ
66c0: 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  e result here */
66d0: 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20  .  int nTemp    
66e0: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
66f0: 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d  vailable in zTem
6700: 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  p[] */.){.  cons
6710: 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b  t char *zOpName;
6720: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6730: 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20  Synopsis;.  int 
6740: 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69  nOpName;.  int i
6750: 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65  i, jj;.  zOpName
6760: 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65   = sqlite3Opcode
6770: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
6780: 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73  );.  nOpName = s
6790: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
67a0: 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  OpName);.  if( z
67b0: 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31  OpName[nOpName+1
67c0: 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65  ] ){.    int see
67d0: 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68  nCom = 0;.    ch
67e0: 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70  ar c;.    zSynop
67f0: 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d  sis = zOpName +=
6800: 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20   nOpName + 1;.  
6810: 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a    for(ii=jj=0; j
6820: 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20  j<nTemp-1 && (c 
6830: 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29  = zSynopsis[ii])
6840: 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  !=0; ii++){.    
6850: 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a    if( c=='P' ){.
6860: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e          c = zSyn
6870: 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20  opsis[++ii];.   
6880: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20       if( c=='4' 
6890: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
68a0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
68b0: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
68c0: 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20  , "%s", zP4);.  
68d0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
68e0: 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20  c=='X' ){.      
68f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6900: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
6910: 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70  Temp+jj, "%s", p
6920: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  Op->zComment);. 
6930: 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d           seenCom
6940: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
6950: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
6960: 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74  nt v1 = translat
6970: 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20  eP(c, pOp);.    
6980: 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20        int v2;.  
6990: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
69a0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
69b0: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64  j, zTemp+jj, "%d
69c0: 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20  ", v1);.        
69d0: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53    if( strncmp(zS
69e0: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40  ynopsis+ii+1, "@
69f0: 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20  P", 2)==0 ){.   
6a00: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33           ii += 3
6a10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  ;.            jj
6a20: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
6a30: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20  n30(zTemp+jj);. 
6a40: 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d 20             v2 = 
6a50: 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f  translateP(zSyno
6a60: 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a  psis[ii], pOp);.
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6a80: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
6a90: 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d  s+ii+1,"+1",2)==
6aa0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6ab0: 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20     ii += 2;.    
6ac0: 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a            v2++;.
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6ae0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 32            if( v2
6af0: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
6b00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6b10: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
6b20: 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c  Temp+jj, "..%d",
6b30: 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20   v1+v2-1);.     
6b40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6b50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
6b60: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69  ncmp(zSynopsis+i
6b70: 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d  i+1, "..P3", 4)=
6b80: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30  =0 && pOp->p3==0
6b90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6ba0: 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20  ii += 4;.       
6bb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
6bc0: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c         jj += sql
6bd0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
6be0: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65  mp+jj);.      }e
6bf0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65  lse{.        zTe
6c00: 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  mp[jj++] = c;.  
6c10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6c20: 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20  if( !seenCom && 
6c30: 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f  jj<nTemp-5 && pO
6c40: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
6c50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6c60: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
6c70: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22  zTemp+jj, "; %s"
6c80: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
6c90: 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71  ;.      jj += sq
6ca0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
6cb0: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20  emp+jj);.    }. 
6cc0: 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20     if( jj<nTemp 
6cd0: 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b  ) zTemp[jj] = 0;
6ce0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70  .  }else if( pOp
6cf0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
6d00: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6d10: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6d20: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d   "%s", pOp->zCom
6d30: 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20  ment);.    jj = 
6d40: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6d50: 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  zTemp);.  }else{
6d60: 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20  .    zTemp[0] = 
6d70: 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20  0;.    jj = 0;. 
6d80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a   }.  return jj;.
6d90: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
6da0: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 0a 23 69  TE_DEBUG */...#i
6db0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
6dc0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20  E_OMIT_EXPLAIN) 
6dd0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  || !defined(NDEB
6de0: 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65  UG) \.     || de
6df0: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
6e00: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
6e10: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
6e20: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
6e30: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
6e40: 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65  es the P4 parame
6e50: 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64  ter for an opcod
6e60: 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20  e..** Use zTemp 
6e70: 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64  for any required
6e80: 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
6e90: 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  r space..*/.stat
6ea0: 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79  ic char *display
6eb0: 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72  P4(Op *pOp, char
6ec0: 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65   *zTemp, int nTe
6ed0: 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  mp){.  char *zP4
6ee0: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65   = zTemp;.  asse
6ef0: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
6f00: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e  .  switch( pOp->
6f10: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p4type ){.    ca
6f20: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
6f30: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  .      int i, j;
6f40: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
6f50: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
6f60: 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
6f70: 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
6f80: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
6f90: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
6fa0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6fb0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28 25 64  mp, zTemp, "k(%d
6fc0: 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  ", pKeyInfo->nFi
6fd0: 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20  eld);.      i = 
6fe0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6ff0: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  zTemp);.      fo
7000: 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66  r(j=0; j<pKeyInf
7010: 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  o->nField; j++){
7020: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
7030: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
7040: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
7050: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
7060: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20   *zColl = pColl 
7070: 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
7080: 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20 20 20   "nil";.        
7090: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
70a0: 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b 0a  trlen30(zColl);.
70b0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 36          if( n==6
70c0: 20 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f 6c 6c   && memcmp(zColl
70d0: 2c 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d 30 20  ,"BINARY",6)==0 
70e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f  ){.          zCo
70f0: 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 20  ll = "B";.      
7100: 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20      n = 1;.     
7110: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
7120: 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a   i+n>nTemp-6 ){.
7130: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
7140: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e  (&zTemp[i],",...
7150: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",4);.          
7160: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
7170: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69  .        zTemp[i
7180: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
7190: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
71a0: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29  >aSortOrder[j] )
71b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d  {.          zTem
71c0: 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20  p[i++] = '-';.  
71d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
71e0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
71f0: 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a 20  , zColl, n+1);. 
7200: 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20         i += n;. 
7210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65       }.      zTe
7220: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20  mp[i++] = ')';. 
7230: 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20       zTemp[i] = 
7240: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
7250: 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20   i<nTemp );.    
7260: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7270: 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53     case P4_COLLS
7280: 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  EQ: {.      Coll
7290: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70  Seq *pColl = pOp
72a0: 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20  ->p4.pColl;.    
72b0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
72c0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
72d0: 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c   "(%.20s)", pCol
72e0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
72f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7300: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
7310: 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  F: {.      FuncD
7320: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
7330: 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  p4.pFunc;.      
7340: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7350: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
7360: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
7370: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
7380: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7390: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
73a0: 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20  4_INT64: {.     
73b0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
73c0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
73d0: 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34  "%lld", *pOp->p4
73e0: 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72  .pI64);.      br
73f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7400: 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a  ase P4_INT32: {.
7410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7420: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
7430: 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e  emp, "%d", pOp->
7440: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65  p4.i);.      bre
7450: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7460: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20  se P4_REAL: {.  
7470: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7480: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7490: 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70  p, "%.16g", *pOp
74a0: 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20  ->p4.pReal);.   
74b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
74c0: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
74d0: 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d   {.      Mem *pM
74e0: 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65  em = pOp->p4.pMe
74f0: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  m;.      if( pMe
7500: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  m->flags & MEM_S
7510: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  tr ){.        zP
7520: 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  4 = pMem->z;.   
7530: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
7540: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  m->flags & MEM_I
7550: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
7560: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7570: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c  Temp, zTemp, "%l
7580: 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b  ld", pMem->u.i);
7590: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
75a0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
75b0: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
75c0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
75d0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
75e0: 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d  , "%.16g", pMem-
75f0: 3e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >r);.      }else
7600: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
7610: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
7620: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
7630: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
7640: 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20  Temp, "NULL");. 
7650: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7660: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
7670: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
7680: 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50  ob );.        zP
7690: 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20  4 = "(blob)";.  
76a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
76b0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
76c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
76d0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
76e0: 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20  se P4_VTAB: {.  
76f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
7700: 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70   *pVtab = pOp->p
7710: 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a  4.pVtab->pVtab;.
7720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7730: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
7740: 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70  emp, "vtab:%p:%p
7750: 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d  ", pVtab, pVtab-
7760: 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20  >pModule);.     
7770: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7780: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
7790: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
77a0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
77b0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
77c0: 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20  , "intarray");. 
77d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
77e0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55  }.    case P4_SU
77f0: 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20  BPROGRAM: {.    
7800: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7810: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7820: 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20   "program");.   
7830: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7840: 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41      case P4_ADVA
7850: 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65  NCE: {.      zTe
7860: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
7870: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7880: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
7890: 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34     zP4 = pOp->p4
78a0: 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  .z;.      if( zP
78b0: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  4==0 ){.        
78c0: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP4 = zTemp;.   
78d0: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
78e0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
78f0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a  .  }.  assert( z
7900: 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  P4!=0 );.  retur
7910: 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n zP4;.}.#endif.
7920: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74  ./*.** Declare t
7930: 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20  o the Vdbe that 
7940: 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74  the BTree object
7950: 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69   at db->aDb[i] i
7960: 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s used..**.** Th
7970: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
7980: 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e  ments need to kn
7990: 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68  ow in advance th
79a0: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f  e complete set o
79b0: 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61  f.** attached da
79c0: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
79d0: 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73  l be use.  A mas
79e0: 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62  k of these datab
79f0: 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74  ases.** is maint
7a00: 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65  ained in p->btre
7a10: 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c  eMask.  The p->l
7a20: 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73  ockMask value is
7a30: 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a   the subset of.*
7a40: 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f  * p->btreeMask o
7a50: 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  f databases that
7a60: 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
7a70: 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lock..*/.void sq
7a80: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
7a90: 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ee(Vdbe *p, int 
7aa0: 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e  i){.  assert( i>
7ab0: 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e  =0 && i<p->db->n
7ac0: 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a  Db && i<(int)siz
7ad0: 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29  eof(yDbMask)*8 )
7ae0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69  ;.  assert( i<(i
7af0: 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72  nt)sizeof(p->btr
7b00: 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 70  eeMask)*8 );.  p
7b10: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 28  ->btreeMask |= (
7b20: 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a  (yDbMask)1)<<i;.
7b30: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 73 71    if( i!=1 && sq
7b40: 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62  lite3BtreeSharab
7b50: 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d  le(p->db->aDb[i]
7b60: 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  .pBt) ){.    p->
7b70: 6c 6f 63 6b 4d 61 73 6b 20 7c 3d 20 28 28 79 44  lockMask |= ((yD
7b80: 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 7d  bMask)1)<<i;.  }
7b90: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
7ba0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
7bb0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
7bc0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
7bd0: 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  0./*.** If SQLit
7be0: 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f  e is compiled to
7bf0: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
7c00: 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74  cache mode and t
7c10: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c  o be threadsafe,
7c20: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
7c30: 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74   obtains the mut
7c40: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
7c50: 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64  th each BtShared
7c60: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68   structure.** th
7c70: 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  at may be access
7c80: 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
7c90: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
7ca0: 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20  nt. In doing so 
7cb0: 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20  it also.** sets 
7cc0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
7cd0: 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f  member of each o
7ce0: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  f the BtShared s
7cf0: 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72  tructures, ensur
7d00: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ing.** that the 
7d10: 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e  correct busy-han
7d20: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73  dler callback is
7d30: 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75   invoked if requ
7d40: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  ired..**.** If S
7d50: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72  QLite is not thr
7d60: 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73  eadsafe but does
7d70: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
7d80: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e  cache mode, then
7d90: 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
7da0: 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b  Enter() is invok
7db0: 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74  ed to set the Bt
7dc0: 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62  Shared.db variab
7dd0: 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  les.** of all of
7de0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
7df0: 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20  ures accessible 
7e00: 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65  via the database
7e10: 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f   handle .** asso
7e20: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
7e30: 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  VM..**.** If SQL
7e40: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
7e50: 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e  dsafe and does n
7e60: 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  ot support share
7e70: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
7e80: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  is.** function i
7e90: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
7ea0: 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73   The p->btreeMas
7eb0: 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74  k field is a bit
7ec0: 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65  mask of all btre
7ed0: 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70  es that the prep
7ee0: 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65  ared .** stateme
7ef0: 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75  nt p will ever u
7f00: 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68  se.  Let N be th
7f10: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
7f20: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
7f30: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
7f40: 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74  g to btrees that
7f50: 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68   use shared cach
7f60: 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e  e.  Then the run
7f70: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20  time of.** this 
7f80: 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20  routine is N*N. 
7f90: 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72   But as N is rar
7fa0: 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c  ely more than 1,
7fb0: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   this should not
7fc0: 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  .** be a problem
7fd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7fe0: 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20  3VdbeEnter(Vdbe 
7ff0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
8000: 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20  yDbMask mask;.  
8010: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
8020: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44  b *aDb;.  int nD
8030: 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b  b;.  if( p->lock
8040: 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e  Mask==0 ) return
8050: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  ;  /* The common
8060: 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20   case */.  db = 
8070: 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64  p->db;.  aDb = d
8080: 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20  b->aDb;.  nDb = 
8090: 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69  db->nDb;.  for(i
80a0: 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44  =0, mask=1; i<nD
80b0: 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20  b; i++, mask += 
80c0: 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20 69  mask){.    if( i
80d0: 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20 70  !=1 && (mask & p
80e0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20 26  ->lockMask)!=0 &
80f0: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
8100: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
8110: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
8120: 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  er(aDb[i].pBt);.
8130: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
8140: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
8150: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
8160: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
8170: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
8180: 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61  0./*.** Unlock a
8190: 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73  ll of the btrees
81a0: 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b   previously lock
81b0: 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20  ed by a call to 
81c0: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
81d0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
81e0: 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62  te3VdbeLeave(Vdb
81f0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
8200: 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a    yDbMask mask;.
8210: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
8220: 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20   Db *aDb;.  int 
8230: 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f  nDb;.  if( p->lo
8240: 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75  ckMask==0 ) retu
8250: 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  rn;  /* The comm
8260: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20  on case */.  db 
8270: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d  = p->db;.  aDb =
8280: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20   db->aDb;.  nDb 
8290: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72  = db->nDb;.  for
82a0: 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c  (i=0, mask=1; i<
82b0: 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b  nDb; i++, mask +
82c0: 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28  = mask){.    if(
82d0: 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26   i!=1 && (mask &
82e0: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30   p->lockMask)!=0
82f0: 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69   && ALWAYS(aDb[i
8300: 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20  ].pBt!=0) ){.   
8310: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
8320: 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29  eave(aDb[i].pBt)
8330: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
8340: 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
8350: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
8360: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
8370: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50  E_DEBUG)./*.** P
8380: 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70  rint a single op
8390: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
83a0: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
83b0: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
83c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
83d0: 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20  dbePrintOp(FILE 
83e0: 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f  *pOut, int pc, O
83f0: 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20  p *pOp){.  char 
8400: 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74  *zP4;.  char zPt
8410: 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43  r[50];.  char zC
8420: 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69  om[100];.  stati
8430: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  c const char *zF
8440: 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d  ormat1 = "%4d %-
8450: 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20  13s %4d %4d %4d 
8460: 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22  %-13s %.2X %s\n"
8470: 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20  ;.  if( pOut==0 
8480: 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b  ) pOut = stdout;
8490: 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79  .  zP4 = display
84a0: 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69  P4(pOp, zPtr, si
84b0: 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66  zeof(zPtr));.#if
84c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
84d0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
84e0: 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d  TS.  displayComm
84f0: 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43  ent(pOp, zP4, zC
8500: 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29  om, sizeof(zCom)
8510: 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b  );.#else.  zCom[
8520: 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  0] = 0;.#endif. 
8530: 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c   /* NB:  The sql
8540: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29  ite3OpcodeName()
8550: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70   function is imp
8560: 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65  lemented by code
8570: 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79   created.  ** by
8580: 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
8590: 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63  wk and mkopcodec
85a0: 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68 69  .awk scripts whi
85b0: 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a 20  ch extract the. 
85c0: 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   ** information 
85d0: 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20  from the vdbe.c 
85e0: 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20  source text */. 
85f0: 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a   fprintf(pOut, z
8600: 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20  Format1, pc, .  
8610: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64      sqlite3Opcod
8620: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
8630: 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  e), pOp->p1, pOp
8640: 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a  ->p2, pOp->p3, z
8650: 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20  P4, pOp->p5,.   
8660: 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66     zCom.  );.  f
8670: 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23  flush(pOut);.}.#
8680: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  endif../*.** Rel
8690: 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66  ease an array of
86a0: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a   N Mem elements.
86b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
86c0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d  eleaseMemArray(M
86d0: 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  em *p, int N){. 
86e0: 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20   if( p && N ){. 
86f0: 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20 20     Mem *pEnd;.  
8700: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8710: 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61  p->db;.    u8 ma
8720: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62  lloc_failed = db
8730: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a  ->mallocFailed;.
8740: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
8750: 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20  tesFreed ){.    
8760: 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d    for(pEnd=&p[N]
8770: 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
8780: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
8790: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
87a0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lloc);.      }. 
87b0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
87c0: 20 7d 0a 20 20 20 20 66 6f 72 28 70 45 6e 64 3d   }.    for(pEnd=
87d0: 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70  &p[N]; p<pEnd; p
87e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
87f0: 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64  t( (&p[1])==pEnd
8800: 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31   || p[0].db==p[1
8810: 5d 2e 64 62 20 29 3b 0a 0a 20 20 20 20 20 20 2f  ].db );..      /
8820: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  * This block is 
8830: 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65  really an inline
8840: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
8850: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
8860: 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68  se().      ** th
8870: 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61  at takes advanta
8880: 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  ge of the fact t
8890: 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  hat the memory c
88a0: 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20  ell value is .  
88b0: 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74      ** being set
88c0: 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72   to NULL after r
88d0: 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e  eleasing any dyn
88e0: 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a  amic resources..
88f0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
8900: 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74  * The justificat
8910: 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
8920: 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74  ing code is that
8930: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20   according to . 
8940: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e       ** callgrin
8950: 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61  d, this causes a
8960: 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61   certain test ca
8970: 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50  se to hit the CP
8980: 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20  U 4.7 .      ** 
8990: 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38  percent less (x8
89a0: 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72  6 linux, gcc ver
89b0: 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29  sion 4.1.2, -O6)
89c0: 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20   than if .      
89d0: 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c  ** sqlite3MemRel
89e0: 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c  ease() were call
89f0: 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69  ed from here. Wi
8a00: 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d  th -O2, this jum
8a10: 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36  ps.      ** to 6
8a20: 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20  .6 percent. The 
8a30: 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73  test case is ins
8a40: 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73  erting 1000 rows
8a50: 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20   into a table . 
8a60: 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20       ** with no 
8a70: 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20  indexes using a 
8a80: 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20  single prepared 
8a90: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
8aa0: 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20  , bind() .      
8ab0: 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20  ** and reset(). 
8ac0: 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75  Inserts are grou
8ad0: 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73  ped into a trans
8ae0: 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
8af0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  .      if( p->fl
8b00: 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d  ags&(MEM_Agg|MEM
8b10: 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d  _Dyn|MEM_Frame|M
8b20: 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20  EM_RowSet) ){.  
8b30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8b40: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a  eMemRelease(p);.
8b50: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8b60: 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20  p->zMalloc ){.  
8b70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8b80: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
8b90: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  oc);.        p->
8ba0: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
8bb0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66     }..      p->f
8bc0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66  lags = MEM_Undef
8bd0: 69 6e 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ined;.    }.    
8be0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8bf0: 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64   = malloc_failed
8c00: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
8c10: 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d  elete a VdbeFram
8c20: 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73  e object and its
8c30: 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46   contents. VdbeF
8c40: 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65  rame objects are
8c50: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
8c60: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
8c70: 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65  opcode in sqlite
8c80: 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a  3VdbeExec()..*/.
8c90: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8ca0: 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65  FrameDelete(Vdbe
8cb0: 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Frame *p){.  int
8cc0: 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20   i;.  Mem *aMem 
8cd0: 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  = VdbeFrameMem(p
8ce0: 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  );.  VdbeCursor 
8cf0: 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43  **apCsr = (VdbeC
8d00: 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70  ursor **)&aMem[p
8d10: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20  ->nChildMem];.  
8d20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
8d30: 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20  hildCsr; i++){. 
8d40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
8d50: 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61  eeCursor(p->v, a
8d60: 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pCsr[i]);.  }.  
8d70: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
8d80: 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d  aMem, p->nChildM
8d90: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  em);.  sqlite3Db
8da0: 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70  Free(p->v->db, p
8db0: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
8dc0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
8dd0: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
8de0: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
8df0: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
8e00: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
8e10: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
8e20: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
8e30: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
8e40: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
8e50: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
8e60: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
8e70: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
8e80: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
8e90: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
8ea0: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
8eb0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
8ec0: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a   "EXPLAIN"..**.*
8ed0: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
8ee0: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72  n==1, each instr
8ef0: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  uction is listed
8f00: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78  .  When.** p->ex
8f10: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f  plain==2, only O
8f20: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
8f30: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65  ctions are liste
8f40: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61  d and these.** a
8f50: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69  re shown in a di
8f60: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20  fferent format. 
8f70: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69   p->explain==2 i
8f80: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
8f90: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51  ent.** EXPLAIN Q
8fa0: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a  UERY PLAN..**.**
8fb0: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
8fc0: 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d  ==1, first the m
8fd0: 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  ain program is l
8fe0: 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68  isted, then each
8ff0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67   of.** the trigg
9000: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
9010: 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79  re listed one by
9020: 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   one..*/.int sql
9030: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
9040: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
9050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9060: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e   VDBE */.){.  in
9070: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
9080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9090: 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20     /* Stop when 
90a0: 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65  row count reache
90b0: 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20  s this */.  int 
90c0: 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  nSub = 0;       
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75   /* Number of su
90f0: 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20  b-vdbes seen so 
9100: 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67  far */.  SubProg
9110: 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b  ram **apSub = 0;
9120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9130: 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64   Array of sub-vd
9140: 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53  bes */.  Mem *pS
9150: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
9160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9170: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c   Memory cell hol
9180: 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  d array of subpr
9190: 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ogs */.  sqlite3
91a0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20   *db = p->db;   
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
91c0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
91d0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
91e0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9200: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
9210: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
9220: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9240: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
9250: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
9260: 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20  >aMem[1];       
9270: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
9280: 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74  em of result set
9290: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
92a0: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61  ->explain );.  a
92b0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
92c0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
92d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
92e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
92f0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42   p->rc==SQLITE_B
9300: 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  USY || p->rc==SQ
9310: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20  LITE_NOMEM );.. 
9320: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
9330: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  this opcode does
9340: 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63   not use dynamic
9350: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a   strings for.  *
9360: 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65  * the result, re
9370: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79  sult columns may
9380: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
9390: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
93a0: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
93b0: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
93c0: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
93d0: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
93e0: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
93f0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
9400: 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e  (pMem, 8);.  p->
9410: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
9420: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
9430: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
9440: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
9450: 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  s if a malloc() 
9460: 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f  inside a call to
9470: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9480: 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a  text() or.    **
9490: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
94a0: 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e  text16() failed.
94b0: 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c    */.    db->mal
94c0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
94d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
94e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
94f0: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
9500: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
9510: 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74   reaches nRow, t
9520: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20  hat means the.  
9530: 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66  ** listing has f
9540: 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69  inished and sqli
9550: 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c  te3_step() shoul
9560: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
9570: 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20  DONE..  ** nRow 
9580: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
9590: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
95a0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   in the main pro
95b0: 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20  gram, plus.  ** 
95c0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
95d0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
95e0: 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62   all trigger sub
95f0: 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74  programs encount
9600: 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72  ered.  ** so far
9610: 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75  .  The nRow valu
9620: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
9630: 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73  as new trigger s
9640: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20  ubprograms are. 
9650: 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   ** encountered,
9660: 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20   but p->pc will 
9670: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68  eventually catch
9680: 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a   up to nRow..  *
9690: 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f  /.  nRow = p->nO
96a0: 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  p;.  if( p->expl
96b0: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  ain==1 ){.    /*
96c0: 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d   The first 8 mem
96d0: 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73  ory cells are us
96e0: 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ed for the resul
96f0: 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69  t set.  So we wi
9700: 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  ll.    ** comman
9710: 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c  deer the 9th cel
9720: 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72  l to use as stor
9730: 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79  age for an array
9740: 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20   of pointers.   
9750: 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73   ** to trigger s
9760: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65  ubprograms.  The
9770: 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74   VDBE is guarant
9780: 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c  eed to have at l
9790: 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65  east 9.    ** ce
97a0: 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  lls.  */.    ass
97b0: 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29  ert( p->nMem>9 )
97c0: 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d  ;.    pSub = &p-
97d0: 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66  >aMem[9];.    if
97e0: 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45  ( pSub->flags&ME
97f0: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
9800: 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  /* On the first 
9810: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
9820: 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c  step(), pSub wil
9830: 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20  l hold a NULL.  
9840: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  It is.      ** i
9850: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
9860: 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53  BLOB by the P4_S
9870: 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73  UBPROGRAM proces
9880: 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77  sing logic below
9890: 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d   */.      nSub =
98a0: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28   pSub->n/sizeof(
98b0: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70  Vdbe*);.      ap
98c0: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
98d0: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
98e0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
98f0: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20   i<nSub; i++){. 
9900: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53       nRow += apS
9910: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[i]->nOp;.    
9920: 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  }.  }..  do{.   
9930: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
9940: 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26  }while( i<nRow &
9950: 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  & p->explain==2 
9960: 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  && p->aOp[i].opc
9970: 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20  ode!=OP_Explain 
9980: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77  );.  if( i>=nRow
9990: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
99a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
99b0: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
99c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
99d0: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
99e0: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
99f0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
9a00: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
9a10: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
9a20: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
9a30: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
9a40: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
9a50: 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d  Str(p->rc));.  }
9a60: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
9a70: 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  zP4;.    Op *pOp
9a80: 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e  ;.    if( i<p->n
9a90: 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  Op ){.      /* T
9aa0: 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e  he output line n
9ab0: 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65  umber is small e
9ac0: 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72  nough that we ar
9ad0: 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20  e still in the. 
9ae0: 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f       ** main pro
9af0: 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70  gram. */.      p
9b00: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
9b10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9b20: 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72    /* We are curr
9b30: 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75  ently listing su
9b40: 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75  bprograms.  Figu
9b50: 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65  re out which one
9b60: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69   and.      ** pi
9b70: 63 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70  ck up the approp
9b80: 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f  riate opcode. */
9b90: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
9ba0: 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b      i -= p->nOp;
9bb0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
9bc0: 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  i>=apSub[j]->nOp
9bd0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
9be0: 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e  i -= apSub[j]->n
9bf0: 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Op;.      }.    
9c00: 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a    pOp = &apSub[j
9c10: 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  ]->aOp[i];.    }
9c20: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
9c30: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
9c40: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
9c50: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
9c60: 6d 2d 3e 6d 65 6d 54 79 70 65 20 3d 20 4d 45 4d  m->memType = MEM
9c70: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
9c80: 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20  ->u.i = i;      
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
9cb0: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
9cc0: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
9cd0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
9ce0: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c  gs = MEM_Static|
9cf0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
9d00: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
9d10: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
9d20: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
9d30: 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f  opcode); /* Opco
9d40: 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  de */.      asse
9d50: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
9d60: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
9d70: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
9d80: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
9d90: 20 20 70 4d 65 6d 2d 3e 6d 65 6d 54 79 70 65 20    pMem->memType 
9da0: 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20  = MEM_Str;.     
9db0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
9dc0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
9dd0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  pMem++;..      /
9de0: 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f  * When an OP_Pro
9df0: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65  gram opcode is e
9e00: 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e  ncounter (the on
9e10: 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68  ly opcode that h
9e20: 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34  as.      ** a P4
9e30: 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75  _SUBPROGRAM argu
9e40: 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68  ment), expand th
9e50: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  e size of the ar
9e60: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61  ray of subprogra
9e70: 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74  ms.      ** kept
9e80: 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a   in p->aMem[9].z
9e90: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77   to hold the new
9ea0: 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d   program - assum
9eb0: 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67  ing this subprog
9ec0: 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ram.      ** has
9ed0: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
9ee0: 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f  n seen..      */
9ef0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
9f00: 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52  p4type==P4_SUBPR
9f10: 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20  OGRAM ){.       
9f20: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53   int nByte = (nS
9f30: 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62  ub+1)*sizeof(Sub
9f40: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
9f50: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
9f60: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75    for(j=0; j<nSu
9f70: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  b; j++){.       
9f80: 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d     if( apSub[j]=
9f90: 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61  =pOp->p4.pProgra
9fa0: 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
9fb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
9fc0: 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49   j==nSub && SQLI
9fd0: 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64  TE_OK==sqlite3Vd
9fe0: 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20  beMemGrow(pSub, 
9ff0: 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 20  nByte, nSub!=0) 
a000: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53  ){.          apS
a010: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
a020: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
a030: 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75         apSub[nSu
a040: 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  b++] = pOp->p4.p
a050: 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20  Program;.       
a060: 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c     pSub->flags |
a070: 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20  = MEM_Blob;.    
a080: 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20        pSub->n = 
a090: 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50  nSub*sizeof(SubP
a0a0: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
a0b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a0c0: 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  }..    pMem->fla
a0d0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
a0e0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
a0f0: 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20  p->p1;          
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a110: 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P1 */.    pMe
a120: 6d 2d 3e 6d 65 6d 54 79 70 65 20 3d 20 4d 45 4d  m->memType = MEM
a130: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  _Int;.    pMem++
a140: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
a150: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
a160: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
a170: 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20  p->p2;          
a180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a190: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P2 */.    pMe
a1a0: 6d 2d 3e 6d 65 6d 54 79 70 65 20 3d 20 4d 45 4d  m->memType = MEM
a1b0: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  _Int;.    pMem++
a1c0: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
a1d0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
a1e0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
a1f0: 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20  p->p3;          
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a210: 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P3 */.    pMe
a220: 6d 2d 3e 6d 65 6d 54 79 70 65 20 3d 20 4d 45 4d  m->memType = MEM
a230: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  _Int;.    pMem++
a240: 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ;..    if( sqlit
a250: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d  e3VdbeMemGrow(pM
a260: 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20  em, 32, 0) ){   
a270: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a           /* P4 *
a280: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
a290: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
a2a0: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
a2b0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
a2c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
a2d0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79  ->flags = MEM_Dy
a2e0: 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  n|MEM_Str|MEM_Te
a2f0: 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64 69  rm;.    zP4 = di
a300: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65  splayP4(pOp, pMe
a310: 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69  m->z, 32);.    i
a320: 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20  f( zP4!=pMem->z 
a330: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a340: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d  VdbeMemSetStr(pM
a350: 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c  em, zP4, -1, SQL
a360: 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20  ITE_UTF8, 0);.  
a370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
a380: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
a390: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
a3a0: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
a3b0: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
a3c0: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
a3d0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
a3e0: 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 6d 65    }.    pMem->me
a3f0: 6d 54 79 70 65 20 3d 20 4d 45 4d 5f 53 74 72 3b  mType = MEM_Str;
a400: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
a410: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
a420: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
a430: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
a440: 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20 30 29 20  row(pMem, 4, 0) 
a450: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
a460: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
a470: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
a480: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a490: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
a4a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
a4b0: 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53   = MEM_Dyn|MEM_S
a4c0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
a4d0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a     pMem->n = 2;.
a4e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
a4f0: 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e  printf(3, pMem->
a500: 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e  z, "%.2x", pOp->
a510: 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a  p5);   /* P5 */.
a520: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6d 65 6d 54        pMem->memT
a530: 79 70 65 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20  ype = MEM_Str;. 
a540: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
a550: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
a560: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23      pMem++;.  .#
a570: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
a580: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
a590: 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 73  ENTS.      if( s
a5a0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
a5b0: 77 28 70 4d 65 6d 2c 20 35 30 30 2c 20 30 29 20  w(pMem, 500, 0) 
a5c0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
a5d0: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
a5e0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
a5f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a600: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
a610: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
a620: 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53   = MEM_Dyn|MEM_S
a630: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
a640: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73     pMem->n = dis
a650: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c  playComment(pOp,
a660: 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35   zP4, pMem->z, 5
a670: 30 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  00);.      pMem-
a680: 3e 6d 65 6d 54 79 70 65 20 3d 20 4d 45 4d 5f 53  >memType = MEM_S
a690: 74 72 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  tr;.      pMem->
a6a0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
a6b0: 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70  8;.#else.      p
a6c0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
a6d0: 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  _Null;          
a6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a6f0: 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  Comment */.     
a700: 20 70 4d 65 6d 2d 3e 6d 65 6d 54 79 70 65 20 3d   pMem->memType =
a710: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 23 65 6e 64 69   MEM_Null;.#endi
a720: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  f.    }..    p->
a730: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
a740: 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   4*(p->explain-1
a750: 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c  );.    p->pResul
a760: 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  tSet = &p->aMem[
a770: 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  1];.    p->rc = 
a780: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
a790: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
a7a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
a7b0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
a7c0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
a7d0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
a7e0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
a7f0: 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61  rint the SQL tha
a800: 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65  t was used to ge
a810: 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72  nerate a VDBE pr
a820: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
a830: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53  qlite3VdbePrintS
a840: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63  ql(Vdbe *p){.  c
a850: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30  onst char *z = 0
a860: 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20  ;.  if( p->zSql 
a870: 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53  ){.    z = p->zS
a880: 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ql;.  }else if( 
a890: 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20  p->nOp>=1 ){.   
a8a0: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70   const VdbeOp *p
a8b0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
a8c0: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
a8d0: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26  code==OP_Init &&
a8e0: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
a8f0: 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e  .      z = pOp->
a900: 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c  p4.z;.      whil
a910: 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  e( sqlite3Isspac
a920: 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
a930: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29   }.  }.  if( z )
a940: 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25   printf("SQL: [%
a950: 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e  s]\n", z);.}.#en
a960: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
a970: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
a980: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
a990: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
a9a0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69  TRACE)./*.** Pri
a9b0: 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65  nt an IOTRACE me
a9c0: 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51  ssage showing SQ
a9d0: 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f  L content..*/.vo
a9e0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f  id sqlite3VdbeIO
a9f0: 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70  TraceSql(Vdbe *p
aa00: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
aa10: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
aa20: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69  *pOp;.  if( sqli
aa30: 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20  te3IoTrace==0 ) 
aa40: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f  return;.  if( nO
aa50: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
aa60: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
aa70: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
aa80: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
aa90: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
aaa0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
aab0: 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a    char z[1000];.
aac0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
aad0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
aae0: 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  z, "%s", pOp->p4
aaf0: 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  .z);.    for(i=0
ab00: 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ; sqlite3Isspace
ab10: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
ab20: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
ab30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
ab40: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
ab50: 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  (z[i]) ){.      
ab60: 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20    if( z[i-1]!=' 
ab70: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
ab80: 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [j++] = ' ';.   
ab90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
aba0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b  se{.        z[j+
abb0: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20  +] = z[i];.     
abc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
abd0: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
abe0: 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25  e3IoTrace("SQL %
abf0: 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  s\n", z);.  }.}.
ac00: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
ac10: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20  E_OMIT_TRACE && 
ac20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
ac30: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TRACE */../*.** 
ac40: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
ac50: 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65  rom a fixed size
ac60: 20 62 75 66 66 65 72 20 61 6e 64 20 72 65 74 75   buffer and retu
ac70: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
ac80: 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20 20  ** that space.  
ac90: 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20  If insufficient 
aca0: 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
acb0: 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  le, return NULL.
acc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20  .**.** The pBuf 
acd0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
ace0: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   initial value o
acf0: 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63  f a pointer whic
ad00: 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76  h will.** receiv
ad10: 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79  e the new memory
ad20: 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61  .  pBuf is norma
ad30: 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42  lly NULL.  If pB
ad40: 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c  uf is not.** NUL
ad50: 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
ad60: 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61   memory space ha
ad70: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
ad80: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61  llocated and tha
ad90: 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  t.** this routin
ada0: 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c  e should not all
adb0: 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65  ocate any new me
adc0: 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66  mory.  When pBuf
add0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20   is not.** NULL 
ade0: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42  simply return pB
adf0: 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61  uf.  Only alloca
ae00: 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70  te new memory sp
ae10: 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a  ace when pBuf.**
ae20: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
ae30: 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d  nByte is the num
ae40: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
ae50: 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a  space needed..**
ae60: 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e  .** *ppFrom poin
ae70: 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20  ts to available 
ae80: 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70  space and pEnd p
ae90: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64  oints to the end
aea0: 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c   of the.** avail
aeb0: 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68 65  able space.  Whe
aec0: 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63  n space is alloc
aed0: 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73  ated, *ppFrom is
aee0: 20 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a 2a   advanced past.*
aef0: 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
af00: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
af10: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20  ..**.** *pnByte 
af20: 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20  is a counter of 
af30: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
af40: 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 68 61  tes of space tha
af50: 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a  t have failed.**
af60: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49   to allocate.  I
af70: 66 20 74 68 65 72 65 20 69 73 20 69 6e 73 75 66  f there is insuf
af80: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e  ficient space in
af90: 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69   *ppFrom to sati
afa0: 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  sfy the.** reque
afb0: 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  st, then increme
afc0: 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68  nt *pnByte by th
afd0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
afe0: 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74  request..*/.stat
aff0: 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70  ic void *allocSp
b000: 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75  ace(.  void *pBu
b010: 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  f,          /* W
b020: 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e  here return poin
b030: 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  ter will be stor
b040: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ed */.  int nByt
b050: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
b060: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
b070: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
b080: 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20   u8 **ppFrom,   
b090: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
b0a0: 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a   Allocate from *
b0b0: 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a  ppFrom */.  u8 *
b0c0: 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  pEnd,           
b0d0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31   /* Pointer to 1
b0e0: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65   byte past the e
b0f0: 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75  nd of *ppFrom bu
b100: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ffer */.  int *p
b110: 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 2f  nByte          /
b120: 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  * If allocation 
b130: 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20  cannot be made, 
b140: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74  increment *pnByt
b150: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
b160: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
b170: 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20  GNMENT(*ppFrom) 
b180: 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29 20  );.  if( pBuf ) 
b190: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e  return pBuf;.  n
b1a0: 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42  Byte = ROUND8(nB
b1b0: 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a 70  yte);.  if( &(*p
b1c0: 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d  pFrom)[nByte] <=
b1d0: 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42 75   pEnd ){.    pBu
b1e0: 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46 72  f = (void*)*ppFr
b1f0: 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20  om;.    *ppFrom 
b200: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73  += nByte;.  }els
b210: 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b  e{.    *pnByte +
b220: 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72  = nByte;.  }.  r
b230: 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f  eturn pBuf;.}../
b240: 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20  *.** Rewind the 
b250: 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65  VDBE back to the
b260: 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72   beginning in pr
b270: 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a  eparation for.**
b280: 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a   running it..*/.
b290: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
b2a0: 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b  Rewind(Vdbe *p){
b2b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
b2c0: 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
b2d0: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
b2e0: 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e  LE).  int i;.#en
b2f0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21  dif.  assert( p!
b300: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b310: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
b320: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20  AGIC_INIT );..  
b330: 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  /* There should 
b340: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
b350: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  opcode..  */.  a
b360: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
b370: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
b380: 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d   magic to VDBE_M
b390: 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20  AGIC_RUN sooner 
b3a0: 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
b3b0: 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63  r. */.  p->magic
b3c0: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
b3d0: 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  N;..#ifdef SQLIT
b3e0: 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d  E_DEBUG.  for(i=
b3f0: 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  1; i<p->nMem; i+
b400: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
b410: 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70  p->aMem[i].db==p
b420: 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ->db );.  }.#end
b430: 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b  if.  p->pc = -1;
b440: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
b450: 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72  E_OK;.  p->error
b460: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
b470: 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  t;.  p->magic = 
b480: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
b490: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
b4a0: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
b4b0: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
b4c0: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
b4d0: 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d  55;.  p->iStatem
b4e0: 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46  ent = 0;.  p->nF
b4f0: 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b  kConstraint = 0;
b500: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
b510: 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20  FILE.  for(i=0; 
b520: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
b530: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
b540: 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f  t = 0;.    p->aO
b550: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
b560: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
b570: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
b580: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
b590: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72  or execution for
b5a0: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
b5b0: 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e  after.** creatin
b5c0: 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  g the virtual ma
b5d0: 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76  chine.  This inv
b5e0: 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63  olves things suc
b5f0: 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69  h.** as allocati
b600: 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61  ng stack space a
b610: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
b620: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
b630: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
b640: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
b650: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
b660: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
b670: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
b680: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
b690: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
b6a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
b6b0: 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63  y be called exac
b6c0: 74 20 6f 6e 63 65 20 6f 6e 20 61 20 65 61 63 68  t once on a each
b6d0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
b6e0: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  ..** After this 
b6f0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
b700: 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
b710: 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64  n "packaged" and
b720: 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20   is ready.** to 
b730: 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73  run.  After this
b740: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
b750: 65 64 2c 20 66 75 74 68 65 72 20 63 61 6c 6c 73  ed, futher calls
b760: 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
b770: 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74  dbeAddOp() funct
b780: 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69  ions are prohibi
b790: 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ted.  This routi
b7a0: 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a  ne disconnects.*
b7b0: 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  * the Vdbe from 
b7c0: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
b7d0: 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e   that helped gen
b7e0: 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74  erate it so that
b7f0: 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65   the.** the Vdbe
b800: 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65   becomes an inde
b810: 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61  pendent entity a
b820: 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  nd the Parse obj
b830: 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65  ect can be.** de
b840: 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55  stroyed..**.** U
b850: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
b860: 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65  beRewind() proce
b870: 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20  dure to restore 
b880: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
b890: 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73  e back.** to its
b8a0: 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61   initial state a
b8b0: 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  fter it has been
b8c0: 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   run..*/.void sq
b8d0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
b8e0: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b900: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
b910: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
b920: 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  rse             
b930: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
b940: 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
b950: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b970: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
b980: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
b990: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b9b0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d   Number of param
b9c0: 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  eters */.  int n
b9d0: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
b9e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b9f0: 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79  ber of VM memory
ba00: 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
ba10: 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20  int nCursor;    
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
ba40: 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ors required */.
ba50: 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
ba80: 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72  guments in subpr
ba90: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
baa0: 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20  nOnce;          
bab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
bac0: 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20  mber of OP_Once 
bad0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a  instructions */.
bae0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb00: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
bb10: 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20   */.  u8 *zCsr; 
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb30: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61       /* Memory a
bb40: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
bb50: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  ocation */.  u8 
bb60: 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *zEnd;          
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
bb80: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 61  irst byte past a
bb90: 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20  llocated memory 
bba0: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbc0: 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20      /* How much 
bbd0: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20  extra memory is 
bbe0: 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73  needed */..  ass
bbf0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
bc00: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
bc10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
bc20: 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
bc30: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
bc40: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
bc50: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
bc60: 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a  e==p->pParse );.
bc70: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
bc80: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
bc90: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20  ocFailed==0 );. 
bca0: 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e   nVar = pParse->
bcb0: 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70  nVar;.  nMem = p
bcc0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e  Parse->nMem;.  n
bcd0: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
bce0: 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20  >nTab;.  nArg = 
bcf0: 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b  pParse->nMaxArg;
bd00: 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73  .  nOnce = pPars
bd10: 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20  e->nOnce;.  if( 
bd20: 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65  nOnce==0 ) nOnce
bd30: 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20   = 1; /* Ensure 
bd40: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74  at least one byt
bd50: 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  e in p->aOnceFla
bd60: 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46  g[] */.  .  /* F
bd70: 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 72  or each cursor r
bd80: 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c  equired, also al
bd90: 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20  locate a memory 
bda0: 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a  cell. Memory.  *
bdb0: 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d  * cells (nMem+1-
bdc0: 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20  nCursor)..nMem, 
bdd0: 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20  inclusive, will 
bde0: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79  never be used by
bdf0: 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70  .  ** the vdbe p
be00: 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20  rogram. Instead 
be10: 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74 6f  they are used to
be20: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
be30: 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72  for.  ** VdbeCur
be40: 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72  sor/BtCursor str
be50: 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f  uctures. The blo
be60: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
be70: 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a  ciated with .  *
be80: 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74  * cursor 0 is st
be90: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63  ored in memory c
bea0: 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79  ell nMem. Memory
beb0: 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20   cell (nMem-1). 
bec0: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62   ** stores the b
bed0: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
bee0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
bef0: 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a  rsor 1, etc..  *
bf00: 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  *.  ** See also:
bf10: 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
bf20: 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
bf30: 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  = nCursor;..  /*
bf40: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
bf50: 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  for memory regis
bf60: 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62  ters, SQL variab
bf70: 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72  les, VDBE cursor
bf80: 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61  s and .  ** an a
bf90: 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20  rray to marshal 
bfa0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67  SQL function arg
bfb0: 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a  uments in..  */.
bfc0: 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70    zCsr = (u8*)&p
bfd0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20  ->aOp[p->nOp];  
bfe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
bff0: 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f  ory avaliable fo
c000: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
c010: 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26 70    zEnd = (u8*)&p
c020: 2d 3e 61 4f 70 5b 70 50 61 72 73 65 2d 3e 6e 4f  ->aOp[pParse->nO
c030: 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72  pAlloc];  /* Fir
c040: 73 74 20 62 79 74 65 20 70 61 73 74 20 65 6e 64  st byte past end
c050: 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20   of zCsr[] */.. 
c060: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
c070: 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d  (p, &nArg);.  p-
c080: 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
c090: 20 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e   = (u8)(pParse->
c0a0: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20  isMultiWrite && 
c0b0: 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
c0c0: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
c0d0: 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  >explain && nMem
c0e0: 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20  <10 ){.    nMem 
c0f0: 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  = 10;.  }.  mems
c100: 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64  et(zCsr, 0, zEnd
c110: 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73 72 20 2b  -zCsr);.  zCsr +
c120: 3d 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30  = (zCsr - (u8*)0
c130: 29 26 37 3b 0a 20 20 61 73 73 65 72 74 28 20 45  )&7;.  assert( E
c140: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
c150: 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 70  ENT(zCsr) );.  p
c160: 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a  ->expired = 0;..
c170: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20    /* Memory for 
c180: 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d  registers, param
c190: 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65  eters, cursor, e
c1a0: 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  tc, is allocated
c1b0: 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73   in two.  ** pas
c1c0: 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72  ses.  On the fir
c1d0: 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20  st pass, we try 
c1e0: 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20  to reuse unused 
c1f0: 73 70 61 63 65 20 61 74 20 74 68 65 20 0a 20 20  space at the .  
c200: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  ** end of the op
c210: 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20  code array.  If 
c220: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
c230: 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d   satisfy all mem
c240: 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  ory.  ** require
c250: 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67  ments by reusing
c260: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
c270: 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65  y tail, then the
c280: 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73   second.  ** pas
c290: 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74  s will fill in t
c2a0: 68 65 20 72 65 73 74 20 75 73 69 6e 67 20 61 20  he rest using a 
c2b0: 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e  fresh allocation
c2c0: 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
c2d0: 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72  is two-pass appr
c2e0: 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 65 73  oach that reuses
c2f0: 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
c300: 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d  as possible from
c310: 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76  .  ** the leftov
c320: 65 72 20 73 70 61 63 65 20 61 74 20 74 68 65 20  er space at the 
c330: 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  end of the opcod
c340: 65 20 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e  e array can sign
c350: 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72  ificantly.  ** r
c360: 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74  educe the amount
c370: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20   of memory held 
c380: 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74  by a prepared st
c390: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
c3a0: 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  do {.    nByte =
c3b0: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20   0;.    p->aMem 
c3c0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
c3d0: 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f  aMem, nMem*sizeo
c3e0: 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a  f(Mem), &zCsr, z
c3f0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
c400: 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f    p->aVar = allo
c410: 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20  cSpace(p->aVar, 
c420: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
c430: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
c440: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
c450: 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pArg = allocSpac
c460: 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67  e(p->apArg, nArg
c470: 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26  *sizeof(Mem*), &
c480: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
c490: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61  te);.    p->azVa
c4a0: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
c4b0: 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69  ->azVar, nVar*si
c4c0: 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43  zeof(char*), &zC
c4d0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
c4e0: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20  );.    p->apCsr 
c4f0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
c500: 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73  apCsr, nCursor*s
c510: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
c520: 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  *),.            
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
c540: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
c550: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65  e);.    p->aOnce
c560: 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  Flag = allocSpac
c570: 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20  e(p->aOnceFlag, 
c580: 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45  nOnce, &zCsr, zE
c590: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
c5a0: 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20   if( nByte ){.  
c5b0: 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73      p->pFree = s
c5c0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
c5d0: 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  ro(db, nByte);. 
c5e0: 20 20 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20     }.    zCsr = 
c5f0: 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a 45  p->pFree;.    zE
c600: 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65  nd = &zCsr[nByte
c610: 5d 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42 79  ];.  }while( nBy
c620: 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  te && !db->mallo
c630: 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d  cFailed );..  p-
c640: 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73  >nCursor = nCurs
c650: 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c  or;.  p->nOnceFl
c660: 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66  ag = nOnce;.  if
c670: 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20  ( p->aVar ){.   
c680: 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61   p->nVar = (ynVa
c690: 72 29 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72 28  r)nVar;.    for(
c6a0: 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b  n=0; n<nVar; n++
c6b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72  ){.      p->aVar
c6c0: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
c6d0: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Null;.      p->a
c6e0: 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  Var[n].db = db;.
c6f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
c700: 70 2d 3e 61 7a 56 61 72 20 29 7b 0a 20 20 20 20  p->azVar ){.    
c710: 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73  p->nzVar = pPars
c720: 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65  e->nzVar;.    me
c730: 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70  mcpy(p->azVar, p
c740: 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d  Parse->azVar, p-
c750: 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d  >nzVar*sizeof(p-
c760: 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20  >azVar[0]));.   
c770: 20 6d 65 6d 73 65 74 28 70 50 61 72 73 65 2d 3e   memset(pParse->
c780: 61 7a 56 61 72 2c 20 30 2c 20 70 50 61 72 73 65  azVar, 0, pParse
c790: 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70  ->nzVar*sizeof(p
c7a0: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29  Parse->azVar[0])
c7b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
c7c0: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61  aMem ){.    p->a
c7d0: 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20  Mem--;          
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
c7f0: 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20  Mem[] goes from 
c800: 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70  1..nMem */.    p
c810: 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20  ->nMem = nMem;  
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c830: 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d  *       not from
c840: 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20   0..nMem-1 */.  
c850: 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d    for(n=1; n<=nM
c860: 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  em; n++){.      
c870: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73  p->aMem[n].flags
c880: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64   = MEM_Undefined
c890: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b  ;.      p->aMem[
c8a0: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
c8b0: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61  }.  }.  p->expla
c8c0: 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70  in = pParse->exp
c8d0: 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  lain;.  sqlite3V
c8e0: 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a  dbeRewind(p);.}.
c8f0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56  ./*.** Close a V
c900: 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72  DBE cursor and r
c910: 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72  elease all the r
c920: 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75  esources that cu
c930: 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73  rsor .** happens
c940: 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69   to hold..*/.voi
c950: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65  d sqlite3VdbeFre
c960: 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c  eCursor(Vdbe *p,
c970: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78   VdbeCursor *pCx
c980: 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20  ){.  if( pCx==0 
c990: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
c9a0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
c9b0: 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64  SorterClose(p->d
c9c0: 62 2c 20 70 43 78 29 3b 0a 20 20 69 66 28 20 70  b, pCx);.  if( p
c9d0: 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73  Cx->pBt ){.    s
c9e0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
c9f0: 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pCx->pBt);.    
ca00: 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72  /* The pCx->pCur
ca10: 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73  sor will be clos
ca20: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c  e automatically,
ca30: 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62   if it exists, b
ca40: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c  y.    ** the cal
ca50: 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65  l above. */.  }e
ca60: 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75  lse if( pCx->pCu
ca70: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
ca80: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
ca90: 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72  sor(pCx->pCursor
caa0: 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  );.  }.#ifndef S
cab0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
cac0: 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43  ALTABLE.  if( pC
cad0: 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29  x->pVtabCursor )
cae0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74  {.    sqlite3_vt
caf0: 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
cb00: 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56  Cursor = pCx->pV
cb10: 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63  tabCursor;.    c
cb20: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
cb30: 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70  ule *pModule = p
cb40: 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
cb50: 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20  b->pModule;.    
cb60: 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
cb70: 3d 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65  = 1;.    pModule
cb80: 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75  ->xClose(pVtabCu
cb90: 72 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  rsor);.    p->in
cba0: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a  VtabMethod = 0;.
cbb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
cbc0: 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c  .** Copy the val
cbd0: 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
cbe0: 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75  e VdbeFrame stru
cbf0: 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62  cture to its Vdb
cc00: 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73  e. This.** is us
cc10: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ed, for example,
cc20: 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20   when a trigger 
cc30: 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68  sub-program is h
cc40: 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65  alted to restore
cc50: 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  .** control to t
cc60: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  he main program.
cc70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
cc80: 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28  dbeFrameRestore(
cc90: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
cca0: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
ccb0: 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e  pFrame->v;.  v->
ccc0: 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61  aOnceFlag = pFra
ccd0: 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20  me->aOnceFlag;. 
cce0: 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20   v->nOnceFlag = 
ccf0: 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61  pFrame->nOnceFla
cd00: 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46  g;.  v->aOp = pF
cd10: 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e  rame->aOp;.  v->
cd20: 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f  nOp = pFrame->nO
cd30: 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70  p;.  v->aMem = p
cd40: 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76  Frame->aMem;.  v
cd50: 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->nMem = pFrame-
cd60: 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73  >nMem;.  v->apCs
cd70: 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73  r = pFrame->apCs
cd80: 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20  r;.  v->nCursor 
cd90: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f  = pFrame->nCurso
cda0: 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74  r;.  v->db->last
cdb0: 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e  Rowid = pFrame->
cdc0: 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e  lastRowid;.  v->
cdd0: 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65  nChange = pFrame
cde0: 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65 74  ->nChange;.  ret
cdf0: 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a  urn pFrame->pc;.
ce00: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
ce10: 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a  ll cursors..**.*
ce20: 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61  * Also release a
ce30: 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  ny dynamic memor
ce40: 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d  y held by the VM
ce50: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65   in the Vdbe.aMe
ce60: 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c  m memory .** cel
ce70: 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73  l array. This is
ce80: 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68   necessary as th
ce90: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72  e memory cell ar
cea0: 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a  ray may contain.
ceb0: 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56  ** pointers to V
cec0: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
ced0: 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74  , which may in t
cee0: 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  urn contain poin
cef0: 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20  ters to.** open 
cf00: 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74  cursors..*/.stat
cf10: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c  ic void closeAll
cf20: 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29  Cursors(Vdbe *p)
cf30: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  {.  if( p->pFram
cf40: 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
cf50: 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20  me *pFrame;.    
cf60: 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46  for(pFrame=p->pF
cf70: 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50  rame; pFrame->pP
cf80: 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46  arent; pFrame=pF
cf90: 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  rame->pParent);.
cfa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
cfb0: 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61  rameRestore(pFra
cfc0: 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 46  me);.  }.  p->pF
cfd0: 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  rame = 0;.  p->n
cfe0: 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66  Frame = 0;..  if
cff0: 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20  ( p->apCsr ){.  
d000: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
d010: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
d020: 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
d030: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d  VdbeCursor *pC =
d040: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
d050: 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20      if( pC ){.  
d060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d070: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
d080: 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  C);.        p->a
d090: 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pCsr[i] = 0;.   
d0a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
d0b0: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
d0c0: 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72      releaseMemAr
d0d0: 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c  ray(&p->aMem[1],
d0e0: 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20   p->nMem);.  }. 
d0f0: 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46   while( p->pDelF
d100: 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
d110: 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d  Frame *pDel = p-
d120: 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20  >pDelFrame;.    
d130: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70  p->pDelFrame = p
d140: 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  Del->pParent;.  
d150: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
d160: 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a  meDelete(pDel);.
d170: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
d180: 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c   any auxdata all
d190: 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ocations made by
d1a0: 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 73 71 6c   the VM */.  sql
d1b0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
d1c0: 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b  xData(p, -1, 0);
d1d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41  .  assert( p->pA
d1e0: 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a  uxData==0 );.}..
d1f0: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74  /*.** Clean up t
d200: 68 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63  he VM after exec
d210: 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ution..**.** Thi
d220: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61  s routine will a
d230: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
d240: 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20  se any cursors, 
d250: 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a  lists, and/or.**
d260: 20 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65   sorters that we
d270: 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49  re left open.  I
d280: 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74  t also deletes t
d290: 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20  he values of.** 
d2a0: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65  variables in the
d2b0: 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a   aVar[] array..*
d2c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c  /.static void Cl
d2d0: 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a  eanup(Vdbe *p){.
d2e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d2f0: 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53  p->db;..#ifdef S
d300: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
d310: 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28   Execute assert(
d320: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
d330: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
d340: 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64  Vdbe.apCsr[] and
d350: 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d   .  ** Vdbe.aMem
d360: 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61  [] arrays have a
d370: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61  lready been clea
d380: 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e  ned up.  */.  in
d390: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
d3a0: 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69  Csr ) for(i=0; i
d3b0: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
d3c0: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43  ) assert( p->apC
d3d0: 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66  sr[i]==0 );.  if
d3e0: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
d3f0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e   for(i=1; i<=p->
d400: 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72  nMem; i++) asser
d410: 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c  t( p->aMem[i].fl
d420: 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e  ags==MEM_Undefin
d430: 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ed );.  }.#endif
d440: 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
d450: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
d460: 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
d470: 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c  = 0;.  p->pResul
d480: 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tSet = 0;.}../*.
d490: 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
d4a0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
d4b0: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
d4c0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
d4d0: 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65  s SQL.** stateme
d4e0: 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20  nt. This is now 
d4f0: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  set at compile t
d500: 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ime, rather than
d510: 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75   during.** execu
d520: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65  tion of the vdbe
d530: 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74   program so that
d540: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
d550: 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62  count() can.** b
d560: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53  e called on an S
d570: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66  QL statement bef
d580: 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ore sqlite3_step
d590: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
d5a0: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
d5b0: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  s(Vdbe *p, int n
d5c0: 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65  ResColumn){.  Me
d5d0: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69  m *pColName;.  i
d5e0: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
d5f0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
d600: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
d610: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
d620: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
d630: 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  ME_N);.  sqlite3
d640: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
d650: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e  olName);.  n = n
d660: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
d670: 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
d680: 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73  lumn = (u16)nRes
d690: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
d6a0: 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65  lName = pColName
d6b0: 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33   = (Mem*)sqlite3
d6c0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
d6d0: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
d6e0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
d6f0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
d700: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
d710: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  0 ){.    pColNam
d720: 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  e->flags = MEM_N
d730: 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  ull;.    pColNam
d740: 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  e->db = p->db;. 
d750: 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20     pColName++;. 
d760: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
d770: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
d780: 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
d790: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
d7a0: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
d7b0: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
d7c0: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
d7d0: 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
d7e0: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
d7f0: 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
d800: 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
d810: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
d820: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
d830: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20  **.** The final 
d840: 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c  parameter, xDel,
d850: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
d860: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
d870: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a  SQLITE_STATIC.**
d880: 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   or SQLITE_TRANS
d890: 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53  IENT. If it is S
d8a0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74  QLITE_DYNAMIC, t
d8b0: 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70  hen the buffer p
d8c0: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
d8d0: 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72  zName will be fr
d8e0: 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62  eed by sqlite3Db
d8f0: 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  Free() when the 
d900: 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65  vdbe is destroye
d910: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
d920: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d930: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d950: 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e      /* Vdbe bein
d960: 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a  g configured */.
d970: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d990: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
d9a0: 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c  olumn zName appl
d9b0: 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ies to */.  int 
d9c0: 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  var,            
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d9e0: 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41  One of the COLNA
d9f0: 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a  ME_* constants *
da00: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
da10: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
da20: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
da30: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
da40: 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76  ning name */.  v
da50: 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64  oid (*xDel)(void
da60: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
da70: 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  /* Memory manage
da80: 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f  ment strategy fo
da90: 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  r zName */.){.  
daa0: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70  int rc;.  Mem *p
dab0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  ColName;.  asser
dac0: 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f  t( idx<p->nResCo
dad0: 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
dae0: 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20  ( var<COLNAME_N 
daf0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
db00: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
db10: 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61      assert( !zNa
db20: 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49  me || xDel!=SQLI
db30: 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20  TE_DYNAMIC );.  
db40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
db50: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73  NOMEM;.  }.  ass
db60: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  ert( p->aColName
db70: 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d  !=0 );.  pColNam
db80: 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d  e = &(p->aColNam
db90: 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65  e[idx+var*p->nRe
dba0: 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20  sColumn]);.  rc 
dbb0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
dbc0: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
dbd0: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
dbe0: 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a  TE_UTF8, xDel);.
dbf0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20    assert( rc!=0 
dc00: 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43  || !zName || (pC
dc10: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45  olName->flags&ME
dc20: 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20  M_Term)!=0 );.  
dc30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
dc40: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72  .** A read or wr
dc50: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
dc60: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
dc70: 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61  e active on data
dc80: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
dc90: 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  b. If a transact
dca0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63  ion is active, c
dcb0: 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65  ommit it. If the
dcc0: 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65  re is a.** write
dcd0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61  -transaction spa
dce0: 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  nning more than 
dcf0: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
dd00: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  e, this routine.
dd10: 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ** takes care of
dd20: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
dd30: 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f  nal trickery..*/
dd40: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
dd50: 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  Commit(sqlite3 *
dd60: 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
dd70: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72  int i;.  int nTr
dd80: 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d  ans = 0;  /* Num
dd90: 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73  ber of databases
dda0: 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20   with an active 
ddb0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
ddc0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
ddd0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
dde0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30   needXcommit = 0
ddf0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
de00: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
de10: 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69  LE.  /* With thi
de20: 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65  s option, sqlite
de30: 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64  3VtabSync() is d
de40: 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d  efined to be sim
de50: 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45  ply .  ** SQLITE
de60: 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20  _OK so p is not 
de70: 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e  used. .  */.  UN
de80: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
de90: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
dea0: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
deb0: 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c  thing else, call
dec0: 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
ded0: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20  lback for any.  
dee0: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
def0: 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e  e tables written
df00: 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63   in this transac
df10: 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74  tion. This has t
df20: 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62  o.  ** be done b
df30: 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e  efore determinin
df40: 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74  g whether a mast
df50: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
df60: 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
df70: 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29  d, as an xSync()
df80: 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64   callback may ad
df90: 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  d an attached da
dfa0: 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74  tabase.  ** to t
dfb0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
dfc0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
dfd0: 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20  te3VtabSync(db, 
dfe0: 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  p);..  /* This l
dff0: 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28  oop determines (
e000: 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74  a) if the commit
e010: 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20   hook should be 
e020: 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a  invoked and.  **
e030: 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61   (b) how many da
e040: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76  tabase files hav
e050: 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  e open write tra
e060: 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a  nsactions, not .
e070: 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74    ** including t
e080: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
e090: 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61  . (b) is importa
e0a0: 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f  nt because if mo
e0b0: 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e  re than .  ** on
e0c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
e0d0: 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  has an open writ
e0e0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
e0f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
e100: 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71    ** file is req
e110: 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f  uired for an ato
e120: 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f  mic commit..  */
e130: 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d   .  for(i=0; rc=
e140: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
e150: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
e160: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
e170: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
e180: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
e190: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
e1a0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65  Bt) ){.      nee
e1b0: 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  dXcommit = 1;.  
e1c0: 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e      if( i!=1 ) n
e1d0: 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73  Trans++;.      s
e1e0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
e1f0: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20  (pBt);.      rc 
e200: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78  = sqlite3PagerEx
e210: 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69  clusiveLock(sqli
e220: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
e230: 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t));.      sqlit
e240: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
e250: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
e260: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e270: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
e280: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  c;.  }..  /* If 
e290: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72  there are any wr
e2a0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite-transactions
e2b0: 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20   at all, invoke 
e2c0: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
e2d0: 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f  */.  if( needXco
e2e0: 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d  mmit && db->xCom
e2f0: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  mitCallback ){. 
e300: 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d     rc = db->xCom
e310: 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  mitCallback(db->
e320: 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20  pCommitArg);.   
e330: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
e340: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e350: 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
e360: 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  HOOK;.    }.  }.
e370: 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65  .  /* The simple
e380: 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20   case - no more 
e390: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
e3a0: 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e  e file (not coun
e3b0: 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45  ting the.  ** TE
e3c0: 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73  MP database) has
e3d0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61   a transaction a
e3e0: 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69  ctive.   There i
e3f0: 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68  s no need for th
e400: 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f  e.  ** master-jo
e410: 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  urnal..  **.  **
e420: 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
e430: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42  alue of sqlite3B
e440: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
e450: 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67  ) is a zero leng
e460: 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20  th.  ** string, 
e470: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69  it means the mai
e480: 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d  n database is :m
e490: 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70  emory: or a temp
e4a0: 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a   file.  In .  **
e4b0: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f   that case we do
e4c0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f   not support ato
e4d0: 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63  mic multi-file c
e4e0: 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74  ommits, so use t
e4f0: 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20  he .  ** simple 
e500: 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20  case then too.. 
e510: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c   */.  if( 0==sql
e520: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c  ite3Strlen30(sql
e530: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
e540: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
e550: 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61  pBt)).   || nTra
e560: 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66  ns<=1.  ){.    f
e570: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
e580: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
e590: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
e5a0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
e5b0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
e5c0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
e5d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e5e0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
e5f0: 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20  seOne(pBt, 0);. 
e600: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
e610: 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d    /* Do the comm
e620: 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64  it only if all d
e630: 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73  atabases success
e640: 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70  fully complete p
e650: 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20  hase 1. .    ** 
e660: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74  If one of the Bt
e670: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
e680: 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c  e() calls fails,
e690: 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
e6a0: 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72  an.    ** IO err
e6b0: 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e  or while deletin
e6c0: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
e6d0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
e6e0: 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a  It is unlikely,.
e6f0: 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64      ** but could
e700: 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73   happen. In this
e710: 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72   case abandon pr
e720: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
e730: 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20  urn the error.. 
e740: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
e750: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
e760: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
e770: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
e780: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
e790: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
e7a0: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
e7b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
e7c0: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
e7d0: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
e7e0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
e7f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e800: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
e810: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
e820: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
e830: 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d  e complex case -
e840: 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74   There is a mult
e850: 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61  i-file write-tra
e860: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
e870: 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69  .  ** This requi
e880: 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  res a master jou
e890: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73  rnal file to ens
e8a0: 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ure the transact
e8b0: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d  ion is.  ** comm
e8c0: 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a  itted atomicly..
e8d0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
e8e0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
e8f0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
e900: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
e910: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  db->pVfs;.    in
e920: 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  t needSync = 0;.
e930: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
e940: 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65  r = 0;   /* File
e950: 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61  -name for the ma
e960: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ster journal */.
e970: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
e980: 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  zMainFile = sqli
e990: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
e9a0: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
e9b0: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
e9c0: 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d  _file *pMaster =
e9d0: 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73   0;.    i64 offs
e9e0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  et = 0;.    int 
e9f0: 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  res;.    int ret
ea00: 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ryCount = 0;.   
ea10: 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a   int nMainFile;.
ea20: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61  .    /* Select a
ea30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ea40: 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  file name */.   
ea50: 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c   nMainFile = sql
ea60: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
ea70: 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61  inFile);.    zMa
ea80: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  ster = sqlite3MP
ea90: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a  rintf(db, "%s-mj
eaa0: 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61  XXXXXX9XXz", zMa
eab0: 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  inFile);.    if(
eac0: 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65   zMaster==0 ) re
ead0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
eae0: 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  M;.    do {.    
eaf0: 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20    u32 iRandom;. 
eb00: 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f       if( retryCo
eb10: 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unt ){.        i
eb20: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30  f( retryCount>10
eb30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
eb40: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
eb50: 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65  E_FULL, "MJ dele
eb60: 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  te: %s", zMaster
eb70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
eb80: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
eb90: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
eba0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
ebb0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
ebc0: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31  f( retryCount==1
ebd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
ebe0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
ebf0: 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69  _FULL, "MJ colli
ec00: 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  de: %s", zMaster
ec10: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ec20: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79     }.      retry
ec30: 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  Count++;.      s
ec40: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
ec50: 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d  s(sizeof(iRandom
ec60: 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20  ), &iRandom);.  
ec70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
ec80: 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65  intf(13, &zMaste
ec90: 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d  r[nMainFile], "-
eca0: 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20  mj%06X9%02X",.  
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52               (iR
ecd0: 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66  andom>>8)&0xffff
ece0: 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66  ff, iRandom&0xff
ecf0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
ed00: 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20  antipenultimate 
ed10: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
ed20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ed30: 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20  name must.      
ed40: 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f  ** be "9" to avo
ed50: 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f  id name collisio
ed60: 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b  ns when using 8+
ed70: 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a  3 filenames. */.
ed80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d        assert( zM
ed90: 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72  aster[sqlite3Str
eda0: 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33  len30(zMaster)-3
edb0: 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20  ]=='9' );.      
edc0: 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
edd0: 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d  x3(zMainFile, zM
ede0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63  aster);.      rc
edf0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
ee00: 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
ee10: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
ee20: 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
ee30: 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
ee40: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20  QLITE_OK && res 
ee50: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
ee60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ee70: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
ee80: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  ster journal. */
ee90: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
eea0: 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28  te3OsOpenMalloc(
eeb0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26  pVfs, zMaster, &
eec0: 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20  pMaster, .      
eed0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
eee0: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
eef0: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
ef00: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
ef10: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51  PEN_EXCLUSIVE|SQ
ef20: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
ef30: 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20  _JOURNAL, 0.    
ef40: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
ef50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ef60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ef70: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
ef80: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
ef90: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20  rn rc;.    }. . 
efa0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
efb0: 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74  name of each dat
efc0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
efd0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
efe0: 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
eff0: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
f000: 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72   file. If an err
f010: 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  or occurs at thi
f020: 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20  s point close.  
f030: 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20    ** and delete 
f040: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f050: 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65  al file. All the
f060: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
f070: 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a  nal files.    **
f080: 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c   still have 'nul
f090: 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72  l' as the master
f0a0: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
f0b0: 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72  , so they will r
f0c0: 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20  oll.    ** back 
f0d0: 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66  independently if
f0e0: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
f0f0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
f100: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
f110: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
f120: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
f130: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
f140: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
f150: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
f160: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
f170: 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73  const *zFile = s
f180: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f  qlite3BtreeGetJo
f190: 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a  urnalname(pBt);.
f1a0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
f1b0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
f1c0: 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
f1d0: 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20  Ignore TEMP and 
f1e0: 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73  :memory: databas
f1f0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  es */.        }.
f200: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f210: 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20  zFile[0]!=0 );. 
f220: 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64         if( !need
f230: 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33  Sync && !sqlite3
f240: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
f250: 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  d(pBt) ){.      
f260: 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
f270: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f280: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f290: 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c  OsWrite(pMaster,
f2a0: 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53   zFile, sqlite3S
f2b0: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
f2c0: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
f2d0: 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c     offset += sql
f2e0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
f2f0: 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  le)+1;.        i
f300: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f310: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
f320: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
f330: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
f340: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
f350: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
f360: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
f370: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
f380: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
f390: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
f3a0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
f3b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
f3c0: 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74  /* Sync the mast
f3d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
f3e0: 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
f3f0: 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a  QUENTIAL device.
f400: 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
f410: 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72  et this is not r
f420: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
f430: 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
f440: 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71   .     && 0==(sq
f450: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
f460: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
f470: 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
f480: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20  AP_SEQUENTIAL). 
f490: 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
f4a0: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
f4b0: 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53  sSync(pMaster, S
f4c0: 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
f4d0: 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  L)).    ){.     
f4e0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
f4f0: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
f500: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
f510: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
f520: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
f530: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
f540: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
f550: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
f560: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c  .    /* Sync all
f570: 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e   the db files in
f580: 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72  volved in the tr
f590: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
f5a0: 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ame call.    ** 
f5b0: 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20  sets the master 
f5c0: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
f5d0: 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  in each individu
f5e0: 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  al journal. If. 
f5f0: 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f     ** an error o
f600: 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e  ccurs here, do n
f610: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
f620: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f630: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
f640: 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63   If the error oc
f650: 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
f660: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20  first call to.  
f670: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
f680: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
f690: 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ), then there is
f6a0: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
f6b0: 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  he.    ** master
f6c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
f6d0: 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20  ll be orphaned. 
f6e0: 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  But we cannot de
f6f0: 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20  lete it,.    ** 
f700: 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
f710: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
f720: 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e  name was written
f730: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
f740: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65  l.    ** file be
f750: 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
f760: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a   occurred..    *
f770: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
f780: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
f790: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
f7a0: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
f7b0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
f7c0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
f7d0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
f7e0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
f7f0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
f800: 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  t, zMaster);.   
f810: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
f820: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
f830: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
f840: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
f850: 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69  TE_BUSY );.    i
f860: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f870: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f880: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
f890: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
f8a0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
f8b0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
f8c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
f8d0: 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
f8e0: 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
f8f0: 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
f900: 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
f910: 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
f920: 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
f930: 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
f940: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
f950: 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
f960: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
f970: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
f980: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
f990: 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
f9a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
f9b0: 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
f9c0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
f9d0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
f9e0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
f9f0: 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
fa00: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
fa10: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
fa20: 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
fa30: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
fa40: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
fa50: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
fa60: 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
fa70: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
fa80: 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
fa90: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
faa0: 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
fab0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
fac0: 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
fad0: 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
fae0: 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
faf0: 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
fb00: 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
fb10: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
fb20: 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
fb30: 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
fb40: 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
fb50: 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
fb60: 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
fb70: 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
fb80: 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
fb90: 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
fba0: 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
fbb0: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
fbc0: 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
fbd0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
fbe0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
fbf0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
fc00: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
fc10: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
fc20: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
fc30: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
fc40: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
fc50: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
fc60: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
fc70: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
fc80: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
fc90: 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
fca0: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
fcb0: 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s();..    sqlite
fcc0: 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
fcd0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
fce0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
fcf0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
fd00: 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
fd10: 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63   sqlite3.nVdbeAc
fd20: 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61  tive count varia
fd30: 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74  ble.** matches t
fd40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  he number of vdb
fd50: 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  e's in the list 
fd60: 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68  sqlite3.pVdbe th
fd70: 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  at are.** curren
fd80: 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61  tly active. An a
fd90: 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
fda0: 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73  f the two counts
fdb0: 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
fdc0: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74  * This is an int
fdd0: 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b  ernal self-check
fde0: 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f   only - it is no
fdf0: 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70  t an essential p
fe00: 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65  rocessing.** ste
fe10: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
fe20: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42   a no-op if NDEB
fe30: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  UG is defined..*
fe40: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
fe50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
fe60: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
fe70: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
fe80: 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63  Vdbe *p;.  int c
fe90: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57  nt = 0;.  int nW
fea0: 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rite = 0;.  int 
feb0: 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d  nRead = 0;.  p =
fec0: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
fed0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
fee0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
fef0: 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d  _MAGIC_RUN && p-
ff00: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  >pc>=0 ){.      
ff10: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
ff20: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
ff30: 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20  ) nWrite++;.    
ff40: 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64    if( p->bIsRead
ff50: 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20  er ) nRead++;.  
ff60: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
ff70: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Next;.  }.  asse
ff80: 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64  rt( cnt==db->nVd
ff90: 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73  beActive );.  as
ffa0: 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62  sert( nWrite==db
ffb0: 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a  ->nVdbeWrite );.
ffc0: 20 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d    assert( nRead=
ffd0: 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29  =db->nVdbeRead )
ffe0: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
fff0: 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
10000 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
10010 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62  /*.** If the Vdb
10020 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
10030 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f  first argument o
10040 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e  pened a statemen
10050 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  t-transaction,.*
10060 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20  * close it now. 
10070 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73  Argument eOp mus
10080 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45  t be either SAVE
10090 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f  POINT_ROLLBACK o
100a0 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  r.** SAVEPOINT_R
100b0 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73  ELEASE. If it is
100c0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
100d0 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74  ACK, then the st
100e0 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
100f0 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
10100 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73   back. If eOp is
10110 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
10120 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  SE, then the .**
10130 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
10140 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
10150 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ted..**.** If an
10160 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
10170 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
10180 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
10190 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
101a0 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49  * Otherwise SQLI
101b0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
101c0 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
101d0 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  atement(Vdbe *p,
101e0 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c   int eOp){.  sql
101f0 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d  ite3 *const db =
10200 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
10210 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
10220 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65   /* If p->iState
10230 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  ment is greater 
10240 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
10250 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64  this Vdbe opened
10260 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65   a .  ** stateme
10270 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  nt transaction t
10280 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  hat should be cl
10290 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f  osed here. The o
102a0 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  nly exception.  
102b0 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f  ** is that an IO
102c0 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20   error may have 
102d0 6f 63 63 75 72 72 65 64 2c 20 63 61 75 73 69 6e  occurred, causin
102e0 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72  g an emergency r
102f0 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e  ollback..  ** In
10300 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e   this case (db->
10310 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20  nStatement==0), 
10320 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74  and there is not
10330 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f  hing to do..  */
10340 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74  .  if( db->nStat
10350 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61  ement && p->iSta
10360 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e  tement ){.    in
10370 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  t i;.    const i
10380 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20  nt iSavepoint = 
10390 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b  p->iStatement-1;
103a0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f  ..    assert( eO
103b0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
103c0 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41  LBACK || eOp==SA
103d0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29  VEPOINT_RELEASE)
103e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
103f0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ->nStatement>0 )
10400 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
10410 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62  >iStatement==(db
10420 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d  ->nStatement+db-
10430 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a  >nSavepoint) );.
10440 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10450 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
10460 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
10470 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
10480 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
10490 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
104a0 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
104b0 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
104c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
104d0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
104e0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
104f0 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
10500 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
10510 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
10520 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10530 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c      if( rc2==SQL
10540 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10550 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
10560 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
10570 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
10580 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
10590 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
105a0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
105b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
105c0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
105d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
105e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  }.    }.    db->
105f0 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20  nStatement--;.  
10600 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
10610 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  = 0;..    if( rc
10620 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10630 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
10640 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10650 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
10660 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
10670 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
10680 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
10690 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
106a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
106b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
106c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
106d0 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
106e0 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  db, SAVEPOINT_RE
106f0 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
10700 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
10710 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
10720 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
10730 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  action is being 
10740 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73  rolled back, als
10750 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20  o restore the . 
10760 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68     ** database h
10770 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20  andles deferred 
10780 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74  constraint count
10790 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  er to the value 
107a0 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20  it had when .   
107b0 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
107c0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
107d0 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20  s opened.  */.  
107e0 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
107f0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
10800 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  .      db->nDefe
10810 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53  rredCons = p->nS
10820 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20  tmtDefCons;.    
10830 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
10840 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  mmCons = p->nStm
10850 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20  tDefImmCons;.   
10860 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10870 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
10880 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
10890 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  lled when a tran
108a0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62  saction opened b
108b0 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  y the database .
108c0 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69  ** handle associ
108d0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
108e0 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
108f0 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20  gument is about 
10900 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74  to be .** commit
10910 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72  ted. If there ar
10920 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65  e outstanding de
10930 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
10940 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  ey constraint.**
10950 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74   violations, ret
10960 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
10970 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
10980 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
10990 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
109a0 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74  anding FK violat
109b0 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75  ions and this fu
109c0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
109d0 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  ** SQLITE_ERROR,
109e0 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
109f0 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c  of the VM to SQL
10a00 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
10a10 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64  OREIGNKEY.** and
10a20 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20   write an error 
10a30 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54  message to it. T
10a40 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
10a50 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e  E_ERROR..*/.#ifn
10a60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10a70 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20  FOREIGN_KEY.int 
10a80 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
10a90 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Fk(Vdbe *p, int 
10aa0 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c  deferred){.  sql
10ab0 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
10ac0 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65  ;.  if( (deferre
10ad0 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72  d && (db->nDefer
10ae0 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66  redCons+db->nDef
10af0 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29  erredImmCons)>0)
10b00 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72   .   || (!deferr
10b10 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73  ed && p->nFkCons
10b20 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a  traint>0) .  ){.
10b30 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
10b40 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
10b50 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d  REIGNKEY;.    p-
10b60 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
10b70 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c  E_Abort;.    sql
10b80 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
10b90 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
10ba0 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
10bb0 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b  traint failed");
10bc0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10bd0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
10be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10bf0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
10c00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10c10 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
10c20 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
10c30 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
10c40 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
10c50 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
10c60 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
10c70 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
10c80 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
10c90 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
10ca0 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
10cb0 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
10cc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
10cd0 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
10ce0 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
10cf0 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
10d00 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
10d10 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
10d20 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49  E_MAGIC_HALT.  I
10d30 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f  t is harmless to
10d40 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e  .** call this on
10d50 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e   a VM that is in
10d60 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49   the SQLITE_MAGI
10d70 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a  C_HALT state..**
10d80 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
10d90 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
10da0 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
10db0 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
10dc0 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
10dd0 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
10de0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
10df0 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
10e00 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
10e10 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
10e20 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
10e30 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
10e40 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
10e50 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
10e60 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  t(Vdbe *p){.  in
10e70 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10e90 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   Used to store t
10ea0 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20  ransient return 
10eb0 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  codes */.  sqlit
10ec0 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
10ed0 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
10ee0 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
10ef0 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
10f00 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
10f10 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
10f20 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
10f30 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
10f40 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
10f50 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
10f60 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
10f70 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
10f80 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
10f90 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
10fa0 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20  ollowing errors 
10fb0 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  occur:.  **.  **
10fc0 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45       SQLITE_NOME
10fd0 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  M.  **     SQLIT
10fe0 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20  E_IOERR.  **    
10ff0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a   SQLITE_FULL.  *
11000 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54  *     SQLITE_INT
11010 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  ERRUPT.  **.  **
11020 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e   Then the intern
11030 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68  al cache might h
11040 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e  ave been left in
11050 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
11060 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65  .  ** state.  We
11070 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
11080 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
11090 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
110a0 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e  there is.  ** on
110b0 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  e, or the comple
110c0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
110d0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
110e0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
110f0 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28  ion..  */..  if(
11100 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
11110 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
11120 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
11130 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
11140 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73 65  OnceFlag ) memse
11150 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20  t(p->aOnceFlag, 
11160 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29  0, p->nOnceFlag)
11170 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  ;.  closeAllCurs
11180 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ors(p);.  if( p-
11190 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
111a0 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65  IC_RUN ){.    re
111b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
111c0 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76    }.  checkActiv
111d0 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
111e0 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
111f0 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
11200 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
11210 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72  never started or
11220 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c   if the.  ** SQL
11230 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20   statement does 
11240 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74  not read or writ
11250 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  e a database fil
11260 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  e.  */.  if( p->
11270 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52  pc>=0 && p->bIsR
11280 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  eader ){.    int
11290 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61   mrc;   /* Prima
112a0 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  ry error code fr
112b0 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20  om p->rc */.    
112c0 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  int eStatementOp
112d0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73   = 0;.    int is
112e0 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
112f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
11300 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70  to true if a 'sp
11310 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a  ecial' error */.
11320 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c  .    /* Lock all
11330 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20   btrees used by 
11340 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
11350 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11360 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f  Enter(p);..    /
11370 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20  * Check for one 
11380 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
11390 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63  rrors */.    mrc
113a0 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b   = p->rc & 0xff;
113b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
113c0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
113d0 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f 2a 20  _BLOCKED );  /* 
113e0 54 68 69 73 20 65 72 72 6f 72 20 6e 6f 20 6c 6f  This error no lo
113f0 6e 67 65 72 20 65 78 69 73 74 73 20 2a 2f 0a 20  nger exists */. 
11400 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f     isSpecialErro
11410 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f  r = mrc==SQLITE_
11420 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51  NOMEM || mrc==SQ
11430 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20  LITE_IOERR.     
11440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11450 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
11460 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d  NTERRUPT || mrc=
11470 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20  =SQLITE_FULL;.  
11480 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45    if( isSpecialE
11490 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rror ){.      /*
114a0 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61   If the query wa
114b0 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20  s read-only and 
114c0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
114d0 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  s SQLITE_INTERRU
114e0 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f  PT, .      ** no
114f0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63   rollback is nec
11500 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73  essary. Otherwis
11510 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73 61  e, at least a sa
11520 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a  vepoint .      *
11530 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  * transaction mu
11540 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  st be rolled bac
11550 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  k to restore the
11560 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a   database to a .
11570 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74        ** consist
11580 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20  ent state..     
11590 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65   **.      ** Eve
115a0 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  n if the stateme
115b0 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c  nt is read-only,
115c0 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
115d0 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20   to perform.    
115e0 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74    ** a statement
115f0 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   or transaction 
11600 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69  rollback operati
11610 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72  on. If the error
11620 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72   .      ** occur
11630 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  red while writin
11640 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
11650 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72  , sub-journal or
11660 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
11670 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74 20  ** file as part 
11680 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  of an effort to 
11690 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73 70  free up cache sp
116a0 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f  ace (see functio
116b0 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72  n.      ** pager
116c0 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67 65  Stress() in page
116d0 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61  r.c), the rollba
116e0 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20 74  ck is required t
116f0 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20  o restore .     
11700 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f   ** the pager to
11710 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74   a consistent st
11720 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ate..      */.  
11730 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
11740 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c  Only || mrc!=SQL
11750 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b  ITE_INTERRUPT ){
11760 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72  .        if( (mr
11770 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11780 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
11790 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53  ULL) && p->usesS
117a0 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  tmtJournal ){.  
117b0 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
117c0 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
117d0 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
117e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
117f0 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f      /* We are fo
11800 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63  rced to roll bac
11810 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61  k the active tra
11820 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65  nsaction. Before
11830 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20   doing.         
11840 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e   ** so, abort an
11850 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  y other statemen
11860 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63  ts this handle c
11870 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74  urrently has act
11880 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ive..          *
11890 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
118a0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
118b0 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
118c0 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
118d0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
118e0 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
118f0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  .          db->a
11900 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
11910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11920 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
11930 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61  heck for immedia
11940 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76  te foreign key v
11950 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  iolations. */.  
11960 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
11970 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11980 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
11990 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Fk(p, 0);.    }.
119a0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
119b0 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
119c0 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
119d0 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
119e0 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20  tive writer .   
119f0 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20   ** VM, then we 
11a00 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
11a10 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
11a20 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
11a30 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
11a40 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
11a50 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
11a60 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
11a70 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
11a80 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
11a90 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
11aa0 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rred. .    */.  
11ab0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74    if( !sqlite3Vt
11ac0 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20  abInSync(db) .  
11ad0 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f     && db->autoCo
11ae0 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62  mmit .     && db
11af0 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70  ->nVdbeWrite==(p
11b00 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a  ->readOnly==0) .
11b10 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
11b20 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
11b30 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
11b40 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
11b50 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
11b60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
11b70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
11b80 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20  ckFk(p, 1);.    
11b90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11ba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11bb0 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e     if( NEVER(p->
11bc0 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
11bd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11be0 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
11bf0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11c00 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
11c10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11c20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11c30 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
11c40 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20  IGNKEY;.        
11c50 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20  }else{ .        
11c60 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f    /* The auto-co
11c70 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75  mmit flag is tru
11c80 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  e, the vdbe prog
11c90 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66  ram was successf
11ca0 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ul .          **
11cb0 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46   or hit an 'OR F
11cc0 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20  AIL' constraint 
11cd0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
11ce0 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
11cf0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b  n.          ** k
11d00 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ey constraints t
11d10 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72  o hold up the tr
11d20 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
11d30 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a  means a commit .
11d40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
11d50 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
11d60 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
11d70 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20  Commit(db, p);. 
11d80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11d90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11da0 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f  BUSY && p->readO
11db0 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nly ){.         
11dc0 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
11dd0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
11de0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
11df0 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  SY;.        }els
11e00 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
11e10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
11e20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
11e30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
11e40 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
11e50 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
11e60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11e70 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
11e80 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
11e90 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
11ea0 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  dImmCons = 0;.  
11eb0 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
11ec0 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66  s &= ~SQLITE_Def
11ed0 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20  erFKs;.         
11ee0 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
11ef0 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
11f00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
11f10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11f20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
11f30 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
11f40 4f 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OK);.      }.   
11f50 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
11f60 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
11f70 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
11f80 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  p==0 ){.      if
11f90 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
11fa0 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
11fb0 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
11fc0 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
11fd0 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
11fe0 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20  T_RELEASE;.     
11ff0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
12000 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
12010 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ort ){.        e
12020 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
12030 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12040 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12050 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
12060 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
12070 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
12080 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
12090 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
120a0 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
120b0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
120c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
120d0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
120e0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73   eStatementOp is
120f0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
12100 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
12110 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
12120 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69  .    ** be commi
12130 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
12140 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  ack. Call sqlite
12150 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
12160 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  ent() to.    ** 
12170 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f  do so. If this o
12180 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73  peration returns
12190 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
121a0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
121b0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f  ment.    ** erro
121c0 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
121d0 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  _OK or SQLITE_CO
121e0 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70  NSTRAINT, then p
121f0 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a  romote the.    *
12200 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * current statem
12210 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ent error code..
12220 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
12230 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20  StatementOp ){. 
12240 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12250 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
12260 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e  ent(p, eStatemen
12270 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tOp);.      if( 
12280 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rc ){.        if
12290 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
122a0 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66  OK || (p->rc&0xf
122b0 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
122c0 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20  RAINT ){.       
122d0 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
122e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
122f0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
12300 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
12310 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
12320 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12330 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
12340 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
12350 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
12360 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12370 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
12380 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
12390 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
123a0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
123b0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
123c0 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
123d0 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
123e0 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d  TE and no statem
123f0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ent transaction.
12400 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
12410 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64  rolled back, upd
12420 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
12430 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e   connection chan
12440 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20  ge-counter. .   
12450 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63   */.    if( p->c
12460 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20  hangeCntOn ){.  
12470 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65      if( eStateme
12480 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f  ntOp!=SAVEPOINT_
12490 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
124a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
124b0 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
124c0 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  >nChange);.     
124d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
124e0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
124f0 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  anges(db, 0);.  
12500 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
12510 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
12520 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
12530 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
12540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
12550 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ave(p);.  }..  /
12560 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73  * We have succes
12570 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e  sfully halted an
12580 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e  d closed the VM.
12590 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61    Record this fa
125a0 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
125b0 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  pc>=0 ){.    db-
125c0 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a  >nVdbeActive--;.
125d0 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
125e0 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65  Only ) db->nVdbe
125f0 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28  Write--;.    if(
12600 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20   p->bIsReader ) 
12610 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b  db->nVdbeRead--;
12620 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
12630 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62  >nVdbeActive>=db
12640 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20  ->nVdbeRead );. 
12650 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
12660 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56  VdbeRead>=db->nV
12670 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20  dbeWrite );.    
12680 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
12690 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d  eWrite>=0 );.  }
126a0 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
126b0 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
126c0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
126d0 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70  Cnt(db);.  if( p
126e0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
126f0 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
12700 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
12710 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
12720 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
12730 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
12740 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
12750 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
12760 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
12770 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
12780 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
12790 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
127a0 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
127b0 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
127c0 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
127d0 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
127e0 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
127f0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
12800 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
12810 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
12820 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
12830 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
12840 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74  ive>0 || db->aut
12850 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
12860 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->nStatement==0 
12870 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
12880 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
12890 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
128a0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a  SQLITE_OK);.}...
128b0 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
128c0 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
128d0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
128e0 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
128f0 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
12900 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
12910 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
12920 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
12930 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
12940 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
12950 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
12960 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
12970 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12980 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72  * Copy the error
12990 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
129a0 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e  message belongin
129b0 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61  g to the VDBE pa
129c0 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
129d0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
129e0 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61   its database ha
129f0 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68  ndle (so that th
12a00 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72  ey will be .** r
12a10 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73  eturned by calls
12a20 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63   to sqlite3_errc
12a30 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ode() and sqlite
12a40 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a  3_errmsg())..**.
12a50 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12a60 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20   does not clear 
12a70 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63  the VDBE error c
12a80 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20  ode or message, 
12a90 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74  just.** copies t
12aa0 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62  hem to the datab
12ab0 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
12ac0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  nt sqlite3VdbeTr
12ad0 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65  ansferError(Vdbe
12ae0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
12af0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
12b00 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20  nt rc = p->rc;. 
12b10 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
12b20 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63  ){.    u8 malloc
12b30 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  Failed = db->mal
12b40 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 73  locFailed;.    s
12b50 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
12b60 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
12b70 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29  f( db->pErr==0 )
12b80 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69   db->pErr = sqli
12b90 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
12ba0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
12bb0 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
12bc0 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
12bd0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
12be0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
12bf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
12c00 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
12c10 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
12c20 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69  iled = mallocFai
12c30 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72  led;.    db->err
12c40 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c  Code = rc;.  }el
12c50 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
12c60 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b  rror(db, rc, 0);
12c70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
12c80 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
12c90 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47  TE_ENABLE_SQLLOG
12ca0 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c  ./*.** If an SQL
12cb0 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f  ITE_CONFIG_SQLLO
12cc0 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74  G hook is regist
12cd0 65 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20  ered and the VM 
12ce0 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a  has been run, .*
12cf0 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a  * invoke it..*/.
12d00 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
12d10 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62  InvokeSqllog(Vdb
12d20 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c  e *v){.  if( sql
12d30 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
12d40 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72  .xSqllog && v->r
12d50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
12d60 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63  v->zSql && v->pc
12d70 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  >=0 ){.    char 
12d80 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c  *zExpanded = sql
12d90 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53 71  ite3VdbeExpandSq
12da0 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20  l(v, v->zSql);. 
12db0 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62     assert( v->db
12dc0 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
12dd0 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e  ;.    if( zExpan
12de0 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ded ){.      sql
12df0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
12e00 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20  .xSqllog(.      
12e10 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
12e20 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41  lConfig.pSqllogA
12e30 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61  rg, v->db, zExpa
12e40 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b  nded, 1.      );
12e50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
12e60 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70  Free(v->db, zExp
12e70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20  anded);.    }.  
12e80 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
12e90 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  ne vdbeInvokeSql
12ea0 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  log(x).#endif../
12eb0 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20  *.** Clean up a 
12ec0 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
12ed0 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20  tion but do not 
12ee0 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20  delete the VDBE 
12ef0 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69  just yet..** Wri
12f00 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
12f10 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72  sages into *pzEr
12f20 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68  rMsg.  Return th
12f30 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a  e result code..*
12f40 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  *.** After this 
12f50 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20  routine is run, 
12f60 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20  the VDBE should 
12f70 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65  be ready to be e
12f80 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e  xecuted.** again
12f90 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20  ..**.** To look 
12fa0 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61  at it another wa
12fb0 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
12fc0 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65  resets the state
12fd0 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75   of the.** virtu
12fe0 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20  al machine from 
12ff0 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f  VDBE_MAGIC_RUN o
13000 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  r VDBE_MAGIC_HAL
13010 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42  T back to.** VDB
13020 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f  E_MAGIC_INIT..*/
13030 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
13040 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a  Reset(Vdbe *p){.
13050 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
13060 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20   db = p->db;..  
13070 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64  /* If the VM did
13080 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70   not run to comp
13090 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20  letion or if it 
130a0 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20  encountered an. 
130b0 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20   ** error, then 
130c0 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76  it might not hav
130d0 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72  e been halted pr
130e0 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74  operly.  So halt
130f0 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20  .  ** it now..  
13100 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
13110 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  Halt(p);..  /* I
13120 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  f the VDBE has b
13130 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69  e run even parti
13140 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73  ally, then trans
13150 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f  fer the error co
13160 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f  de.  ** and erro
13170 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74  r message from t
13180 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65  he VDBE into the
13190 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
131a0 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20  tructure.  But. 
131b0 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20   ** if the VDBE 
131c0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65  has just been se
131d0 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73  t to run but has
131e0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78   not actually ex
131f0 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20  ecuted any.  ** 
13200 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74  instructions yet
13210 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e  , leave the main
13220 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
13230 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68  information unch
13240 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  anged..  */.  if
13250 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
13260 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c    vdbeInvokeSqll
13270 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  og(p);.    sqlit
13280 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72  e3VdbeTransferEr
13290 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  ror(p);.    sqli
132a0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
132b0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
132c0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
132d0 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c     if( p->runOnl
132e0 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72  yOnce ) p->expir
132f0 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ed = 1;.  }else 
13300 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e  if( p->rc && p->
13310 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f  expired ){.    /
13320 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c  * The expired fl
13330 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68  ag was set on th
13340 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68  e VDBE before th
13350 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20  e first call.   
13360 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73   ** to sqlite3_s
13370 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69  tep(). For consi
13380 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71  stency (since sq
13390 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73  lite3_step() was
133a0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c  .    ** called),
133b0 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
133c0 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20  e error in this 
133d0 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20  case as well..  
133e0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
133f0 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c  Error(db, p->rc,
13400 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25   p->zErrMsg ? "%
13410 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d  s" : 0, p->zErrM
13420 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
13430 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
13440 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
13450 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
13460 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c  .  /* Reclaim al
13470 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
13480 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20   the VDBE.  */. 
13490 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20   Cleanup(p);..  
134a0 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
134b0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
134c0 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
134d0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44  ..  */.#ifdef VD
134e0 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
134f0 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66     FILE *out = f
13500 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69  open("vdbe_profi
13510 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20  le.out", "a");. 
13520 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20     if( out ){.  
13530 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
13540 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
13550 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f  --- ");.      fo
13560 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
13570 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
13580 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32  printf(out, "%02
13590 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70  x", p->aOp[i].op
135a0 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  code);.      }. 
135b0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
135c0 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69  , "\n");.      i
135d0 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20  f( p->zSql ){.  
135e0 20 20 20 20 20 20 63 68 61 72 20 63 2c 20 70 63        char c, pc
135f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70   = 0;.        fp
13600 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22  rintf(out, "-- "
13610 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
13620 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c  =0; (c = p->zSql
13630 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  [i])!=0; i++){. 
13640 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d           if( pc=
13650 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28  ='\n' ) fprintf(
13660 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20  out, "-- ");.   
13670 20 20 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f         putc(c, o
13680 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ut);.          p
13690 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d  c = c;.        }
136a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 21  .        if( pc!
136b0 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28  ='\n' ) fprintf(
136c0 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
136d0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
136e0 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
136f0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
13700 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20  zHdr[100];.     
13710 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
13720 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29  ntf(sizeof(zHdr)
13730 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32  , zHdr, "%6u %12
13740 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20  llu %8llu ",.   
13750 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
13760 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  ].cnt,.         
13770 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
13780 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  es,.           p
13790 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f  ->aOp[i].cnt>0 ?
137a0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
137b0 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20  s/p->aOp[i].cnt 
137c0 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  : 0.        );. 
137d0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
137e0 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b  ut, "%s", zHdr);
137f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13800 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c  VdbePrintOp(out,
13810 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
13820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
13830 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
13840 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  }.  }.#endif.  p
13850 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d  ->iCurrentTime =
13860 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   0;.  p->magic =
13870 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
13880 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
13890 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
138a0 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
138b0 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
138c0 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
138d0 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
138e0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
138f0 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
13900 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
13910 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
13920 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
13930 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
13940 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
13950 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
13960 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13970 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
13980 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
13990 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
139a0 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
139b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
139c0 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  beReset(p);.    
139d0 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
139e0 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
139f0 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  c );.  }.  sqlit
13a00 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b  e3VdbeDelete(p);
13a10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13a20 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  ./*.** If parame
13a30 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20  ter iOp is less 
13a40 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
13a50 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72  invoke the destr
13a60 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c  uctor for.** all
13a70 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20   auxiliary data 
13a80 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74  pointers current
13a90 6c 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65  ly cached by the
13aa0 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a   VM passed as.**
13ab0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
13ac0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ent..**.** Or, i
13ad0 66 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72  f iOp is greater
13ae0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
13af0 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
13b00 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a   destructor is.*
13b10 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66  * only invoked f
13b20 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61  or those auxilia
13b30 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73  ry data pointers
13b40 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
13b50 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  user .** functio
13b60 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65  n invoked by the
13b70 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63   OP_Function opc
13b80 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69  ode at instructi
13b90 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d  on iOp of .** VM
13ba0 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79   pVdbe, and only
13bb0 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   then if:.**.** 
13bc0 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61     * the associa
13bd0 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  ted function par
13be0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32  ameter is the 32
13bf0 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75  nd or later (cou
13c00 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72  nting.**      fr
13c10 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
13c20 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ), or.**.**    *
13c30 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
13c40 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65  ng bit in argume
13c50 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  nt mask is clear
13c60 20 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73   (where the firs
13c70 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69  t.**      functi
13c80 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72  on parameter cor
13c90 72 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30  rsponds to bit 0
13ca0 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20   etc.)..*/.void 
13cb0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
13cc0 65 41 75 78 44 61 74 61 28 56 64 62 65 20 2a 70  eAuxData(Vdbe *p
13cd0 56 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69  Vdbe, int iOp, i
13ce0 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44  nt mask){.  AuxD
13cf0 61 74 61 20 2a 2a 70 70 20 3d 20 26 70 56 64 62  ata **pp = &pVdb
13d00 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 77  e->pAuxData;.  w
13d10 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20  hile( *pp ){.   
13d20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d   AuxData *pAux =
13d30 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69   *pp;.    if( (i
13d40 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70  Op<0).     || (p
13d50 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26  Aux->iOp==iOp &&
13d60 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31 20   (pAux->iArg>31 
13d70 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b  || !(mask & MASK
13d80 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72 67  BIT32(pAux->iArg
13d90 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  )))).    ){.    
13da0 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75 78    testcase( pAux
13db0 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20  ->iArg==31 );.  
13dc0 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44      if( pAux->xD
13dd0 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
13de0 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70   pAux->xDelete(p
13df0 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Aux->pAux);.    
13e00 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20    }.      *pp = 
13e10 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pAux->pNext;.   
13e20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13e30 28 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75 78  (pVdbe->db, pAux
13e40 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13e50 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70      pp= &pAux->p
13e60 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
13e70 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
13e80 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
13e90 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
13ea0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
13eb0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
13ec0 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f  .** except for o
13ed0 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68  bject itself, wh
13ee0 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64  ich is preserved
13ef0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
13f00 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
13f10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
13f20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
13f30 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20  te() is that.** 
13f40 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73  VdbeDelete() als
13f50 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64  o unlinks the Vd
13f60 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  be from the list
13f70 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74   of VMs associat
13f80 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64  ed with.** the d
13f90 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
13fa0 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65  on and frees the
13fb0 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a   object itself..
13fc0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
13fd0 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73  dbeClearObject(s
13fe0 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
13ff0 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72   *p){.  SubProgr
14000 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74  am *pSub, *pNext
14010 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
14020 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c  ert( p->db==0 ||
14030 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20   p->db==db );.  
14040 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
14050 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
14060 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
14070 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
14080 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
14090 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f  COLNAME_N);.  fo
140a0 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72  r(pSub=p->pProgr
140b0 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  am; pSub; pSub=p
140c0 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
140d0 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a   = pSub->pNext;.
140e0 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72      vdbeFreeOpAr
140f0 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f  ray(db, pSub->aO
14100 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20  p, pSub->nOp);. 
14110 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
14120 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a  (db, pSub);.  }.
14130 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72    for(i=p->nzVar
14140 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73  -1; i>=0; i--) s
14150 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14160 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20   p->azVar[i]);. 
14170 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
14180 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e  (db, p->aOp, p->
14190 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  nOp);.  sqlite3D
141a0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
141b0 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
141c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
141d0 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Sql);.  sqlite3D
141e0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72  bFree(db, p->pFr
141f0 65 65 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ee);.#if defined
14200 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
14210 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 73  REE_EXPLAIN).  s
14220 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14230 20 70 2d 3e 7a 45 78 70 6c 61 69 6e 29 3b 0a 20   p->zExplain);. 
14240 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
14250 62 2c 20 70 2d 3e 70 45 78 70 6c 61 69 6e 29 3b  b, p->pExplain);
14260 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
14270 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
14280 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
14290 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
142a0 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  e(Vdbe *p){.  sq
142b0 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
142c0 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
142d0 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
142e0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
142f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
14300 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
14310 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  .  sqlite3VdbeCl
14320 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29  earObject(db, p)
14330 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
14340 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
14350 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
14360 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
14370 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64   assert( db->pVd
14380 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d  be==p );.    db-
14390 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
143a0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
143b0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
143c0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
143d0 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70  ->pPrev;.  }.  p
143e0 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
143f0 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e  AGIC_DEAD;.  p->
14400 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  db = 0;.  sqlite
14410 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
14420 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
14430 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20  re the cursor p 
14440 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64  is ready to read
14450 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f   or write the ro
14460 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a  w to which it.**
14470 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69   was last positi
14480 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e  oned.  Return an
14490 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
144a0 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49  n OOM fault or I
144b0 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76  /O error.** prev
144c0 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73  ents us from pos
144d0 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72  itioning the cur
144e0 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65  sor to its corre
144f0 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a  ct position..**.
14500 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f  ** If a MoveTo o
14510 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64  peration is pend
14520 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ing on the given
14530 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f   cursor, then do
14540 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20   that.** MoveTo 
14550 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65  now.  If no move
14560 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65   is pending, che
14570 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
14580 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a   row has been.**
14590 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
145a0 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
145b0 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73  or and if it has
145c0 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61  , mark the row a
145d0 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  s.** a NULL row.
145e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
145f0 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
14600 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
14610 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20  correct row and 
14620 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20  that row has.** 
14630 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64  not been deleted
14640 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
14650 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  the cursor, then
14660 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
14670 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74   a no-op..*/.int
14680 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
14690 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72  orMoveto(VdbeCur
146a0 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  sor *p){.  if( p
146b0 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
146c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c   ){.    int res,
146d0 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
146e0 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65  TE_TEST.    exte
146f0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
14700 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e  earch_count;.#en
14710 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
14720 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  p->isTable );.  
14730 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
14740 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
14750 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  d(p->pCursor, 0,
14760 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
14770 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
14780 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
14790 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52  rc;.    p->lastR
147a0 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f  owid = p->moveto
147b0 54 61 72 67 65 74 3b 0a 20 20 20 20 69 66 28 20  Target;.    if( 
147c0 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20  res!=0 ) return 
147d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
147e0 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69  KPT;.    p->rowi
147f0 64 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69  dIsValid = 1;.#i
14800 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
14810 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61  .    sqlite3_sea
14820 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  rch_count++;.#en
14830 64 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72  dif.    p->defer
14840 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
14850 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75     p->cacheStatu
14860 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
14870 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
14880 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 69  pCursor ){.    i
14890 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20  nt hasMoved;.   
148a0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
148b0 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
148c0 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c  oved(p->pCursor,
148d0 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20   &hasMoved);.   
148e0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
148f0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61 73   rc;.    if( has
14900 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20 70  Moved ){.      p
14910 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
14920 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20  CACHE_STALE;.   
14930 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20     p->nullRow = 
14940 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
14950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14960 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
14970 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
14980 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  s:.**.** sqlite3
14990 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29  VdbeSerialType()
149a0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
149b0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a  erialTypeLen().*
149c0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
149d0 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ialLen().** sqli
149e0 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
149f0 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
14a00 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a  eSerialGet().**.
14a10 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74  ** encapsulate t
14a20 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72  he code that ser
14a30 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66  ializes values f
14a40 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51  or storage in SQ
14a50 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64  Lite.** data and
14a60 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20   index records. 
14a70 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20  Each serialized 
14a80 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f  value consists o
14a90 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74  f a.** 'serial-t
14aa0 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20  ype' and a blob 
14ab0 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72  of data. The ser
14ac0 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38  ial type is an 8
14ad0 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a  -byte unsigned.*
14ae0 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65  * integer, store
14af0 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  d as a varint..*
14b00 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74  *.** In an SQLit
14b10 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20  e index record, 
14b20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
14b30 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74  is stored direct
14b40 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ly before.** the
14b50 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68   blob of data th
14b60 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  at it correspond
14b70 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65  s to. In a table
14b80 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72   record, all ser
14b90 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65  ial.** types are
14ba0 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
14bb0 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  tart of the reco
14bc0 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62  rd, and the blob
14bd0 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20  s of data at.** 
14be0 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74  the end. Hence t
14bf0 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
14c00 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20  llow the caller 
14c10 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a  to handle the.**
14c20 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64   serial-type and
14c30 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72   data blob separ
14c40 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ately..**.** The
14c50 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
14c60 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76   describes the v
14c70 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63  arious storage c
14c80 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a  lasses for data:
14c90 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20  .**.**   serial 
14ca0 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65  type        byte
14cb0 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74  s of data      t
14cc0 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ype.**   -------
14cd0 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
14ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
14cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
14d00 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  *      0        
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
14d20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a            NULL.*
14d30 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  *      1        
14d40 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
14d50 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
14d60 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
14d70 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
14d80 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
14d90 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
14da0 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20  er.**      3    
14db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14dc0 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69   3            si
14dd0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
14de0 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
14df0 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20             4    
14e00 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
14e10 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35  nteger.**      5
14e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e30 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
14e40 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
14e50 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20  .**      6      
14e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
14e70 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
14e80 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
14e90 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20     7            
14ea0 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
14eb0 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74        IEEE float
14ec0 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20  .**      8      
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
14ef0 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a  ger constant 0.*
14f00 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20  *      9        
14f10 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
14f20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
14f30 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20  r constant 1.** 
14f40 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20      10,11       
14f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f60 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
14f70 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a   for expansion.*
14f80 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65  *    N>=12 and e
14f90 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29  ven       (N-12)
14fa0 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a  /2        BLOB.*
14fb0 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f  *    N>=13 and o
14fc0 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29  dd        (N-13)
14fd0 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a  /2        text.*
14fe0 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39  *.** The 8 and 9
14ff0 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65   types were adde
15000 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65  d in 3.3.0, file
15010 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f   format 4.  Prio
15020 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
15030 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
15040 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73   understand thos
15050 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a  e serial types..
15060 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
15070 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65   the serial-type
15080 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
15090 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a  tored in pMem..*
150a0 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
150b0 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20  eSerialType(Mem 
150c0 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f  *pMem, int file_
150d0 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66  format){.  int f
150e0 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
150f0 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  gs;.  int n;..  
15100 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
15110 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
15120 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
15130 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
15140 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
15150 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
15160 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
15170 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
15180 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
15190 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30  (((i64)0x0000800
151a0 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
151b0 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
151c0 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
151d0 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
151e0 20 20 69 66 28 20 69 3c 28 2d 4d 41 58 5f 36 42    if( i<(-MAX_6B
151f0 59 54 45 29 20 29 20 72 65 74 75 72 6e 20 36 3b  YTE) ) return 6;
15200 0a 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f  .      /* Previo
15210 75 73 20 74 65 73 74 20 70 72 65 76 65 6e 74 73  us test prevents
15220 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32 33 33 37  :  u = -(-922337
15230 32 30 33 36 38 35 34 37 37 35 38 30 38 29 20 2a  2036854775808) *
15240 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d 69 3b 0a  /.      u = -i;.
15250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15260 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20   u = i;.    }.  
15270 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a    if( u<=127 ){.
15280 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 69        return ((i
15290 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66  &1)==i && file_f
152a0 6f 72 6d 61 74 3e 3d 34 29 20 3f 20 38 2b 28 75  ormat>=4) ? 8+(u
152b0 33 32 29 75 20 3a 20 31 3b 0a 20 20 20 20 7d 0a  32)u : 1;.    }.
152c0 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37      if( u<=32767
152d0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
152e0 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20   if( u<=8388607 
152f0 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20  ) return 3;.    
15300 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34  if( u<=214748364
15310 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20  7 ) return 4;.  
15320 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59    if( u<=MAX_6BY
15330 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20  TE ) return 5;. 
15340 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d     return 6;.  }
15350 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
15360 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Real ){.    ret
15370 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 7;.  }.  ass
15380 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d  ert( pMem->db->m
15390 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66  allocFailed || f
153a0 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45  lags&(MEM_Str|ME
153b0 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d  M_Blob) );.  n =
153c0 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20   pMem->n;.  if( 
153d0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
153e0 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65   ){.    n += pMe
153f0 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a  m->u.nZero;.  }.
15400 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29    assert( n>=0 )
15410 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32  ;.  return ((n*2
15420 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73  ) + 12 + ((flags
15430 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a  &MEM_Str)!=0));.
15440 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
15450 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
15460 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e  e data correspon
15470 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  ding to the supp
15480 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65  lied serial-type
15490 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
154a0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
154b0 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  n(u32 serial_typ
154c0 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e){.  if( serial
154d0 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
154e0 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
154f0 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65  type-12)/2;.  }e
15500 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
15510 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d  const u8 aSize[]
15520 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c   = { 0, 1, 2, 3,
15530 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20   4, 6, 8, 8, 0, 
15540 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72  0, 0, 0 };.    r
15550 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69  eturn aSize[seri
15560 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
15570 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
15580 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74   on an architect
15590 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65  ure with mixed-e
155a0 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a  ndian floating .
155b0 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41  ** points (ex: A
155c0 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74  RM7) then swap t
155d0 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73  he lower 4 bytes
155e0 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70   with the .** up
155f0 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65  per 4 bytes.  Re
15600 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
15610 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20  .**.** For most 
15620 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74  architectures, t
15630 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
15640 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20  **.** (later):  
15650 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
15660 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69  o me that the mi
15670 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c  xed-endian probl
15680 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73  em.** on ARM7 is
15690 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47   an issue with G
156a0 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65  CC, not with the
156b0 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20   ARM7 chip.  It 
156c0 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61  seems.** that ea
156d0 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  rly versions of 
156e0 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74  GCC stored the t
156f0 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34  wo words of a 64
15700 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e  -bit.** float in
15710 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72   the wrong order
15720 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f  .  And that erro
15730 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61  r has been propa
15740 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69  gated.** ever si
15750 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20  nce.  The blame 
15760 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
15770 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f  ly with GCC, tho
15780 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68  ugh..** GCC migh
15790 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79  t have just copy
157a0 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ing the problem 
157b0 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d  from a prior com
157c0 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61  piler..** I am a
157d0 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65  lso told that ne
157e0 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
157f0 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  GCC that follow 
15800 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41  a different.** A
15810 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20  BI get the byte 
15820 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a  order right..**.
15830 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73  ** Developers us
15840 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e  ing SQLite on an
15850 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d   ARM7 should com
15860 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65  pile and run the
15870 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ir.** applicatio
15880 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  n using -DSQLITE
15890 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73  _DEBUG=1 at leas
158a0 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45  t once.  With DE
158b0 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  BUG.** enabled, 
158c0 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c  some asserts bel
158d0 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74  ow will ensure t
158e0 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  hat the byte ord
158f0 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e  er of.** floatin
15900 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69  g point values i
15910 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a  s correct..**.**
15920 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46   (2007-08-30)  F
15930 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61  rank van Vugt ha
15940 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70  s studied this p
15950 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a  roblem closely.*
15960 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68  * and has send h
15970 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74  is findings to t
15980 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f  he SQLite develo
15990 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20  pers.  Frank.** 
159a0 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65  writes that some
159b0 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f   Linux kernels o
159c0 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ffer floating po
159d0 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20  int hardware.** 
159e0 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75  emulation that u
159f0 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20  ses only 32-bit 
15a00 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61  mantissas instea
15a10 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20  d of a full .** 
15a20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69  48-bits as requi
15a30 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20  red by the IEEE 
15a40 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73  standard.  (This
15a50 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49   is the.** CONFI
15a60 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70  G_FPE_FASTFPE op
15a70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20  tion.)  On such 
15a80 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e  systems, floatin
15a90 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20  g point.** byte 
15aa0 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73  swapping becomes
15ab0 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65   very complicate
15ac0 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f  d.  To avoid pro
15ad0 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65  blems,.** the ne
15ae0 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61  cessary byte swa
15af0 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64  pping is carried
15b00 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d   out using a 64-
15b10 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72  bit integer.** r
15b20 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d  ather than a 64-
15b30 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e  bit float.  Fran
15b40 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61  k assures us tha
15b50 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a  t the code here.
15b60 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d  ** works for him
15b70 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c  .  We, the devel
15b80 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77  opers, have no w
15b90 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e  ay to independen
15ba0 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68  tly.** verify th
15bb0 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65  is, but Frank se
15bc0 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74  ems to know what
15bd0 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61   he is talking a
15be0 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72  bout.** so we tr
15bf0 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64  ust him..*/.#ifd
15c00 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  ef SQLITE_MIXED_
15c10 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
15c20 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c  AT.static u64 fl
15c30 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b  oatSwap(u64 in){
15c40 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75  .  union {.    u
15c50 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b  64 r;.    u32 i[
15c60 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32  2];.  } u;.  u32
15c70 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b   t;..  u.r = in;
15c80 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20  .  t = u.i[0];. 
15c90 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d   u.i[0] = u.i[1]
15ca0 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a  ;.  u.i[1] = t;.
15cb0 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a    return u.r;.}.
15cc0 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
15cd0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
15ce0 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28    X = floatSwap(
15cf0 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
15d00 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
15d10 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66  nFloat(X).#endif
15d20 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
15d30 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74  e serialized dat
15d40 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76  a blob for the v
15d50 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
15d60 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66  Mem into .** buf
15d70 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
15d80 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
15d90 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75  has allocated su
15da0 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a  fficient space..
15db0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
15dc0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
15dd0 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75  itten..**.** nBu
15de0 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20  f is the amount 
15df0 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e  of space left in
15e00 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c   buf[].  The cal
15e10 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
15e20 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61  le.** for alloca
15e30 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63  ting enough spac
15e40 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f  e to buf[] to ho
15e50 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ld the entire fi
15e60 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a  eld, exclusive.*
15e70 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75  * of the pMem->u
15e80 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72  .nZero bytes for
15e90 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75   a MEM_Zero valu
15ea0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
15eb0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
15ec0 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69  tes actually wri
15ed0 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  tten into buf[].
15ee0 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
15ef0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
15f00 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
15f10 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
15f20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
15f30 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73   only.** if thos
15f40 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72  e bytes were zer
15f50 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f  oed in buf[]..*/
15f60 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62   .u32 sqlite3Vdb
15f70 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62  eSerialPut(u8 *b
15f80 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75  uf, Mem *pMem, u
15f90 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
15fa0 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f  .  u32 len;..  /
15fb0 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65  * Integer and Re
15fc0 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  al */.  if( seri
15fd0 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65  al_type<=7 && se
15fe0 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20  rial_type>0 ){. 
15ff0 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33     u64 v;.    u3
16000 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72  2 i;.    if( ser
16010 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
16020 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
16030 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70  eof(v)==sizeof(p
16040 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20  Mem->r) );.     
16050 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
16060 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  m->r, sizeof(v))
16070 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
16080 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
16090 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
160a0 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
160b0 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
160c0 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   i = sqlite3Vdbe
160d0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
160e0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
160f0 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20  while( i-- ){.  
16100 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 75 38      buf[i] = (u8
16110 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20  )(v&0xFF);.     
16120 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a   v >>= 8;.    }.
16130 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
16140 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67    }..  /* String
16150 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66   or blob */.  if
16160 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
16170 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
16180 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65   pMem->n + ((pMe
16190 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
161a0 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  ero)?pMem->u.nZe
161b0 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20  ro:0).          
161c0 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74     == (int)sqlit
161d0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
161e0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
161f0 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d   );.    len = pM
16200 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70  em->n;.    memcp
16210 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  y(buf, pMem->z, 
16220 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  len);.    return
16230 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
16240 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
16250 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
16260 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
16270 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65   Deserialize the
16280 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74   data blob point
16290 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20  ed to by buf as 
162a0 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69  serial type seri
162b0 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73  al_type.** and s
162c0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
162d0 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e  in pMem.  Return
162e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
162f0 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 75  ytes read..*/ .u
16300 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
16310 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
16320 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
16330 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
16340 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
16350 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
16360 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
16370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
16380 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
16390 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
163a0 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
163b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
163c0 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
163d0 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
163e0 0a 29 7b 0a 20 20 75 36 34 20 78 3b 0a 20 20 75  .){.  u64 x;.  u
163f0 33 32 20 79 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  32 y;.  int i;. 
16400 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
16410 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
16420 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   10:   /* Reserv
16430 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
16440 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31  e */.    case 11
16450 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
16460 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
16470 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20  /.    case 0: { 
16480 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   /* NULL */.    
16490 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
164a0 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
164b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
164c0 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d   case 1: { /* 1-
164d0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
164e0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
164f0 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65 64  m->u.i = (signed
16500 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20   char)buf[0];.  
16510 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
16520 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
16530 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
16540 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
16550 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
16560 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
16570 20 69 20 3d 20 32 35 36 2a 28 73 69 67 6e 65 64   i = 256*(signed
16580 20 63 68 61 72 29 62 75 66 5b 30 5d 20 7c 20 62   char)buf[0] | b
16590 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[1];.      pMe
165a0 6d 2d 3e 75 2e 69 20 3d 20 28 69 36 34 29 69 3b  m->u.i = (i64)i;
165b0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
165c0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
165d0 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
165e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20    }.    case 3: 
165f0 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e  { /* 3-byte sign
16600 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
16610 20 20 20 20 69 20 3d 20 36 35 35 33 36 2a 28 73      i = 65536*(s
16620 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
16630 5d 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20  ] | (buf[1]<<8) 
16640 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20  | buf[2];.      
16650 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 69 36 34  pMem->u.i = (i64
16660 29 69 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  )i;.      pMem->
16670 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
16680 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b  .      return 3;
16690 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
166a0 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73  4: { /* 4-byte s
166b0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
166c0 0a 20 20 20 20 20 20 79 20 3d 20 28 28 75 6e 73  .      y = ((uns
166d0 69 67 6e 65 64 29 62 75 66 5b 30 5d 3c 3c 32 34  igned)buf[0]<<24
166e0 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29  ) | (buf[1]<<16)
166f0 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c   | (buf[2]<<8) |
16700 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70   buf[3];.      p
16710 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 69 36 34 29  Mem->u.i = (i64)
16720 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20  *(int*)&y;.     
16730 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
16740 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
16750 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20  turn 4;.    }.  
16760 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
16770 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
16780 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 78 20  eger */.      x 
16790 3d 20 32 35 36 2a 28 73 69 67 6e 65 64 20 63 68  = 256*(signed ch
167a0 61 72 29 62 75 66 5b 30 5d 20 2b 20 62 75 66 5b  ar)buf[0] + buf[
167b0 31 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 28  1];.      y = ((
167c0 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 32 5d 3c  unsigned)buf[2]<
167d0 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c  <24) | (buf[3]<<
167e0 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38  16) | (buf[4]<<8
167f0 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20  ) | buf[5];.    
16800 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
16810 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  y;.      pMem->u
16820 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
16830 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
16840 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
16850 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20     return 6;.   
16860 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20   }.    case 6:  
16870 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
16880 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
16890 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45   case 7: { /* IE
168a0 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  EE floating poin
168b0 74 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  t */.#if !define
168c0 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65  d(NDEBUG) && !de
168d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
168e0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
168f0 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66  ).      /* Verif
16900 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
16910 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
16920 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
16930 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  e same.      ** 
16940 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
16950 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
16960 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
16970 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
16980 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61    ** defined tha
16990 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  t 64-bit floatin
169a0 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72  g point values r
169b0 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a  eally are mixed.
169c0 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e        ** endian.
169d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
169e0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34  static const u64
169f0 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66   t1 = ((u64)0x3f
16a00 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20  f00000)<<32;.   
16a10 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
16a20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b  double r1 = 1.0;
16a30 0a 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20  .      u64 t2 = 
16a40 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  t1;.      swapMi
16a50 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
16a60 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  2);.      assert
16a70 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69  ( sizeof(r1)==si
16a80 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63  zeof(t2) && memc
16a90 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a  mp(&r1, &t2, siz
16aa0 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23  eof(r1))==0 );.#
16ab0 65 6e 64 69 66 0a 20 20 20 20 20 20 78 20 3d 20  endif.      x = 
16ac0 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 30  ((unsigned)buf[0
16ad0 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d  ]<<24) | (buf[1]
16ae0 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c  <<16) | (buf[2]<
16af0 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20  <8) | buf[3];.  
16b00 20 20 20 20 79 20 3d 20 28 28 75 6e 73 69 67 6e      y = ((unsign
16b10 65 64 29 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c  ed)buf[4]<<24) |
16b20 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20   (buf[5]<<16) | 
16b30 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75  (buf[6]<<8) | bu
16b40 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[7];.      x = 
16b50 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
16b60 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
16b70 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20  pe==6 ){.       
16b80 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
16b90 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20  64*)&x;.        
16ba0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
16bb0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c  M_Int;.      }el
16bc0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
16bd0 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38  rt( sizeof(x)==8
16be0 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d   && sizeof(pMem-
16bf0 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20  >r)==8 );.      
16c00 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
16c10 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20  nFloat(x);.     
16c20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d     memcpy(&pMem-
16c30 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  >r, &x, sizeof(x
16c40 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  ));.        pMem
16c50 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  ->flags = sqlite
16c60 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20  3IsNaN(pMem->r) 
16c70 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d  ? MEM_Null : MEM
16c80 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  _Real;.      }. 
16c90 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20       return 8;. 
16ca0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
16cb0 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30      /* Integer 0
16cc0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20   */.    case 9: 
16cd0 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20  {  /* Integer 1 
16ce0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
16cf0 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  .i = serial_type
16d00 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  -8;.      pMem->
16d10 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
16d20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
16d30 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
16d40 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74  lt: {.      stat
16d50 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c  ic const u16 aFl
16d60 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f  ag[] = { MEM_Blo
16d70 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d  b|MEM_Ephem, MEM
16d80 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d  _Str|MEM_Ephem }
16d90 3b 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20  ;.      u32 len 
16da0 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
16db0 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d  2)/2;.      pMem
16dc0 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
16dd0 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
16de0 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d   = len;.      pM
16df0 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20  em->xDel = 0;.  
16e00 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
16e10 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74  = aFlag[serial_t
16e20 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65  ype&1];.      re
16e30 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a  turn len;.    }.
16e40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
16e50 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
16e60 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
16e70 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63   allocate suffic
16e80 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61  ient space for a
16e90 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  n UnpackedRecord
16ea0 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61  .** structure la
16eb0 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65  rge enough to be
16ec0 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74   used with sqlit
16ed0 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
16ee0 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66  ck() if.** the f
16ef0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
16f00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65   a pointer to Ke
16f10 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
16f20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20  pKeyInfo..**.** 
16f30 54 68 65 20 73 70 61 63 65 20 69 73 20 65 69 74  The space is eit
16f40 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  her allocated us
16f50 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  ing sqlite3DbMal
16f60 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d  locRaw() or from
16f70 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75   within.** the u
16f80 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20  naligned buffer 
16f90 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73  passed via the s
16fa0 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20  econd and third 
16fb0 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75  arguments (presu
16fc0 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73  mably.** stack s
16fd0 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f  pace). If the fo
16fe0 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72  rmer, then *ppFr
16ff0 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  ee is set to a p
17000 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75  ointer that shou
17010 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61  ld.** be eventua
17020 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 68 65  lly freed by the
17030 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71   caller using sq
17040 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f  lite3DbFree(). O
17050 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c  r, if the .** al
17060 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66  location comes f
17070 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73  rom the pSpace/s
17080 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a  zSpace buffer, *
17090 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f  ppFree is set to
170a0 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20   NULL.** before 
170b0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
170c0 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
170d0 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
170e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e   returned..*/.Un
170f0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71  packedRecord *sq
17100 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e  lite3VdbeAllocUn
17110 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20  packedRecord(.  
17120 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
17130 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
17140 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
17150 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  f the record */.
17160 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20    char *pSpace, 
17170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17180 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73    /* Unaligned s
17190 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a  pace available *
171a0 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c  /.  int szSpace,
171b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171c0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70      /* Size of p
171d0 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73  Space[] in bytes
171e0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46   */.  char **ppF
171f0 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
17200 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61        /* OUT: Ca
17210 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65  ller should free
17220 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f   this pointer */
17230 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  .){.  UnpackedRe
17240 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20  cord *p;        
17250 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65        /* Unpacke
17260 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75  d record to retu
17270 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66  rn */.  int nOff
17280 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17290 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
172a0 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e  ment pSpace by n
172b0 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20  Off to align it 
172c0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
172f0 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
17300 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a   for *p */..  /*
17310 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66   We want to shif
17320 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53  t the pointer pS
17330 70 61 63 65 20 75 70 20 73 75 63 68 20 74 68 61  pace up such tha
17340 74 20 69 74 20 69 73 20 38 2d 62 79 74 65 20 61  t it is 8-byte a
17350 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75  ligned..  ** Thu
17360 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61  s, we need to ca
17370 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c  lculate a value,
17380 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30   nOff, between 0
17390 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74   and 7, to shift
173a0 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49   .  ** it by.  I
173b0 66 20 70 53 70 61 63 65 20 69 73 20 61 6c 72 65  f pSpace is alre
173c0 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e  ady 8-byte align
173d0 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20  ed, nOff should 
173e0 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20  be zero..  */.  
173f0 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c  nOff = (8 - (SQL
17400 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
17410 53 70 61 63 65 29 20 26 20 37 29 29 20 26 20 37  Space) & 7)) & 7
17420 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  ;.  nByte = ROUN
17430 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
17440 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a  edRecord)) + siz
17450 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e  eof(Mem)*(pKeyIn
17460 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20  fo->nField+1);. 
17470 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61   if( nByte>szSpa
17480 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70  ce+nOff ){.    p
17490 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f   = (UnpackedReco
174a0 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  rd *)sqlite3DbMa
174b0 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f  llocRaw(pKeyInfo
174c0 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ->db, nByte);.  
174d0 20 20 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61    *ppFree = (cha
174e0 72 20 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21  r *)p;.    if( !
174f0 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
17500 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28  }else{.    p = (
17510 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29  UnpackedRecord*)
17520 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20  &pSpace[nOff];. 
17530 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a     *ppFree = 0;.
17540 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d    }..  p->aMem =
17550 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29   (Mem*)&((char*)
17560 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)[ROUND8(sizeof
17570 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
17580 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  )];.  assert( pK
17590 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
175a0 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b  er!=0 );.  p->pK
175b0 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
175c0 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
175d0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
175e0 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  d + 1;.  return 
175f0 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
17600 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20  n the nKey-byte 
17610 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65  encoding of a re
17620 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20  cord in pKey[], 
17630 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a  populate the .**
17640 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
17650 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61  structure indica
17660 74 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74  ted by the fourt
17670 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20  h argument with 
17680 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
17690 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72  of the decoded r
176a0 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20  ecord..*/ .void 
176b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
176c0 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e  dUnpack(.  KeyIn
176d0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
176e0 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
176f0 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72   about the recor
17700 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e  d format */.  in
17710 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
17720 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
17730 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  the binary recor
17740 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
17750 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a  d *pKey,      /*
17760 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   The binary reco
17770 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  rd */.  Unpacked
17780 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f  Record *p      /
17790 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20  * Populate this 
177a0 73 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65  structure before
177b0 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29   returning. */.)
177c0 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
177d0 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
177e0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
177f0 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69  char *)pKey;.  i
17800 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78  nt d; .  u32 idx
17810 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17820 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
17830 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20  et in aKey[] to 
17840 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
17850 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  16 u;           
17860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17870 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
17880 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
17890 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70   szHdr;.  Mem *p
178a0 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a  Mem = p->aMem;..
178b0 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20    p->default_rc 
178c0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45  = 0;.  assert( E
178d0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
178e0 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69  ENT(pMem) );.  i
178f0 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
17900 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
17910 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
17920 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
17930 78 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e  x<szHdr && u<p->
17940 6e 46 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65  nField && d<=nKe
17950 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  y ){.    u32 ser
17960 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69  ial_type;..    i
17970 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
17980 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65  2(&aKey[idx], se
17990 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
179a0 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79  pMem->enc = pKey
179b0 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70  Info->enc;.    p
179c0 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e  Mem->db = pKeyIn
179d0 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70  fo->db;.    /* p
179e0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20  Mem->flags = 0; 
179f0 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  // sqlite3VdbeSe
17a00 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73  rialGet() will s
17a10 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a  et this for us *
17a20 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c  /.    pMem->zMal
17a30 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  loc = 0;.    d +
17a40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
17a50 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
17a60 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
17a70 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
17a80 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20  .    u++;.  }.  
17a90 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49  assert( u<=pKeyI
17aa0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20  nfo->nField + 1 
17ab0 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  );.  p->nField =
17ac0 20 75 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   u;.}../*.** Thi
17ad0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
17ae0 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c  res the two tabl
17af0 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20  e rows or index 
17b00 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69  records.** speci
17b10 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20  fied by {nKey1, 
17b20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79  pKey1} and pPKey
17b30 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61  2.  It returns a
17b40 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a   negative, zero.
17b50 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ** or positive i
17b60 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69  nteger if key1 i
17b70 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
17b80 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65  al to or .** gre
17b90 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20  ater than key2. 
17ba0 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65   The {nKey1, pKe
17bb0 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20  y1} key must be 
17bc0 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65  a blob.** create
17bd0 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52  d by th OP_MakeR
17be0 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
17bf0 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70  the VDBE.  The p
17c00 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73  PKey2.** key mus
17c10 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65  t be a parsed ke
17c20 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e  y such as obtain
17c30 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
17c40 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72  e3VdbeParseRecor
17c50 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e  d..**.** Key1 an
17c60 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61  d Key2 do not ha
17c70 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ve to contain th
17c80 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
17c90 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65 20   fields..** The 
17ca0 6b 65 79 20 77 69 74 68 20 66 65 77 65 72 20 66  key with fewer f
17cb0 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c 79  ields is usually
17cc0 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20 74   compares less t
17cd0 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67  han the .** long
17ce0 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65 72  er key.  However
17cf0 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   if the UNPACKED
17d00 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20 69  _INCRKEY flags i
17d10 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65 74 0a  n pPKey2 is set.
17d20 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d 6f  ** and the commo
17d30 6e 20 70 72 65 66 69 78 65 73 20 61 72 65 20 65  n prefixes are e
17d40 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31 20  qual, then key1 
17d50 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65 79  is less than key
17d60 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65 20  2..** Or if the 
17d70 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f 50  UNPACKED_MATCH_P
17d80 52 45 46 49 58 20 66 6c 61 67 20 69 73 20 73 65  REFIX flag is se
17d90 74 20 61 6e 64 20 74 68 65 20 70 72 65 66 69 78  t and the prefix
17da0 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c  es are.** equal,
17db0 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20 61   then the keys a
17dc0 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  re considered to
17dd0 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a 2a   be equal and.**
17de0 20 74 68 65 20 70 61 72 74 73 20 62 65 79 6f 6e   the parts beyon
17df0 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  d the common pre
17e00 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  fix are ignored.
17e10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
17e20 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
17e30 50 72 65 76 28 0a 20 20 69 6e 74 20 6e 4b 65 79  Prev(.  int nKey
17e40 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
17e50 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
17e60 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
17e70 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
17e80 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
17e90 79 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31  y */.){.  u32 d1
17ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
17eb0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
17ec0 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
17ed0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
17ee0 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
17ef0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
17f00 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
17f10 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
17f20 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
17f30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17f40 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
17f50 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
17f60 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
17f70 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
17f80 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
17f90 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
17fa0 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b  har *)pKey1;.  K
17fb0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
17fc0 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
17fd0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65   pKeyInfo = pPKe
17fe0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
17ff0 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
18000 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31  nfo->enc;.  mem1
18010 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
18020 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c  db;.  /* mem1.fl
18030 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c  ags = 0;  // Wil
18040 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
18050 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53   by sqlite3VdbeS
18060 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20  erialGet() */.  
18070 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a  VVA_ONLY( mem1.z
18080 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
18090 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
180a0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
180b0 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  nts */..  /* Com
180c0 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c  pilers may compl
180d0 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e  ain that mem1.u.
180e0 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79  i is potentially
180f0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
18100 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e    ** We could in
18110 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20  itialize it, as 
18120 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73  shown here, to s
18130 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d  ilence those com
18140 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75  plaints..  ** Bu
18150 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e  t in fact, mem1.
18160 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  u.i will never a
18170 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ctually be used 
18180 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61  uninitialized, a
18190 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74  nd doing .  ** t
181a0 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69  he unnecessary i
181b0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61  nitialization ha
181c0 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e  s a measurable n
181d0 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61  egative performa
181e0 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c  nce.  ** impact,
181f0 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74   since this rout
18200 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69  ine is a very hi
18210 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20  gh runner.  And 
18220 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20  so, we choose.  
18230 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  ** to ignore the
18240 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
18250 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69  gs and leave thi
18260 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69  s variable unini
18270 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
18280 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20   /*  mem1.u.i = 
18290 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65  0;  // not neede
182a0 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e  d, here to silen
182b0 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  ce compiler warn
182c0 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31  ing */.  .  idx1
182d0 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
182e0 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
182f0 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
18300 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
18310 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66  ->nField+pKeyInf
18320 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65  o->nXField>=pPKe
18330 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f  y2->nField || CO
18340 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
18350 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
18360 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
18370 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
18380 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b  nfo->nField>0 );
18390 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c  .  assert( idx1<
183a0 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55  =szHdr1 || CORRU
183b0 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20  PT_DB );.  do{. 
183c0 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
183d0 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  pe1;..    /* Rea
183e0 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  d the serial typ
183f0 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  es for the next 
18400 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20  element in each 
18410 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31  key. */.    idx1
18420 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
18430 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72   aKey1+idx1, ser
18440 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20  ial_type1 );..  
18450 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
18460 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
18470 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61 69   key space remai
18480 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20  ning to avoid.  
18490 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76    ** a buffer ov
184a0 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 64 31  erread.  The "d1
184b0 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22  +serial_type1+2"
184c0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77   subexpression w
184d0 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  ill.    ** alway
184e0 73 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  s be greater tha
184f0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
18500 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75  e amount of requ
18510 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a  ired key space..
18520 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20      ** Use that 
18530 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f  approximation to
18540 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20   avoid the more 
18550 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74  expensive call t
18560 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
18570 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
18580 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  n() in the commo
18590 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  n case..    */. 
185a0 20 20 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c     if( d1+serial
185b0 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b  _type1+2>(u32)nK
185c0 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73  ey1.     && d1+s
185d0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
185e0 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
185f0 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31  ype1)>(u32)nKey1
18600 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62   .    ){.      b
18610 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
18620 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
18630 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d  values to be com
18640 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  pared..    */.  
18650 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
18660 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
18670 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
18680 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a  type1, &mem1);..
18690 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
186a0 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a  mparison.    */.
186b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
186c0 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31  MemCompare(&mem1
186d0 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  , &pPKey2->aMem[
186e0 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  i], pKeyInfo->aC
186f0 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  oll[i]);.    if(
18700 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
18710 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61  assert( mem1.zMa
18720 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53  lloc==0 );  /* S
18730 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77  ee comment below
18740 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b   */.      if( pK
18750 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
18760 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[i] ){.       
18770 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49   rc = -rc;  /* I
18780 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74  nvert the result
18790 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f   for DESC sort o
187a0 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  rder. */.      }
187b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
187c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
187d0 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c  .  }while( idx1<
187e0 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
187f0 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20  y2->nField );.. 
18800 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
18810 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
18820 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
18830 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
18840 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
18850 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
18860 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
18870 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
18880 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
18890 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
188a0 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
188b0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
188c0 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  mem1)..  */.  as
188d0 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c  sert( mem1.zMall
188e0 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72  oc==0 );..  /* r
188f0 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20  c==0 here means 
18900 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
18910 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
18920 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
18930 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
18940 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
18950 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75  were equal. Retu
18960 72 6e 20 74 68 65 20 74 68 65 20 64 65 66 61 75  rn the the defau
18970 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65  lt_rc.  ** value
18980 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  .  */.  return p
18990 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
189a0 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
189b0 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53   vdbeCompareMemS
189c0 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d  tring(.  const M
189d0 65 6d 20 2a 70 4d 65 6d 31 2c 20 0a 20 20 63 6f  em *pMem1, .  co
189e0 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20  nst Mem *pMem2, 
189f0 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71  .  const CollSeq
18a00 20 2a 70 43 6f 6c 6c 0a 29 7b 0a 20 20 69 66 28   *pColl.){.  if(
18a10 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f   pMem1->enc==pCo
18a20 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f  ll->enc ){.    /
18a30 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20 61 72  * The strings ar
18a40 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  e already in the
18a50 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64 69 6e   correct encodin
18a60 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20 20 20  g.  Call the.   
18a70 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20    ** comparison 
18a80 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63 74 6c  function directl
18a90 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  y */.    return 
18aa0 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
18ab0 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e  l->pUser,pMem1->
18ac0 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32  n,pMem1->z,pMem2
18ad0 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20  ->n,pMem2->z);. 
18ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
18af0 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f  rc;.    const vo
18b00 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20  id *v1, *v2;.   
18b10 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20 20   int n1, n2;.   
18b20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d   Mem c1;.    Mem
18b30 20 63 32 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28   c2;.    memset(
18b40 26 63 31 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63  &c1, 0, sizeof(c
18b50 31 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  1));.    memset(
18b60 26 63 32 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63  &c2, 0, sizeof(c
18b70 32 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  2));.    sqlite3
18b80 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
18b90 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d  py(&c1, pMem1, M
18ba0 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73  EM_Ephem);.    s
18bb0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
18bc0 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d  llowCopy(&c2, pM
18bd0 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  em2, MEM_Ephem);
18be0 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65  .    v1 = sqlite
18bf0 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69  3ValueText((sqli
18c00 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20  te3_value*)&c1, 
18c10 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20  pColl->enc);.   
18c20 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20   n1 = v1==0 ? 0 
18c30 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d  : c1.n;.    v2 =
18c40 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
18c50 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t((sqlite3_value
18c60 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  *)&c2, pColl->en
18c70 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d  c);.    n2 = v2=
18c80 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20  =0 ? 0 : c2.n;. 
18c90 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78     rc = pColl->x
18ca0 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
18cb0 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32  , n1, v1, n2, v2
18cc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
18cd0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 31  beMemRelease(&c1
18ce0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
18cf0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 32  beMemRelease(&c2
18d00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
18d10 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
18d20 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65  ompare the value
18d30 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74  s contained by t
18d40 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65  he two memory ce
18d50 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a  lls, returning.*
18d60 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  * negative, zero
18d70 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
18d80 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68  pMem1 is less th
18d90 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  an, equal to, or
18da0 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e   greater.** than
18db0 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20   pMem2. Sorting 
18dc0 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20  order is NULL's 
18dd0 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20  first, followed 
18de0 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65  by numbers (inte
18df0 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c  gers.** and real
18e00 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69  s) sorted numeri
18e10 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20  cally, followed 
18e20 62 79 20 74 65 78 74 20 6f 72 64 65 72 65 64 20  by text ordered 
18e30 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  by the collating
18e40 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f  .** sequence pCo
18e50 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62  ll and finally b
18e60 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62 79  lob's ordered by
18e70 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a   memcmp()..**.**
18e80 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73   Two NULL values
18e90 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
18ea0 65 71 75 61 6c 20 62 79 20 74 68 69 73 20 66 75  equal by this fu
18eb0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
18ec0 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
18ed0 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d  (const Mem *pMem
18ee0 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  1, const Mem *pM
18ef0 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53  em2, const CollS
18f00 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e  eq *pColl){.  in
18f10 74 20 72 63 3b 0a 20 20 69 6e 74 20 66 31 2c 20  t rc;.  int f1, 
18f20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e  f2;.  int combin
18f30 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20  ed_flags;..  f1 
18f40 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a  = pMem1->flags;.
18f50 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c    f2 = pMem2->fl
18f60 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f  ags;.  combined_
18f70 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20  flags = f1|f2;. 
18f80 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e   assert( (combin
18f90 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  ed_flags & MEM_R
18fa0 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20  owSet)==0 );. . 
18fb0 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
18fc0 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20   is NULL, it is 
18fd0 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74  less than the ot
18fe0 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c  her. If both val
18ff0 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c  ues.  ** are NUL
19000 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  L, return 0..  *
19010 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
19020 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20  _flags&MEM_Null 
19030 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66  ){.    return (f
19040 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66  2&MEM_Null) - (f
19050 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d  1&MEM_Null);.  }
19060 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61  ..  /* If one va
19070 6c 75 65 20 69 73 20 61 20 6e 75 6d 62 65 72 20  lue is a number 
19080 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73  and the other is
19090 20 6e 6f 74 2c 20 74 68 65 20 6e 75 6d 62 65 72   not, the number
190a0 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49   is less..  ** I
190b0 66 20 62 6f 74 68 20 61 72 65 20 6e 75 6d 62 65  f both are numbe
190c0 72 73 2c 20 63 6f 6d 70 61 72 65 20 61 73 20 72  rs, compare as r
190d0 65 61 6c 73 20 69 66 20 6f 6e 65 20 69 73 20 61  eals if one is a
190e0 20 72 65 61 6c 2c 20 6f 72 20 61 73 20 69 6e 74   real, or as int
190f0 65 67 65 72 73 0a 20 20 2a 2a 20 69 66 20 62 6f  egers.  ** if bo
19100 74 68 20 76 61 6c 75 65 73 20 61 72 65 20 69 6e  th values are in
19110 74 65 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69  tegers..  */.  i
19120 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
19130 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  s&(MEM_Int|MEM_R
19140 65 61 6c 29 20 29 7b 0a 20 20 20 20 64 6f 75 62  eal) ){.    doub
19150 6c 65 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 69  le r1, r2;.    i
19160 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45  f( (f1 & f2 & ME
19170 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
19180 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
19190 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29  i < pMem2->u.i )
191a0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
191b0 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69    if( pMem1->u.i
191c0 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20   > pMem2->u.i ) 
191d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
191e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
191f0 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f      if( (f1&MEM_
19200 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
19210 20 20 72 31 20 3d 20 70 4d 65 6d 31 2d 3e 72 3b    r1 = pMem1->r;
19220 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
19230 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29  f1&MEM_Int)!=0 )
19240 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 28 64 6f  {.      r1 = (do
19250 75 62 6c 65 29 70 4d 65 6d 31 2d 3e 75 2e 69 3b  uble)pMem1->u.i;
19260 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19270 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
19280 7d 0a 20 20 20 20 69 66 28 20 28 66 32 26 4d 45  }.    if( (f2&ME
19290 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20  M_Real)!=0 ){.  
192a0 20 20 20 20 72 32 20 3d 20 70 4d 65 6d 32 2d 3e      r2 = pMem2->
192b0 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r;.    }else if(
192c0 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30   (f2&MEM_Int)!=0
192d0 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 28   ){.      r2 = (
192e0 64 6f 75 62 6c 65 29 70 4d 65 6d 32 2d 3e 75 2e  double)pMem2->u.
192f0 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
19300 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
19310 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 31 3c     }.    if( r1<
19320 72 32 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  r2 ) return -1;.
19330 20 20 20 20 69 66 28 20 72 31 3e 72 32 20 29 20      if( r1>r2 ) 
19340 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65  return 1;.    re
19350 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
19360 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69  * If one value i
19370 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74  s a string and t
19380 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c  he other is a bl
19390 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69  ob, the string i
193a0 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20  s less..  ** If 
193b0 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67 73  both are strings
193c0 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20  , compare using 
193d0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  the collating fu
193e0 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nctions..  */.  
193f0 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
19400 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20  gs&MEM_Str ){.  
19410 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f    if( (f1 & MEM_
19420 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
19430 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
19440 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20 4d  .    if( (f2 & M
19450 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
19460 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
19470 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
19480 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d  ( pMem1->enc==pM
19490 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20 20 20 20  em2->enc );.    
194a0 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
194b0 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
194c0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
194d0 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
194e0 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d  TE_UTF16LE || pM
194f0 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
19500 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20  _UTF16BE );..   
19510 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f   /* The collatio
19520 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20  n sequence must 
19530 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68  be defined at th
19540 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69  is point, even i
19550 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65  f.    ** the use
19560 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f  r deletes the co
19570 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
19580 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20   after the vdbe 
19590 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a  program is.    *
195a0 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73  * compiled (this
195b0 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20   was not always 
195c0 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a  the case)..    *
195d0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
195e0 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78  Coll || pColl->x
195f0 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  Cmp );..    if( 
19600 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
19610 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72  eturn vdbeCompar
19620 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31  eMemString(pMem1
19630 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 29 3b  , pMem2, pColl);
19640 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66  .    }.    /* If
19650 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
19660 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74 68  was passed as th
19670 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69  e collate functi
19680 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  on, fall through
19690 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62  .    ** to the b
196a0 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73 65  lob case and use
196b0 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20   memcmp().  */. 
196c0 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76   }. .  /* Both v
196d0 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c  alues must be bl
196e0 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73  obs.  Compare us
196f0 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  ing memcmp().  *
19700 2f 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28  /.  rc = memcmp(
19710 70 4d 65 6d 31 2d 3e 7a 2c 20 70 4d 65 6d 32 2d  pMem1->z, pMem2-
19720 3e 7a 2c 20 28 70 4d 65 6d 31 2d 3e 6e 3e 70 4d  >z, (pMem1->n>pM
19730 65 6d 32 2d 3e 6e 29 3f 70 4d 65 6d 32 2d 3e 6e  em2->n)?pMem2->n
19740 3a 70 4d 65 6d 31 2d 3e 6e 29 3b 0a 20 20 69 66  :pMem1->n);.  if
19750 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc==0 ){.    r
19760 63 20 3d 20 70 4d 65 6d 31 2d 3e 6e 20 2d 20 70  c = pMem1->n - p
19770 4d 65 6d 32 2d 3e 6e 3b 0a 20 20 7d 0a 20 20 72  Mem2->n;.  }.  r
19780 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74  eturn rc;.}...st
19790 61 74 69 63 20 69 36 34 20 76 64 62 65 52 65 63  atic i64 vdbeRec
197a0 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32  ordDecodeInt(u32
197b0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f   serial_type, co
197c0 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20  nst u8 *aKey){. 
197d0 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
197e0 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
197f0 20 31 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1:.      return
19800 20 28 63 68 61 72 29 61 4b 65 79 5b 30 5d 3b 0a   (char)aKey[0];.
19810 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20      case 2:.    
19820 20 20 72 65 74 75 72 6e 20 28 28 63 68 61 72 29    return ((char)
19830 61 4b 65 79 5b 30 5d 20 3c 3c 20 38 29 20 7c 20  aKey[0] << 8) | 
19840 61 4b 65 79 5b 31 5d 3b 0a 20 20 20 20 63 61 73  aKey[1];.    cas
19850 65 20 33 3a 0a 20 20 20 20 20 20 72 65 74 75 72  e 3:.      retur
19860 6e 20 28 28 63 68 61 72 29 61 4b 65 79 5b 30 5d  n ((char)aKey[0]
19870 20 3c 3c 20 31 36 29 20 7c 20 28 61 4b 65 79 5b   << 16) | (aKey[
19880 31 5d 20 3c 3c 20 38 29 20 7c 20 61 4b 65 79 5b  1] << 8) | aKey[
19890 32 5d 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 0a  2];.    case 4:.
198a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 63        return ((c
198b0 68 61 72 29 61 4b 65 79 5b 30 5d 3c 3c 32 34 29  har)aKey[0]<<24)
198c0 20 7c 20 28 61 4b 65 79 5b 31 5d 3c 3c 31 36 29   | (aKey[1]<<16)
198d0 20 7c 20 28 61 4b 65 79 5b 32 5d 3c 3c 38 29 7c   | (aKey[2]<<8)|
198e0 20 61 4b 65 79 5b 33 5d 3b 0a 0a 20 20 20 20 63   aKey[3];..    c
198f0 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20 69  ase 5: {.      i
19900 36 34 20 6d 73 77 20 3d 20 28 28 63 68 61 72 29  64 msw = ((char)
19910 61 4b 65 79 5b 30 5d 3c 3c 32 34 29 7c 28 61 4b  aKey[0]<<24)|(aK
19920 65 79 5b 31 5d 3c 3c 31 36 29 7c 28 61 4b 65 79  ey[1]<<16)|(aKey
19930 5b 32 5d 3c 3c 38 29 7c 61 4b 65 79 5b 33 5d 3b  [2]<<8)|aKey[3];
19940 0a 20 20 20 20 20 20 75 33 32 20 6c 73 77 20 3d  .      u32 lsw =
19950 20 28 61 4b 65 79 5b 34 5d 20 3c 3c 20 38 29 20   (aKey[4] << 8) 
19960 7c 20 61 4b 65 79 5b 35 5d 3b 0a 20 20 20 20 20  | aKey[5];.     
19970 20 72 65 74 75 72 6e 20 28 69 36 34 29 28 20 6d   return (i64)( m
19980 73 77 20 3c 3c 20 31 36 20 7c 20 28 75 36 34 29  sw << 16 | (u64)
19990 6c 73 77 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lsw );.    }..  
199a0 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20    case 6: {.    
199b0 20 20 69 36 34 20 6d 73 77 20 3d 20 28 28 63 68    i64 msw = ((ch
199c0 61 72 29 61 4b 65 79 5b 30 5d 3c 3c 32 34 29 7c  ar)aKey[0]<<24)|
199d0 28 61 4b 65 79 5b 31 5d 3c 3c 31 36 29 7c 28 61  (aKey[1]<<16)|(a
199e0 4b 65 79 5b 32 5d 3c 3c 38 29 7c 61 4b 65 79 5b  Key[2]<<8)|aKey[
199f0 33 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 6c 73  3];.      u32 ls
19a00 77 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 61  w = ((unsigned)a
19a10 4b 65 79 5b 34 5d 3c 3c 32 34 29 7c 28 61 4b 65  Key[4]<<24)|(aKe
19a20 79 5b 35 5d 3c 3c 31 36 29 7c 28 61 4b 65 79 5b  y[5]<<16)|(aKey[
19a30 36 5d 3c 3c 38 29 7c 61 4b 65 79 5b 37 5d 3b 0a  6]<<8)|aKey[7];.
19a40 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36        return (i6
19a50 34 29 28 20 6d 73 77 20 3c 3c 20 33 32 20 7c 20  4)( msw << 32 | 
19a60 28 75 36 34 29 6c 73 77 20 29 3b 0a 20 20 20 20  (u64)lsw );.    
19a70 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
19a80 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38  (serial_type - 8
19a90 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
19aa0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
19ab0 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  re(.  int nKey1,
19ac0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
19ad0 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
19ae0 2a 2f 0a 20 20 69 6e 74 20 73 7a 48 64 72 31 2c  */.  int szHdr1,
19af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b00 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
19b10 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 62  cord header in b
19b20 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64  ytes */.  u32 id
19b30 78 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  x1,             
19b40 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
19b50 74 20 6f 66 20 66 69 72 73 74 20 74 79 70 65 20  t of first type 
19b60 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 55  in header */.  U
19b70 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 63  npackedRecord *c
19b80 6f 6e 73 74 20 70 50 4b 65 79 32 20 20 2f 2a 20  onst pPKey2  /* 
19b90 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
19ba0 20 20 75 33 32 20 64 31 20 3d 20 73 7a 48 64 72    u32 d1 = szHdr
19bb0 31 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69  1;   /* Offset i
19bc0 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
19bd0 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
19be0 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  */.  int i = 0;.
19bf0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
19c00 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65  Mem *pRhs = pPKe
19c10 79 32 2d 3e 61 4d 65 6d 3b 0a 20 20 4b 65 79 49  y2->aMem;.  KeyI
19c20 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
19c30 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
19c40 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
19c50 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
19c60 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
19c70 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
19c80 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 23 69 66 64   Mem mem1;..#ifd
19c90 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
19ca0 20 20 69 6e 74 20 65 78 70 65 63 74 65 64 20 3d    int expected =
19cb0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
19cc0 72 65 50 72 65 76 28 6e 4b 65 79 31 2c 20 70 4b  rePrev(nKey1, pK
19cd0 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20  ey1, pPKey2);.  
19ce0 73 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c  static int nCall
19cf0 20 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b   = 0;.  nCall++;
19d00 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
19d10 20 69 64 78 3d 3d 30 2c 20 74 68 65 6e 20 74 68   idx==0, then th
19d20 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
19d30 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65 64 20  eady determined 
19d40 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 74  that the first t
19d50 77 6f 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73  wo.  ** elements
19d60 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65   in the keys are
19d70 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68 65 20   equal. Fix the 
19d80 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20 76 61  various stack va
19d90 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20  riables so.  ** 
19da0 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
19db0 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 69  e begins compari
19dc0 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64  ng at the second
19dd0 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28   field. */.  if(
19de0 20 69 64 78 31 3d 3d 30 20 29 7b 0a 20 20 20 20   idx1==0 ){.    
19df0 75 33 32 20 73 31 3b 0a 20 20 20 20 61 73 73 65  u32 s1;.    asse
19e00 72 74 28 20 73 71 6c 69 74 65 33 56 61 72 69 6e  rt( sqlite3Varin
19e10 74 4c 65 6e 28 73 7a 48 64 72 31 29 3d 3d 31 20  tLen(szHdr1)==1 
19e20 29 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20  );.    idx1 = 1 
19e30 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  + getVarint32(&a
19e40 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20  Key1[1], s1);.  
19e50 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
19e60 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
19e70 28 73 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b  (s1);.    i = 1;
19e80 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d  .    pRhs++;.  }
19e90 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65  ..  VVA_ONLY( me
19ea0 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20  m1.zMalloc = 0; 
19eb0 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64  ) /* Only needed
19ec0 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61   by assert() sta
19ed0 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73  tements */.  ass
19ee0 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
19ef0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50  yInfo->nField+pP
19f00 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
19f10 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d  nXField>=pPKey2-
19f20 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20  >nField .       
19f30 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
19f40 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
19f50 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  2->pKeyInfo->aSo
19f60 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
19f70 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
19f80 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
19f90 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
19fa0 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20  idx1<=szHdr1 || 
19fb0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
19fc0 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69  do{.    u32 seri
19fd0 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a  al_type;..    /*
19fe0 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67   RHS is an integ
19ff0 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52  er */.    if( pR
1a000 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1a010 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72  Int ){.      ser
1a020 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
1a030 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66  [idx1];.      if
1a040 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
1a050 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  2 ){.        rc 
1a060 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1a070 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1a080 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1a090 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1a0a0 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
1a0b0 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
1a0c0 20 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d 20     double rhs = 
1a0d0 28 64 6f 75 62 6c 65 29 70 52 68 73 2d 3e 75 2e  (double)pRhs->u.
1a0e0 69 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  i;.        sqlit
1a0f0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1a100 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
1a110 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b  al_type, &mem1);
1a120 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d  .        if( mem
1a130 31 2e 72 3c 72 68 73 20 29 7b 0a 20 20 20 20 20  1.r<rhs ){.     
1a140 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1a150 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1a160 6d 65 6d 31 2e 72 3e 72 68 73 20 29 7b 0a 20 20  mem1.r>rhs ){.  
1a170 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1a180 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a1a0 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65  i64 lhs = vdbeRe
1a1b0 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65  cordDecodeInt(se
1a1c0 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79  rial_type, &aKey
1a1d0 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  1[d1]);.        
1a1e0 69 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e  i64 rhs = pRhs->
1a1f0 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28  u.i;.        if(
1a200 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20   lhs<rhs ){.    
1a210 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1a220 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1a230 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20   lhs>rhs ){.    
1a240 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1a250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1a260 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1a270 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20  HS is real */.  
1a280 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
1a290 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
1a2a0 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61  l ){.      seria
1a2b0 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
1a2c0 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  dx1];.      if( 
1a2d0 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
1a2e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1a2f0 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +1;.      }else 
1a300 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1a310 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1a320 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1a330 73 65 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62  se{.        doub
1a340 6c 65 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 72  le rhs = pRhs->r
1a350 3b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65  ;.        double
1a360 20 6c 68 73 3b 0a 20 20 20 20 20 20 20 20 73 71   lhs;.        sq
1a370 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1a380 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1a390 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d  erial_type, &mem
1a3a0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1a3b0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
1a3c0 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 68 73 20  {.          lhs 
1a3d0 3d 20 6d 65 6d 31 2e 72 3b 0a 20 20 20 20 20 20  = mem1.r;.      
1a3e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a3f0 20 20 20 6c 68 73 20 3d 20 6d 65 6d 31 2e 75 2e     lhs = mem1.u.
1a400 69 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  i;.        }.   
1a410 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73       if( lhs<rhs
1a420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1a430 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
1a440 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73  else if( lhs>rhs
1a450 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1a460 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1a470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1a480 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20      /* RHS is a 
1a490 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c  string */.    el
1a4a0 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1a4b0 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
1a4c0 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33        getVarint3
1a4d0 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20  2(&aKey1[idx1], 
1a4e0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1a4f0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1a500 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20  ype<12 ){.      
1a510 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1a520 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72   }else if( !(ser
1a530 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29  ial_type & 0x01)
1a540 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1a550 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1a560 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e  {.        mem1.n
1a570 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20   = (serial_type 
1a580 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20  - 12) / 2;.     
1a590 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e     if( (d1+mem1.
1a5a0 6e 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20  n) > nKey1 ){.  
1a5b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 20          rc = 1; 
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a5d0 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
1a5e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1a5f0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ( pKeyInfo->aCol
1a600 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  l[i] ){.        
1a610 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
1a620 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
1a630 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20        mem1.db = 
1a640 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
1a650 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61          mem1.fla
1a660 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20  gs = MEM_Str;.  
1a670 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d          mem1.z =
1a680 20 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20   &aKey1[d1];.   
1a690 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
1a6a0 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
1a6b0 28 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b  (&mem1, pRhs, pK
1a6c0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1a6d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1a6e0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1a6f0 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e  nCmp = MIN(mem1.
1a700 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20  n, pRhs->n);.   
1a710 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63         rc = memc
1a720 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70  mp(&aKey1[d1], p
1a730 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20  Rhs->z, nCmp);. 
1a740 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1a750 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e  =0 ) rc = mem1.n
1a760 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20   - pRhs->n; .   
1a770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1a780 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1a790 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20   is a blob */.  
1a7a0 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
1a7b0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
1a7c0 62 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61  b ){.      getVa
1a7d0 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64  rint32(&aKey1[id
1a7e0 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  x1], serial_type
1a7f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1a800 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28  ial_type<12 || (
1a810 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1a820 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
1a830 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1a840 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1a850 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f   nStr = (serial_
1a860 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a  type - 12) / 2;.
1a870 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b          if( (d1+
1a880 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b  nStr) > nKey1 ){
1a890 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1a8a0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1a8b0 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
1a8c0 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
1a8d0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1a8e0 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c  nCmp = MIN(nStr,
1a8f0 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20   pRhs->n);.     
1a900 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70       rc = memcmp
1a910 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68  (&aKey1[d1], pRh
1a920 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20  s->z, nCmp);.   
1a930 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30         if( rc==0
1a940 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70   ) rc = nStr - p
1a950 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20  Rhs->n;.        
1a960 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1a970 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e  .    /* RHS is n
1a980 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b  ull */.    else{
1a990 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
1a9a0 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
1a9b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 65  ;.      rc = (se
1a9c0 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20  rial_type!=0);. 
1a9d0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
1a9e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
1a9f0 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  ert( mem1.zMallo
1aa00 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
1aa10 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
1aa20 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
1aa30 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
1aa40 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
1aa50 20 3d 20 2d 72 63 3b 0a 23 69 66 20 30 0a 20 20   = -rc;.#if 0.  
1aa60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 72        assert( (r
1aa70 63 3e 30 20 26 26 20 28 72 63 5e 28 69 6e 74 29  c>0 && (rc^(int)
1aa80 30 78 38 30 30 30 30 30 30 30 29 3c 30 29 20 0a  0x80000000)<0) .
1aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
1aaa0 28 72 63 3c 30 20 26 26 20 28 72 63 5e 28 69 6e  (rc<0 && (rc^(in
1aab0 74 29 30 78 38 30 30 30 30 30 30 30 29 3e 30 29  t)0x80000000)>0)
1aac0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
1aad0 72 74 28 20 73 69 7a 65 6f 66 28 69 6e 74 29 3d  rt( sizeof(int)=
1aae0 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =4 );.        rc
1aaf0 20 5e 3d 20 28 69 6e 74 29 30 78 38 30 30 30 30   ^= (int)0x80000
1ab00 30 30 30 3b 20 20 20 20 2f 2a 20 73 69 6d 69 6c  000;    /* simil
1ab10 61 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 3a  ar in spirit to:
1ab20 20 22 72 63 20 3d 20 2d 72 63 3b 22 20 2a 2f 0a   "rc = -rc;" */.
1ab30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ab40 72 63 21 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  rc!=0 );.#endif.
1ab50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
1ab60 73 65 72 74 28 20 28 72 63 3c 30 20 26 26 20 65  sert( (rc<0 && e
1ab70 78 70 65 63 74 65 64 3c 30 29 20 7c 7c 20 28 72  xpected<0) || (r
1ab80 63 3e 30 20 26 26 20 65 78 70 65 63 74 65 64 3e  c>0 && expected>
1ab90 30 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  0) || CORRUPT_DB
1aba0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1abb0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
1abc0 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b  i++;.    pRhs++;
1abd0 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
1abe0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1abf0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
1ac00 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71  ;.    idx1 += sq
1ac10 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73  lite3VarintLen(s
1ac20 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d  erial_type);.  }
1ac30 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
1ac40 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
1ac50 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d 6e 4b  nField && d1<=nK
1ac60 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  ey1 );..  /* No 
1ac70 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1ac80 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
1ac90 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
1aca0 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
1acb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1acc0 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
1acd0 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
1ace0 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
1acf0 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
1ad00 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
1ad10 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
1ad20 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a  Release(&mem1)..
1ad30 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
1ad40 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  em1.zMalloc==0 )
1ad50 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
1ad60 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
1ad70 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65  e or both of the
1ad80 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
1ad90 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
1ada0 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
1adb0 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
1adc0 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74   were equal. Ret
1add0 75 72 6e 20 74 68 65 20 74 68 65 20 64 65 66 61  urn the the defa
1ade0 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75  ult_rc.  ** valu
1adf0 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
1ae00 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1ae10 5f 72 63 3d 3d 65 78 70 65 63 74 65 64 20 29 3b  _rc==expected );
1ae20 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32  .  return pPKey2
1ae30 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a  ->default_rc;.}.
1ae40 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
1ae50 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
1ae60 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1ae70 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1ae80 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
1ae90 0a 20 20 69 6e 74 20 73 7a 48 64 72 2c 0a 20 20  .  int szHdr,.  
1aea0 75 33 32 20 69 64 78 31 2c 0a 20 20 55 6e 70 61  u32 idx1,.  Unpa
1aeb0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1aec0 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  y2        /* Rig
1aed0 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63  ht key */.){.  c
1aee0 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20  onst u8 *aKey = 
1aef0 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  &((const u8*)pKe
1af00 79 31 29 5b 73 7a 48 64 72 5d 3b 0a 20 20 69 6e  y1)[szHdr];.  in
1af10 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20  t serial_type = 
1af20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  ((const u8*)pKey
1af30 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73  1)[1];.  int res
1af40 3b 0a 20 20 69 36 34 20 76 20 3d 20 70 50 4b 65  ;.  i64 v = pPKe
1af50 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b  y2->aMem[0].u.i;
1af60 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 73  .  i64 lhs;..  s
1af70 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
1af80 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
1af90 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28 63  :.      lhs = (c
1afa0 68 61 72 29 28 61 4b 65 79 5b 30 5d 29 3b 0a 20  har)(aKey[0]);. 
1afb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1afc0 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20 6c 68  case 2:.      lh
1afd0 73 20 3d 20 32 35 36 2a 28 73 69 67 6e 65 64 20  s = 256*(signed 
1afe0 63 68 61 72 29 61 4b 65 79 5b 30 5d 20 2b 20 61  char)aKey[0] + a
1aff0 4b 65 79 5b 31 5d 3b 0a 20 20 20 20 20 20 62 72  Key[1];.      br
1b000 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 33 3a  eak;.    case 3:
1b010 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 36 35 35  .      lhs = 655
1b020 33 36 2a 28 63 68 61 72 29 61 4b 65 79 5b 30 5d  36*(char)aKey[0]
1b030 20 7c 20 28 61 4b 65 79 5b 31 5d 3c 3c 38 29 20   | (aKey[1]<<8) 
1b040 7c 20 61 4b 65 79 5b 32 5d 3b 0a 20 20 20 20 20  | aKey[2];.     
1b050 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1b060 20 34 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   4:.      lhs = 
1b070 28 69 6e 74 29 28 28 28 75 33 32 29 61 4b 65 79  (int)(((u32)aKey
1b080 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 4b 65 79  [0]<<24) | (aKey
1b090 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 4b 65 79  [1]<<16) | (aKey
1b0a0 5b 32 5d 3c 3c 38 29 7c 20 61 4b 65 79 5b 33 5d  [2]<<8)| aKey[3]
1b0b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b0c0 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20  .    case 5: {. 
1b0d0 20 20 20 20 20 69 36 34 20 6d 73 77 20 3d 20 28       i64 msw = (
1b0e0 28 63 68 61 72 29 61 4b 65 79 5b 30 5d 3c 3c 32  (char)aKey[0]<<2
1b0f0 34 29 7c 28 61 4b 65 79 5b 31 5d 3c 3c 31 36 29  4)|(aKey[1]<<16)
1b100 7c 28 61 4b 65 79 5b 32 5d 3c 3c 38 29 7c 61 4b  |(aKey[2]<<8)|aK
1b110 65 79 5b 33 5d 3b 0a 20 20 20 20 20 20 75 33 32  ey[3];.      u32
1b120 20 6c 73 77 20 3d 20 28 61 4b 65 79 5b 34 5d 20   lsw = (aKey[4] 
1b130 3c 3c 20 38 29 20 7c 20 61 4b 65 79 5b 35 5d 3b  << 8) | aKey[5];
1b140 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36  .      lhs = (i6
1b150 34 29 28 20 6d 73 77 20 3c 3c 20 31 36 20 7c 20  4)( msw << 16 | 
1b160 28 75 36 34 29 6c 73 77 20 29 3b 0a 20 20 20 20  (u64)lsw );.    
1b170 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1b180 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20      case 6: {.  
1b190 20 20 20 20 69 36 34 20 6d 73 77 20 3d 20 28 28      i64 msw = ((
1b1a0 63 68 61 72 29 61 4b 65 79 5b 30 5d 3c 3c 32 34  char)aKey[0]<<24
1b1b0 29 7c 28 61 4b 65 79 5b 31 5d 3c 3c 31 36 29 7c  )|(aKey[1]<<16)|
1b1c0 28 61 4b 65 79 5b 32 5d 3c 3c 38 29 7c 61 4b 65  (aKey[2]<<8)|aKe
1b1d0 79 5b 33 5d 3b 0a 20 20 20 20 20 20 75 33 32 20  y[3];.      u32 
1b1e0 6c 73 77 20 3d 20 28 28 75 6e 73 69 67 6e 65 64  lsw = ((unsigned
1b1f0 29 61 4b 65 79 5b 34 5d 3c 3c 32 34 29 7c 28 61  )aKey[4]<<24)|(a
1b200 4b 65 79 5b 35 5d 3c 3c 31 36 29 7c 28 61 4b 65  Key[5]<<16)|(aKe
1b210 79 5b 36 5d 3c 3c 38 29 7c 61 4b 65 79 5b 37 5d  y[6]<<8)|aKey[7]
1b220 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69  ;.      lhs = (i
1b230 36 34 29 28 20 6d 73 77 20 3c 3c 20 33 32 20 7c  64)( msw << 32 |
1b240 20 28 75 36 34 29 6c 73 77 20 29 3b 0a 20 20 20   (u64)lsw );.   
1b250 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b260 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20  .    case 8: .  
1b270 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20      lhs = 0;.   
1b280 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
1b290 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73  ase 9:.      lhs
1b2a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
1b2b0 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  k;..    default:
1b2c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
1b2d0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1b2e0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 73 7a  nKey1, pKey1, sz
1b2f0 48 64 72 2c 20 31 2c 20 70 50 4b 65 79 32 29 3b  Hdr, 1, pPKey2);
1b300 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68  .  }..  if( v>lh
1b310 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  s ){.    res = p
1b320 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c  PKey2->r1;.  }el
1b330 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a  se if( v<lhs ){.
1b340 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1b350 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->r2;.  }else if
1b360 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  ( pPKey2->nField
1b370 3e 31 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  >1 ){.    res = 
1b380 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1b390 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  e(nKey1, pKey1, 
1b3a0 73 7a 48 64 72 2c 20 30 2c 20 70 50 4b 65 79 32  szHdr, 0, pPKey2
1b3b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1b3c0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65  res = pPKey2->de
1b3d0 66 61 75 6c 74 5f 72 63 3b 0a 20 20 7d 0a 0a 20  fault_rc;.  }.. 
1b3e0 20 61 73 73 65 72 74 28 20 28 72 65 73 3d 3d 30   assert( (res==0
1b3f0 20 26 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f   && vdbeRecordCo
1b400 6d 70 61 72 65 50 72 65 76 28 6e 4b 65 79 31 2c  mparePrev(nKey1,
1b410 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3d   pKey1, pPKey2)=
1b420 3d 30 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 72  =0).       || (r
1b430 65 73 3c 30 20 26 26 20 76 64 62 65 52 65 63 6f  es<0 && vdbeReco
1b440 72 64 43 6f 6d 70 61 72 65 50 72 65 76 28 6e 4b  rdComparePrev(nK
1b450 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1b460 79 32 29 3c 30 29 0a 20 20 20 20 20 20 20 7c 7c  y2)<0).       ||
1b470 20 28 72 65 73 3e 30 20 26 26 20 76 64 62 65 52   (res>0 && vdbeR
1b480 65 63 6f 72 64 43 6f 6d 70 61 72 65 50 72 65 76  ecordComparePrev
1b490 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1b4a0 50 4b 65 79 32 29 3e 30 29 0a 20 20 20 20 20 20  PKey2)>0).      
1b4b0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20   || CORRUPT_DB. 
1b4c0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73   );.  return res
1b4d0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1b4e0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1b4f0 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e  eString(.  int n
1b500 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1b510 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
1b520 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 73 7a   key */.  int sz
1b530 48 64 72 2c 0a 20 20 75 33 32 20 69 64 78 31 2c  Hdr,.  u32 idx1,
1b540 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1b550 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
1b560 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1b570 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
1b580 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
1b590 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20  8*)pKey1;.  int 
1b5a0 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69  serial_type;.  i
1b5b0 6e 74 20 72 65 73 3b 0a 0a 20 20 67 65 74 56 61  nt res;..  getVa
1b5c0 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d  rint32(&aKey1[1]
1b5d0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1b5e0 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
1b5f0 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73  pe<12 ){.    res
1b600 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20   = pPKey2->r1;  
1b610 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b      /* (pKey1/nK
1b620 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72  ey1) is a number
1b630 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20   or a null */.  
1b640 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
1b650 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
1b660 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50  ){ .    res = pP
1b670 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f  Key2->r2;      /
1b680 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
1b690 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d  is a blob */.  }
1b6a0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43  else{.    int nC
1b6b0 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72  mp;.    int nStr
1b6c0 3b 0a 20 20 20 20 61 4b 65 79 31 20 3d 20 26 61  ;.    aKey1 = &a
1b6d0 4b 65 79 31 5b 73 7a 48 64 72 5d 3b 0a 0a 20 20  Key1[szHdr];..  
1b6e0 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c    nStr = (serial
1b6f0 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20  _type-12) / 2;. 
1b700 20 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20     if( (szHdr + 
1b710 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 20  nStr) > nKey1 ) 
1b720 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
1b730 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
1b740 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50    nCmp = MIN( pP
1b750 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c  Key2->aMem[0].n,
1b760 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73   nStr );.    res
1b770 20 3d 20 6d 65 6d 63 6d 70 28 61 4b 65 79 31 2c   = memcmp(aKey1,
1b780 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
1b790 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20  .z, nCmp);..    
1b7a0 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
1b7b0 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d      res = nStr -
1b7c0 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
1b7d0 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  .n;.      if( re
1b7e0 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
1b7f0 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65  if( pPKey2->nFie
1b800 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ld>1 ){.        
1b810 20 20 72 65 73 20 3d 20 76 64 62 65 52 65 63 6f    res = vdbeReco
1b820 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
1b830 20 70 4b 65 79 31 2c 20 73 7a 48 64 72 2c 20 30   pKey1, szHdr, 0
1b840 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20 20 20 20  , pPKey2);.     
1b850 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b860 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1b870 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20  ->default_rc;.  
1b880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1b890 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b  lse if( res>0 ){
1b8a0 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70  .        res = p
1b8b0 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20  PKey2->r2;.     
1b8c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b8d0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
1b8e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1b8f0 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b  lse if( res>0 ){
1b900 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b  .      res = pPK
1b910 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c  ey2->r2;.    }el
1b920 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  se{.      res = 
1b930 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20  pPKey2->r1;.    
1b940 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
1b950 20 28 72 65 73 3d 3d 30 20 26 26 20 73 71 6c 69   (res==0 && sqli
1b960 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1b970 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79  pare(nKey1, pKey
1b980 31 2c 20 70 50 4b 65 79 32 29 3d 3d 30 29 0a 20  1, pPKey2)==0). 
1b990 20 20 20 20 20 20 7c 7c 20 28 72 65 73 3c 30 20        || (res<0 
1b9a0 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  && sqlite3VdbeRe
1b9b0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
1b9c0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1b9d0 29 3c 30 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  )<0).       || (
1b9e0 72 65 73 3e 30 20 26 26 20 73 71 6c 69 74 65 33  res>0 && sqlite3
1b9f0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1ba00 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  e(nKey1, pKey1, 
1ba10 70 50 4b 65 79 32 29 3e 30 29 0a 20 20 20 20 20  pPKey2)>0).     
1ba20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a    || CORRUPT_DB.
1ba30 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65    );.  return re
1ba40 73 3b 0a 7d 0a 0a 0a 69 6e 74 20 76 64 62 65 52  s;.}...int vdbeR
1ba50 65 63 6f 72 64 43 6f 6d 70 61 72 65 4c 61 72 67  ecordCompareLarg
1ba60 65 48 65 61 64 65 72 28 0a 20 20 69 6e 74 20 6e  eHeader(.  int n
1ba70 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1ba80 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
1ba90 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 75   key */.  int du
1baa0 6d 6d 79 31 2c 20 75 33 32 20 64 75 6d 6d 79 32  mmy1, u32 dummy2
1bab0 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65  ,       /* Unuse
1bac0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  d arguments */. 
1bad0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1bae0 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
1baf0 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
1bb00 7b 0a 20 20 69 6e 74 20 73 7a 48 64 72 3b 0a 20  {.  int szHdr;. 
1bb10 20 75 33 32 20 69 64 78 31 3b 0a 20 20 69 64 78   u32 idx1;.  idx
1bb20 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
1bb30 28 28 75 38 2a 29 70 4b 65 79 31 29 2c 20 73 7a  ((u8*)pKey1), sz
1bb40 48 64 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 76  Hdr);.  return v
1bb50 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1bb60 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 73  (nKey1, pKey1, s
1bb70 7a 48 64 72 2c 20 69 64 78 31 2c 20 70 50 4b 65  zHdr, idx1, pPKe
1bb80 79 32 29 3b 0a 7d 0a 0a 52 65 63 6f 72 64 43 6f  y2);.}..RecordCo
1bb90 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56 64 62  mpare sqlite3Vdb
1bba0 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70  eFindCompare(Unp
1bbb0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b  ackedRecord *p){
1bbc0 0a 20 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49  .  if( (p->pKeyI
1bbd0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d  nfo->nField + p-
1bbe0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65  >pKeyInfo->nXFie
1bbf0 6c 64 29 20 3e 20 31 30 20 29 7b 0a 20 20 20 20  ld) > 10 ){.    
1bc00 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72  return vdbeRecor
1bc10 64 43 6f 6d 70 61 72 65 4c 61 72 67 65 48 65 61  dCompareLargeHea
1bc20 64 65 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  der;.  }else{.  
1bc30 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d    int flags = p-
1bc40 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a  >aMem[0].flags;.
1bc50 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49      if( p->pKeyI
1bc60 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
1bc70 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  0] ){.      p->r
1bc80 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e  1 = 1;.      p->
1bc90 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  r2 = -1;.    }el
1bca0 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20  se{.      p->r1 
1bcb0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72  = -1;.      p->r
1bcc0 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  2 = 1;.    }.   
1bcd0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45   if( (flags & ME
1bce0 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20  M_Int) ){.      
1bcf0 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72  return vdbeRecor
1bd00 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20  dCompareInt;.   
1bd10 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67   }.    if( (flag
1bd20 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  s & (MEM_Int|MEM
1bd30 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d  _Real|MEM_Null|M
1bd40 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 0a 20 20  EM_Blob))==0 .  
1bd50 20 20 20 20 20 20 26 26 20 70 2d 3e 70 4b 65 79        && p->pKey
1bd60 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d  Info->aColl[0]==
1bd70 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
1bd80 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72  return vdbeRecor
1bd90 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a  dCompareString;.
1bda0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1bdb0 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f  urn vdbeRecordCo
1bdc0 6d 70 61 72 65 3b 0a 7d 0a 0a 52 65 63 6f 72 64  mpare;.}..Record
1bdd0 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56  Compare sqlite3V
1bde0 64 62 65 46 69 6e 64 53 6f 72 74 65 72 43 6f 6d  dbeFindSorterCom
1bdf0 70 61 72 65 28 4b 65 79 49 6e 66 6f 20 2a 70 4b  pare(KeyInfo *pK
1be00 65 79 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 28  eyInfo){.  if( (
1be10 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1be20 20 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46   + pKeyInfo->nXF
1be30 69 65 6c 64 29 20 3e 20 31 30 20 29 7b 0a 20 20  ield) > 10 ){.  
1be40 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63    return vdbeRec
1be50 6f 72 64 43 6f 6d 70 61 72 65 4c 61 72 67 65 48  ordCompareLargeH
1be60 65 61 64 65 72 3b 0a 20 20 7d 0a 20 20 72 65 74  eader;.  }.  ret
1be70 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f  urn vdbeRecordCo
1be80 6d 70 61 72 65 3b 0a 7d 0a 0a 69 6e 74 20 73 71  mpare;.}..int sq
1be90 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1bea0 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b  ompare(.  int nK
1beb0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
1bec0 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
1bed0 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
1bee0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
1bef0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
1bf00 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  key */.){.  int 
1bf10 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78  szHdr;.  u32 idx
1bf20 31 3b 0a 0a 20 20 69 64 78 31 20 3d 20 67 65 74  1;..  idx1 = get
1bf30 56 61 72 69 6e 74 33 32 28 28 28 75 38 2a 29 70  Varint32(((u8*)p
1bf40 4b 65 79 31 29 2c 20 73 7a 48 64 72 29 3b 0a 20  Key1), szHdr);. 
1bf50 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f   return vdbeReco
1bf60 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
1bf70 20 70 4b 65 79 31 2c 20 73 7a 48 64 72 2c 20 69   pKey1, szHdr, i
1bf80 64 78 31 2c 20 70 50 4b 65 79 32 29 3b 0a 7d 0a  dx1, pPKey2);.}.
1bf90 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
1bfa0 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
1bfb0 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
1bfc0 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
1bfd0 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
1bfe0 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
1bff0 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
1c000 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
1c010 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
1c020 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
1c030 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
1c040 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
1c050 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
1c060 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
1c070 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70   pCur might be p
1c080 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20  ointing to text 
1c090 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20  obtained from a 
1c0a0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
1c0b0 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65   file..** So the
1c0c0 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20   content cannot 
1c0d0 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20  be trusted.  Do 
1c0e0 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63  appropriate chec
1c0f0 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ks on the conten
1c100 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1c110 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71  3VdbeIdxRowid(sq
1c120 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72  lite3 *db, BtCur
1c130 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
1c140 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43  rowid){.  i64 nC
1c150 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
1c160 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
1c170 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
1c180 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
1c190 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
1c1a0 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
1c1b0 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
1c1c0 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
1c1d0 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
1c1e0 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
1c1f0 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
1c200 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1c210 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  R(db);..  /* Get
1c220 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1c230 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f   index entry.  O
1c240 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72  nly indices entr
1c250 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a  ies of less.  **
1c260 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73   than 2GiB are s
1c270 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e  upport - anythin
1c280 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20  g large must be 
1c290 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1c2a0 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f  ion..  ** Any co
1c2b0 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
1c2c0 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42  cted in sqlite3B
1c2d0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
1c2e0 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20  (), though, so. 
1c2f0 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61   ** this code ca
1c300 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20  n safely assume 
1c310 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73  that nCellKey is
1c320 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a   32-bits  .  */.
1c330 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1c340 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
1c350 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56  lid(pCur) );.  V
1c360 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71  VA_ONLY(rc =) sq
1c370 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
1c380 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
1c390 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
1c3a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
1c3b0 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
1c3c0 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
1c3d0 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
1c3e0 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  l */.  assert( (
1c3f0 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54  nCellKey & SQLIT
1c400 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34  E_MAX_U32)==(u64
1c410 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20  )nCellKey );..  
1c420 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63  /* Read in the c
1c430 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
1c440 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
1c450 72 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ry */.  memset(&
1c460 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29  m, 0, sizeof(m))
1c470 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1c480 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
1c490 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e  (pCur, 0, (u32)n
1c4a0 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
1c4b0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1c4c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1c4d0 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20  .  /* The index 
1c4e0 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e  entry must begin
1c4f0 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73   with a header s
1c500 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  ize */.  (void)g
1c510 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
1c520 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74  m.z, szHdr);.  t
1c530 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
1c540 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
1c550 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20   szHdr==m.n );. 
1c560 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a   if( unlikely(sz
1c570 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a  Hdr<3 || (int)sz
1c580 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20  Hdr>m.n) ){.    
1c590 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
1c5a0 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
1c5b0 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69    /* The last fi
1c5c0 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  eld of the index
1c5d0 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e   should be an in
1c5e0 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49  teger - the ROWI
1c5f0 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74  D..  ** Verify t
1c600 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  hat the last ent
1c610 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  ry really is an 
1c620 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76  integer. */.  (v
1c630 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
1c640 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d  (u8*)&m.z[szHdr-
1c650 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a  1], typeRowid);.
1c660 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1c670 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65  Rowid==1 );.  te
1c680 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1c690 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61  d==2 );.  testca
1c6a0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33  se( typeRowid==3
1c6b0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1c6c0 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a  typeRowid==4 );.
1c6d0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1c6e0 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65  Rowid==5 );.  te
1c6f0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1c700 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61  d==6 );.  testca
1c710 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38  se( typeRowid==8
1c720 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1c730 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a  typeRowid==9 );.
1c740 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74    if( unlikely(t
1c750 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79  ypeRowid<1 || ty
1c760 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70  peRowid>9 || typ
1c770 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20  eRowid==7) ){.  
1c780 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
1c790 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
1c7a0 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71  .  lenRowid = sq
1c7b0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1c7c0 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64  ypeLen(typeRowid
1c7d0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  );.  testcase( (
1c7e0 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c  u32)m.n==szHdr+l
1c7f0 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28  enRowid );.  if(
1c800 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d   unlikely((u32)m
1c810 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  .n<szHdr+lenRowi
1c820 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  d) ){.    goto i
1c830 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
1c840 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ion;.  }..  /* F
1c850 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72  etch the integer
1c860 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
1c870 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  the index record
1c880 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1c890 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
1c8a0 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
1c8b0 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
1c8c0 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
1c8d0 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
1c8e0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1c8f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1c900 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
1c910 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61  p here if databa
1c920 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
1c930 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20   detected after 
1c940 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20  m has been.  ** 
1c950 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65  allocated.  Free
1c960 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e   the m object an
1c970 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
1c980 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f  CORRUPT. */.idx_
1c990 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
1c9a0 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e  :.  testcase( m.
1c9b0 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20  zMalloc!=0 );.  
1c9c0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1c9d0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
1c9e0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1c9f0 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a  PT_BKPT;.}../*.*
1ca00 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
1ca10 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
1ca20 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
1ca30 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20   pC is pointing 
1ca40 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
1ca50 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
1ca60 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74  pUnpacked.  Writ
1ca70 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e  e into *pRes a n
1ca80 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  umber.** that is
1ca90 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
1caa0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
1cab0 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  pC is less than,
1cac0 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
1cad0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55   greater than pU
1cae0 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e  npacked.  Return
1caf0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
1cb00 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e  ccess..**.** pUn
1cb10 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72  packed is either
1cb20 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
1cb30 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
1cb40 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
1cb50 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
1cb60 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
1cb70 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
1cb80 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1cb90 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
1cba0 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
1cbb0 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20  l.  Hence, this 
1cbc0 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d  routine only com
1cbd0 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78  pares the prefix
1cbe0 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65  es .** of the ke
1cbf0 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ys prior to the 
1cc00 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74  final rowid, not
1cc10 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e   the entire key.
1cc20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1cc30 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
1cc40 28 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  (.  VdbeCursor *
1cc50 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pC,             
1cc60 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
1cc70 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
1cc80 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1cc90 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c  cord *pUnpacked,
1cca0 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65    /* Unpacked ve
1ccb0 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20  rsion of key to 
1ccc0 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
1ccd0 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20  */.  int *res   
1cce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccf0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
1cd00 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20  mparison result 
1cd10 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  here */.){.  i64
1cd20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
1cd30 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
1cd40 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e  sor *pCur = pC->
1cd50 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d  pCursor;.  Mem m
1cd60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1cd70 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
1cd80 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
1cd90 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29    VVA_ONLY(rc =)
1cda0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1cdb0 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
1cdc0 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
1cdd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1cde0 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20  ;    /* pCur is 
1cdf0 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
1ce00 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
1ce10 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c  ail */.  /* nCel
1ce20 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73  lKey will always
1ce30 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
1ce40 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63  d 0xffffffff bec
1ce50 61 75 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a  ause of the say.
1ce60 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50    ** that btreeP
1ce70 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e  arseCellPtr() an
1ce80 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  d sqlite3GetVari
1ce90 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65  nt32() are imple
1cea0 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  mented */.  if( 
1ceb0 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e  nCellKey<=0 || n
1cec0 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66  CellKey>0x7fffff
1ced0 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d  ff ){.    *res =
1cee0 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
1cef0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1cf00 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  PT;.  }.  memset
1cf10 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d  (&m, 0, sizeof(m
1cf20 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
1cf30 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
1cf40 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ee(pC->pCursor, 
1cf50 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79  0, (u32)nCellKey
1cf60 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
1cf70 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
1cf80 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20   rc;.  }.  *res 
1cf90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
1cfa0 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20  ordCompare(m.n, 
1cfb0 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b  m.z, pUnpacked);
1cfc0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
1cfd0 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
1cfe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1cff0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1d000 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
1d010 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74   value to be ret
1d020 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75  urned by subsequ
1d030 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ent calls to.** 
1d040 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
1d050 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  ) on the databas
1d060 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a  e handle 'db'. .
1d070 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1d080 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71  dbeSetChanges(sq
1d090 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
1d0a0 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72  Change){.  asser
1d0b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1d0c0 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
1d0d0 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67   );.  db->nChang
1d0e0 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64  e = nChange;.  d
1d0f0 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20  b->nTotalChange 
1d100 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  += nChange;.}../
1d110 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20  *.** Set a flag 
1d120 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75  in the vdbe to u
1d130 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
1d140 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74   counter when it
1d150 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a   is finalised.**
1d160 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f   or reset..*/.vo
1d170 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
1d180 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20  untChanges(Vdbe 
1d190 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65  *v){.  v->change
1d1a0 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  CntOn = 1;.}../*
1d1b0 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70  .** Mark every p
1d1c0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
1d1d0 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
1d1e0 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  h a database con
1d1f0 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78  nection.** as ex
1d200 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  pired..**.** An 
1d210 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e  expired statemen
1d220 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63  t means that rec
1d230 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68  ompilation of th
1d240 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a  e statement is.*
1d250 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74  * recommend.  St
1d260 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20  atements expire 
1d270 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70  when things happ
1d280 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65  en that make the
1d290 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f  ir.** programs o
1d2a0 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69  bsolete.  Removi
1d2b0 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ng user-defined 
1d2c0 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c  functions or col
1d2d0 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
1d2e0 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67  ces, or changing
1d2f0 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   an authorizatio
1d300 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74  n function are t
1d310 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74  he types of.** t
1d320 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20  hings that make 
1d330 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
1d340 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f  nts obsolete..*/
1d350 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1d360 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
1d370 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  ments(sqlite3 *d
1d380 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
1d390 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64   for(p = db->pVd
1d3a0 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  be; p; p=p->pNex
1d3b0 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72  t){.    p->expir
1d3c0 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
1d3d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1d3e0 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
1d3f0 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
1d400 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73  e..*/.sqlite3 *s
1d410 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62  qlite3VdbeDb(Vdb
1d420 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *v){.  return 
1d430 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  v->db;.}../*.** 
1d440 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1d450 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76   to an sqlite3_v
1d460 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63  alue structure c
1d470 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61  ontaining the va
1d480 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72  lue bound.** par
1d490 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56  ameter iVar of V
1d4a0 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20  M v. Except, if 
1d4b0 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20  the value is an 
1d4c0 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e  SQL NULL, return
1d4d0 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20   .** 0 instead. 
1d4e0 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c  Unless it is NUL
1d4f0 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74  L, apply affinit
1d500 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68  y aff (one of th
1d510 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a  e SQLITE_AFF_*.*
1d520 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20  * constants) to 
1d530 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65  the value before
1d540 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a   returning it..*
1d550 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
1d560 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20  d value must be 
1d570 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
1d580 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ler using sqlite
1d590 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f  3ValueFree()..*/
1d5a0 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  .sqlite3_value *
1d5b0 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f  sqlite3VdbeGetBo
1d5c0 75 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76  undValue(Vdbe *v
1d5d0 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61  , int iVar, u8 a
1d5e0 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ff){.  assert( i
1d5f0 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76  Var>0 );.  if( v
1d600 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65   ){.    Mem *pMe
1d610 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61  m = &v->aVar[iVa
1d620 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d  r-1];.    if( 0=
1d630 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  =(pMem->flags & 
1d640 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20  MEM_Null) ){.   
1d650 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
1d660 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33   *pRet = sqlite3
1d670 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b  ValueNew(v->db);
1d680 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20  .      if( pRet 
1d690 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1d6a0 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d  e3VdbeMemCopy((M
1d6b0 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29  em *)pRet, pMem)
1d6c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1d6d0 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e  3ValueApplyAffin
1d6e0 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53  ity(pRet, aff, S
1d6f0 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
1d700 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d710 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 28 4d 65  MemStoreType((Me
1d720 6d 20 2a 29 70 52 65 74 29 3b 0a 20 20 20 20 20  m *)pRet);.     
1d730 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1d740 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pRet;.    }.  }.
1d750 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1d760 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53  *.** Configure S
1d770 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72  QL variable iVar
1d780 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67   so that binding
1d790 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20   a new value to 
1d7a0 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f  it signals.** to
1d7b0 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d   sqlite3_reoptim
1d7c0 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72  ize() that re-pr
1d7d0 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74  eparing the stat
1d7e0 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74  ement may result
1d7f0 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20  .** in a better 
1d800 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76  query plan..*/.v
1d810 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
1d820 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a  etVarmask(Vdbe *
1d830 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20  v, int iVar){.  
1d840 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29  assert( iVar>0 )
1d850 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20  ;.  if( iVar>32 
1d860 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  ){.    v->expmas
1d870 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a  k = 0xffffffff;.
1d880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e    }else{.    v->
1d890 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32  expmask |= ((u32
1d8a0 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b  )1 << (iVar-1));
1d8b0 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
1d8c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1d8d0 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54  UALTABLE./*.** T
1d8e0 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65  ransfer error me
1d8f0 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20  ssage text from 
1d900 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e  an sqlite3_vtab.
1d910 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
1d920 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
1d930 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
1d940 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
1d950 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72  into a Vdbe.zErr
1d960 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64  Msg (text stored
1d970 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  .** in memory ob
1d980 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1d990 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f  te3DbMalloc)..*/
1d9a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61  .void sqlite3Vta
1d9b0 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64  bImportErrmsg(Vd
1d9c0 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  be *p, sqlite3_v
1d9d0 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73  tab *pVtab){.  s
1d9e0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
1d9f0 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  db;.  sqlite3DbF
1da00 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
1da10 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
1da20 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  g = sqlite3DbStr
1da30 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a  Dup(db, pVtab->z
1da40 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
1da50 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
1da60 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62  ErrMsg);.  pVtab
1da70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d  ->zErrMsg = 0;.}
1da80 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1da90 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1daa0 42 4c 45 20 2a 2f 0a                             BLE */.