/ Hex Artifact Content
Login

Artifact 2f97cd756e2704b06006b398ce468f0bcc006055:


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 20 20 20 20 20 20 61 73  ].db );.      as
8820: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
8830: 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61  eCheckMemInvaria
8840: 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20  nts(p) );..     
8850: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69   /* This block i
8860: 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69  s really an inli
8870: 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  ned version of s
8880: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
8890: 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  ease().      ** 
88a0: 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e  that takes advan
88b0: 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74  tage of the fact
88c0: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79   that the memory
88d0: 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a   cell value is .
88e0: 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73        ** being s
88f0: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72  et to NULL after
8900: 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64   releasing any d
8910: 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73  ynamic resources
8920: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
8930: 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63   ** The justific
8940: 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
8950: 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68  ating code is th
8960: 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  at according to 
8970: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72  .      ** callgr
8980: 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73  ind, this causes
8990: 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20   a certain test 
89a0: 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20  case to hit the 
89b0: 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a  CPU 4.7 .      *
89c0: 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28  * percent less (
89d0: 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76  x86 linux, gcc v
89e0: 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f  ersion 4.1.2, -O
89f0: 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20  6) than if .    
8a00: 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52    ** sqlite3MemR
8a10: 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61  elease() were ca
8a20: 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20  lled from here. 
8a30: 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a  With -O2, this j
8a40: 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  umps.      ** to
8a50: 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68   6.6 percent. Th
8a60: 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69  e test case is i
8a70: 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f  nserting 1000 ro
8a80: 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ws into a table 
8a90: 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e  .      ** with n
8aa0: 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20  o indexes using 
8ab0: 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65  a single prepare
8ac0: 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
8ad0: 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20  nt, bind() .    
8ae0: 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29    ** and reset()
8af0: 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72  . Inserts are gr
8b00: 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ouped into a tra
8b10: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
8b20: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
8b30: 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d  flags&(MEM_Agg|M
8b40: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65  EM_Dyn|MEM_Frame
8b50: 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a  |MEM_RowSet) ){.
8b60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8b70: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29  dbeMemRelease(p)
8b80: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
8b90: 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a  ( p->zMalloc ){.
8ba0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
8bb0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
8bc0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70  lloc);.        p
8bd0: 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  ->zMalloc = 0;. 
8be0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d       }..      p-
8bf0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64  >flags = MEM_Und
8c00: 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 0a 20 20  efined;.    }.  
8c10: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
8c20: 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ed = malloc_fail
8c30: 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed;.  }.}../*.**
8c40: 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72   Delete a VdbeFr
8c50: 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69  ame object and i
8c60: 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62  ts contents. Vdb
8c70: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61  eFrame objects a
8c80: 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
8c90: 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61  by the OP_Progra
8ca0: 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69  m opcode in sqli
8cb0: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a  te3VdbeExec()..*
8cc0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
8cd0: 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64  beFrameDelete(Vd
8ce0: 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69  beFrame *p){.  i
8cf0: 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65  nt i;.  Mem *aMe
8d00: 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d  m = VdbeFrameMem
8d10: 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  (p);.  VdbeCurso
8d20: 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62  r **apCsr = (Vdb
8d30: 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d  eCursor **)&aMem
8d40: 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a  [p->nChildMem];.
8d50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
8d60: 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b  nChildCsr; i++){
8d70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8d80: 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c  FreeCursor(p->v,
8d90: 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a   apCsr[i]);.  }.
8da0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
8db0: 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c  y(aMem, p->nChil
8dc0: 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  dMem);.  sqlite3
8dd0: 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c  DbFree(p->v->db,
8de0: 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   p);.}..#ifndef 
8df0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
8e00: 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61  AIN./*.** Give a
8e10: 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
8e20: 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76  program in the v
8e30: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
8e40: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
8e50: 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ace is the same 
8e60: 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  as sqlite3VdbeEx
8e70: 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65  ec().  But inste
8e80: 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67  ad of.** running
8e90: 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e   the code, it in
8ea0: 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61  vokes the callba
8eb0: 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ck once for each
8ec0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
8ed0: 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73   This feature is
8ee0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
8ef0: 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a  nt "EXPLAIN"..**
8f00: 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c  .** When p->expl
8f10: 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73  ain==1, each ins
8f20: 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74  truction is list
8f30: 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e  ed.  When.** p->
8f40: 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79  explain==2, only
8f50: 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
8f60: 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73  ructions are lis
8f70: 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a  ted and these.**
8f80: 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20   are shown in a 
8f90: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74  different format
8fa0: 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  .  p->explain==2
8fb0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
8fc0: 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e  ement.** EXPLAIN
8fd0: 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a   QUERY PLAN..**.
8fe0: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
8ff0: 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65  in==1, first the
9000: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73   main program is
9010: 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61   listed, then ea
9020: 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69  ch of.** the tri
9030: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
9040: 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20   are listed one 
9050: 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  by one..*/.int s
9060: 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a  qlite3VdbeList(.
9070: 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20    Vdbe *p       
9080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9090: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20  he VDBE */.){.  
90a0: 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20  int nRow;       
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90c0: 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65       /* Stop whe
90d0: 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63  n row count reac
90e0: 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e  hes this */.  in
90f0: 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20  t nSub = 0;     
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9110: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9120: 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73  sub-vdbes seen s
9130: 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72  o far */.  SubPr
9140: 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20  ogram **apSub = 
9150: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
9160: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d  /* Array of sub-
9170: 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a  vdbes */.  Mem *
9180: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91a0: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68  /* Memory cell h
91b0: 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62  old array of sub
91c0: 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  progs */.  sqlit
91d0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20  e3 *db = p->db; 
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
9200: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
9210: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9230: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
9240: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
9250: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9270: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
9280: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26  .  Mem *pMem = &
9290: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20  p->aMem[1];     
92a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
92b0: 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73   Mem of result s
92c0: 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  et */..  assert(
92d0: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20   p->explain );. 
92e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
92f0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
9300: 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
9310: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
9320: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
9330: 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d  _BUSY || p->rc==
9340: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
9350: 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67  .  /* Even thoug
9360: 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  h this opcode do
9370: 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d  es not use dynam
9380: 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20  ic strings for. 
9390: 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20   ** the result, 
93a0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d  result columns m
93b0: 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69  ay become dynami
93c0: 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61  c if the user ca
93d0: 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  lls.  ** sqlite3
93e0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
93f0: 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e  , causing a tran
9400: 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31  slation to UTF-1
9410: 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f  6 encoding..  */
9420: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
9430: 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70  ay(pMem, 8);.  p
9440: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
9450: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
9460: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
9470: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
9480: 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ens if a malloc(
9490: 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20  ) inside a call 
94a0: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  to sqlite3_colum
94b0: 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20  n_text() or.    
94c0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ** sqlite3_colum
94d0: 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65  n_text16() faile
94e0: 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d  d.  */.    db->m
94f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
9500: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9510: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
9520: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
9530: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
9540: 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c  ws reaches nRow,
9550: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a   that means the.
9560: 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73    ** listing has
9570: 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71   finished and sq
9580: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f  lite3_step() sho
9590: 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  uld return SQLIT
95a0: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f  E_DONE..  ** nRo
95b0: 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  w is the sum of 
95c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
95d0: 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70  ws in the main p
95e0: 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a  rogram, plus.  *
95f0: 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  * the sum of the
9600: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
9610: 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73  in all trigger s
9620: 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75  ubprograms encou
9630: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66  ntered.  ** so f
9640: 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61  ar.  The nRow va
9650: 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  lue will increas
9660: 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72  e as new trigger
9670: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
9680: 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  .  ** encountere
9690: 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c  d, but p->pc wil
96a0: 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74  l eventually cat
96b0: 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20  ch up to nRow.. 
96c0: 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e   */.  nRow = p->
96d0: 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78  nOp;.  if( p->ex
96e0: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
96f0: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d  /* The first 8 m
9700: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20  emory cells are 
9710: 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73  used for the res
9720: 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20  ult set.  So we 
9730: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d  will.    ** comm
9740: 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63  andeer the 9th c
9750: 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74  ell to use as st
9760: 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72  orage for an arr
9770: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20  ay of pointers. 
9780: 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72     ** to trigger
9790: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54   subprograms.  T
97a0: 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61  he VDBE is guara
97b0: 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74  nteed to have at
97c0: 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20   least 9.    ** 
97d0: 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61  cells.  */.    a
97e0: 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39  ssert( p->nMem>9
97f0: 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26   );.    pSub = &
9800: 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20  p->aMem[9];.    
9810: 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26  if( pSub->flags&
9820: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
9830: 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73    /* On the firs
9840: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
9850: 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77  3_step(), pSub w
9860: 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e  ill hold a NULL.
9870: 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a    It is.      **
9880: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
9890: 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34  a BLOB by the P4
98a0: 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63  _SUBPROGRAM proc
98b0: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c  essing logic bel
98c0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62  ow */.      nSub
98d0: 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f   = pSub->n/sizeo
98e0: 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20  f(Vdbe*);.      
98f0: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
9900: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
9910: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
9920: 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b  0; i<nSub; i++){
9930: 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61  .      nRow += a
9940: 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[i]->nOp;.  
9950: 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20    }.  }..  do{. 
9960: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
9970: 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77    }while( i<nRow
9980: 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   && p->explain==
9990: 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2 && p->aOp[i].o
99a0: 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69  pcode!=OP_Explai
99b0: 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52  n );.  if( i>=nR
99c0: 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ow ){.    p->rc 
99d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
99e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
99f0: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  E;.  }else if( d
9a00: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
9a10: 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ted ){.    p->rc
9a20: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
9a30: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  UPT;.    rc = SQ
9a40: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
9a50: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
9a60: 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
9a70: 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45  , "%s", sqlite3E
9a80: 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20  rrStr(p->rc));. 
9a90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
9aa0: 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70   *zP4;.    Op *p
9ab0: 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d  Op;.    if( i<p-
9ac0: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  >nOp ){.      /*
9ad0: 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65   The output line
9ae0: 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c   number is small
9af0: 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20   enough that we 
9b00: 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65  are still in the
9b10: 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70  .      ** main p
9b20: 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20  rogram. */.     
9b30: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
9b40: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
9b50: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75      /* We are cu
9b60: 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20  rrently listing 
9b70: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69  subprograms.  Fi
9b80: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f  gure out which o
9b90: 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ne and.      ** 
9ba0: 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70 72  pick up the appr
9bb0: 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20  opriate opcode. 
9bc0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  */.      int j;.
9bd0: 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f        i -= p->nO
9be0: 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  p;.      for(j=0
9bf0: 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e  ; i>=apSub[j]->n
9c00: 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; j++){.      
9c10: 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d    i -= apSub[j]-
9c20: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >nOp;.      }.  
9c30: 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62      pOp = &apSub
9c40: 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20  [j]->aOp[i];.   
9c50: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78   }.    if( p->ex
9c60: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
9c70: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
9c80: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
9c90: 4d 65 6d 2d 3e 6d 65 6d 54 79 70 65 20 3d 20 4d  Mem->memType = M
9ca0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d  EM_Int;.      pM
9cb0: 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20  em->u.i = i;    
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
9ce0: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a  rogram counter *
9cf0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  /.      pMem++;.
9d00: 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66    .      pMem->f
9d10: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69  lags = MEM_Stati
9d20: 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  c|MEM_Str|MEM_Te
9d30: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
9d40: 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  z = (char*)sqlit
9d50: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
9d60: 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70  ->opcode); /* Op
9d70: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  code */.      as
9d80: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
9d90: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
9da0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
9db0: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
9dc0: 20 20 20 20 70 4d 65 6d 2d 3e 6d 65 6d 54 79 70      pMem->memTyp
9dd0: 65 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20  e = MEM_Str;.   
9de0: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
9df0: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
9e00: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20    pMem++;..     
9e10: 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50   /* When an OP_P
9e20: 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73  rogram opcode is
9e30: 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20   encounter (the 
9e40: 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74  only opcode that
9e50: 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20   has.      ** a 
9e60: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72  P4_SUBPROGRAM ar
9e70: 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20  gument), expand 
9e80: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
9e90: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  array of subprog
9ea0: 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65  rams.      ** ke
9eb0: 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d  pt in p->aMem[9]
9ec0: 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  .z to hold the n
9ed0: 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73  ew program - ass
9ee0: 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72  uming this subpr
9ef0: 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68  ogram.      ** h
9f00: 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
9f10: 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20  een seen..      
9f20: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  */.      if( pOp
9f30: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
9f40: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
9f50: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
9f60: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
9f70: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
9f80: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
9f90: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
9fa0: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
9fb0: 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a       if( apSub[j
9fc0: 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67  ]==pOp->p4.pProg
9fd0: 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ram ) break;.   
9fe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
9ff0: 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51  f( j==nSub && SQ
a000: 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33  LITE_OK==sqlite3
a010: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62  VdbeMemGrow(pSub
a020: 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30  , nByte, nSub!=0
a030: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
a040: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
a050: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
a060: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e           apSub[n
a070: 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34  Sub++] = pOp->p4
a080: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
a090: 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73       pSub->flags
a0a0: 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20   |= MEM_Blob;.  
a0b0: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20          pSub->n 
a0c0: 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75  = nSub*sizeof(Su
a0d0: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
a0e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a0f0: 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66    }..    pMem->f
a100: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
a110: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
a120: 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20  pOp->p1;        
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a140: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70    /* P1 */.    p
a150: 4d 65 6d 2d 3e 6d 65 6d 54 79 70 65 20 3d 20 4d  Mem->memType = M
a160: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
a170: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  ++;..    pMem->f
a180: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
a190: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
a1a0: 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20  pOp->p2;        
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70    /* P2 */.    p
a1d0: 4d 65 6d 2d 3e 6d 65 6d 54 79 70 65 20 3d 20 4d  Mem->memType = M
a1e0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
a1f0: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  ++;..    pMem->f
a200: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
a210: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
a220: 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20  pOp->p3;        
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a240: 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70    /* P3 */.    p
a250: 4d 65 6d 2d 3e 6d 65 6d 54 79 70 65 20 3d 20 4d  Mem->memType = M
a260: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
a270: 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c  ++;..    if( sql
a280: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
a290: 70 4d 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20  pMem, 32, 0) ){ 
a2a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34             /* P4
a2b0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
a2c0: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
a2d0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
a2e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
a2f0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  OR;.    }.    pM
a300: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
a310: 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  Dyn|MEM_Str|MEM_
a320: 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20  Term;.    zP4 = 
a330: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70  displayP4(pOp, p
a340: 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20  Mem->z, 32);.   
a350: 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e   if( zP4!=pMem->
a360: 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  z ){.      sqlit
a370: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
a380: 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53  pMem, zP4, -1, S
a390: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a  QLITE_UTF8, 0);.
a3a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a3b0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
a3c0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65  !=0 );.      pMe
a3d0: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
a3e0: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
a3f0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
a400: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
a410: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e      }.    pMem->
a420: 6d 65 6d 54 79 70 65 20 3d 20 4d 45 4d 5f 53 74  memType = MEM_St
a430: 72 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  r;.    pMem++;..
a440: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
a450: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  in==1 ){.      i
a460: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
a470: 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20 30  mGrow(pMem, 4, 0
a480: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
a490: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
a4a0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
a4b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a4c0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
a4d0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
a4e0: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
a4f0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
a500: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32       pMem->n = 2
a510: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
a520: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
a530: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
a540: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
a550: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6d 65  /.      pMem->me
a560: 6d 54 79 70 65 20 3d 20 4d 45 4d 5f 53 74 72 3b  mType = MEM_Str;
a570: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
a580: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
a590: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
a5a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
a5b0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
a5c0: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28  MMENTS.      if(
a5d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
a5e0: 72 6f 77 28 70 4d 65 6d 2c 20 35 30 30 2c 20 30  row(pMem, 500, 0
a5f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
a600: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
a610: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
a620: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a630: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
a640: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
a650: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
a660: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
a670: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64       pMem->n = d
a680: 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f  isplayComment(pO
a690: 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c  p, zP4, pMem->z,
a6a0: 20 35 30 30 29 3b 0a 20 20 20 20 20 20 70 4d 65   500);.      pMe
a6b0: 6d 2d 3e 6d 65 6d 54 79 70 65 20 3d 20 4d 45 4d  m->memType = MEM
a6c0: 5f 53 74 72 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Str;.      pMem
a6d0: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
a6e0: 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  TF8;.#else.     
a6f0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
a700: 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  EM_Null;        
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a720: 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20  * Comment */.   
a730: 20 20 20 70 4d 65 6d 2d 3e 6d 65 6d 54 79 70 65     pMem->memType
a740: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 23 65 6e   = MEM_Null;.#en
a750: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  dif.    }..    p
a760: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
a770: 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 4*(p->explain
a780: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73  -1);.    p->pRes
a790: 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65  ultSet = &p->aMe
a7a0: 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20  m[1];.    p->rc 
a7b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
a7c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
a7d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
a7e0: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
a7f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
a800: 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  IN */..#ifdef SQ
a810: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
a820: 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74   Print the SQL t
a830: 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20  hat was used to 
a840: 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20  generate a VDBE 
a850: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
a860: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
a870: 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  tSql(Vdbe *p){. 
a880: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
a890: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71   0;.  if( p->zSq
a8a0: 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e  l ){.    z = p->
a8b0: 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  zSql;.  }else if
a8c0: 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20  ( p->nOp>=1 ){. 
a8d0: 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20     const VdbeOp 
a8e0: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30  *pOp = &p->aOp[0
a8f0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ];.    if( pOp->
a900: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20  opcode==OP_Init 
a910: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
a920: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70  ){.      z = pOp
a930: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68  ->p4.z;.      wh
a940: 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
a950: 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20  ace(*z) ) z++;. 
a960: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
a970: 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20   ) printf("SQL: 
a980: 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23  [%s]\n", z);.}.#
a990: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
a9a0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a9b0: 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65  TRACE) && define
a9c0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
a9d0: 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50  IOTRACE)./*.** P
a9e0: 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20  rint an IOTRACE 
a9f0: 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20  message showing 
aa00: 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  SQL content..*/.
aa10: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
aa20: 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20  IOTraceSql(Vdbe 
aa30: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
aa40: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
aa50: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71  p *pOp;.  if( sq
aa60: 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20  lite3IoTrace==0 
aa70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
aa80: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
aa90: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
aaa0: 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  0];.  if( pOp->o
aab0: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26  pcode==OP_Init &
aac0: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
aad0: 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  {.    int i, j;.
aae0: 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d      char z[1000]
aaf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
ab00: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
ab10: 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  , z, "%s", pOp->
ab20: 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69  p4.z);.    for(i
ab30: 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61  =0; sqlite3Isspa
ab40: 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ce(z[i]); i++){}
ab50: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b  .    for(j=0; z[
ab60: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
ab70: 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  if( sqlite3Isspa
ab80: 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20  ce(z[i]) ){.    
ab90: 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d      if( z[i-1]!=
aba0: 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ' ' ){.         
abb0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20   z[j++] = ' ';. 
abc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
abd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b  else{.        z[
abe0: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20  j++] = z[i];.   
abf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
ac00: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [j] = 0;.    sql
ac10: 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c  ite3IoTrace("SQL
ac20: 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a   %s\n", z);.  }.
ac30: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
ac40: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26  ITE_OMIT_TRACE &
ac50: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
ac60: 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  IOTRACE */../*.*
ac70: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
ac80: 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69   from a fixed si
ac90: 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20 72 65  ze buffer and re
aca0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
acb0: 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e  o.** that space.
acc0: 20 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e    If insufficien
acd0: 74 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c  t space is avail
ace0: 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c  able, return NUL
acf0: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75  L..**.** The pBu
ad00: 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  f parameter is t
ad10: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
ad20: 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68   of a pointer wh
ad30: 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65  ich will.** rece
ad40: 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f  ive the new memo
ad50: 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72  ry.  pBuf is nor
ad60: 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20  mally NULL.  If 
ad70: 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pBuf is not.** N
ad80: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
ad90: 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  at memory space 
ada0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
adb0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
adc0: 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hat.** this rout
add0: 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61  ine should not a
ade0: 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20  llocate any new 
adf0: 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42  memory.  When pB
ae00: 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c  uf is not.** NUL
ae10: 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  L simply return 
ae20: 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f  pBuf.  Only allo
ae30: 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20  cate new memory 
ae40: 73 70 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a  space when pBuf.
ae50: 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ** is NULL..**.*
ae60: 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e  * nByte is the n
ae70: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
ae80: 66 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a  f space needed..
ae90: 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f  **.** *ppFrom po
aea0: 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c  ints to availabl
aeb0: 65 20 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64  e space and pEnd
aec0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65   points to the e
aed0: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61  nd of the.** ava
aee0: 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57  ilable space.  W
aef0: 68 65 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c  hen space is all
af00: 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20  ocated, *ppFrom 
af10: 69 73 20 61 64 76 61 6e 63 65 64 20 70 61 73 74  is advanced past
af20: 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
af30: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  he allocated spa
af40: 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74  ce..**.** *pnByt
af50: 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f  e is a counter o
af60: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
af70: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  bytes of space t
af80: 68 61 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a  hat have failed.
af90: 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20  ** to allocate. 
afa0: 20 49 66 20 74 68 65 72 65 20 69 73 20 69 6e 73   If there is ins
afb0: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
afc0: 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61  in *ppFrom to sa
afd0: 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71  tisfy the.** req
afe0: 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65  uest, then incre
aff0: 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20  ment *pnByte by 
b000: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68  the amount of th
b010: 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74  e request..*/.st
b020: 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63  atic void *alloc
b030: 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70  Space(.  void *p
b040: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Buf,          /*
b050: 20 57 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f   Where return po
b060: 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74  inter will be st
b070: 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ored */.  int nB
b080: 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  yte,           /
b090: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
b0a0: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
b0b0: 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20  .  u8 **ppFrom, 
b0c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
b0d0: 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d  T: Allocate from
b0e0: 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38   *ppFrom */.  u8
b0f0: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
b100: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
b110: 20 31 20 62 79 74 65 20 70 61 73 74 20 74 68 65   1 byte past the
b120: 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20   end of *ppFrom 
b130: 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
b140: 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  *pnByte         
b150: 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f   /* If allocatio
b160: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65  n cannot be made
b170: 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42  , increment *pnB
b180: 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  yte */.){.  asse
b190: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
b1a0: 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d  LIGNMENT(*ppFrom
b1b0: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20  ) );.  if( pBuf 
b1c0: 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20  ) return pBuf;. 
b1d0: 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
b1e0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28  nByte);.  if( &(
b1f0: 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20  *ppFrom)[nByte] 
b200: 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70  <= pEnd ){.    p
b210: 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70  Buf = (void*)*pp
b220: 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f  From;.    *ppFro
b230: 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65  m += nByte;.  }e
b240: 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65  lse{.    *pnByte
b250: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20   += nByte;.  }. 
b260: 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a   return pBuf;.}.
b270: 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68  ./*.** Rewind th
b280: 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74  e VDBE back to t
b290: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20  he beginning in 
b2a0: 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a  preparation for.
b2b0: 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a  ** running it..*
b2c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
b2d0: 62 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70  beRewind(Vdbe *p
b2e0: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
b2f0: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
b300: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
b310: 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23  FILE).  int i;.#
b320: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
b330: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
b340: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
b350: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a  _MAGIC_INIT );..
b360: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
b370: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
b380: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
b390: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
b3a0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
b3b0: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
b3c0: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
b3d0: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
b3e0: 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67  ter. */.  p->mag
b3f0: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
b400: 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  RUN;..#ifdef SQL
b410: 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
b420: 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20  i=1; i<p->nMem; 
b430: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
b440: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d  ( p->aMem[i].db=
b450: 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65  =p->db );.  }.#e
b460: 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d  ndif.  p->pc = -
b470: 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  1;.  p->rc = SQL
b480: 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72  ITE_OK;.  p->err
b490: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
b4a0: 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ort;.  p->magic 
b4b0: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
b4c0: 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
b4d0: 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74   0;.  p->cacheCt
b4e0: 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57  r = 1;.  p->minW
b4f0: 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d  riteFileFormat =
b500: 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74   255;.  p->iStat
b510: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ement = 0;.  p->
b520: 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  nFkConstraint = 
b530: 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  0;.#ifdef VDBE_P
b540: 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30  ROFILE.  for(i=0
b550: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
b560: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  {.    p->aOp[i].
b570: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  cnt = 0;.    p->
b580: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
b590: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  0;.  }.#endif.}.
b5a0: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
b5b0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
b5c0: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66   for execution f
b5d0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  or the first tim
b5e0: 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74  e after.** creat
b5f0: 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20  ing the virtual 
b600: 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69  machine.  This i
b610: 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73  nvolves things s
b620: 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61  uch.** as alloca
b630: 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65  ting stack space
b640: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
b650: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
b660: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
b670: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
b680: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
b690: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
b6a0: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
b6b0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
b6c0: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
b6d0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b6e0: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78  may be called ex
b6f0: 61 63 74 20 6f 6e 63 65 20 6f 6e 20 61 20 65 61  act once on a ea
b700: 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ch virtual machi
b710: 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  ne..** After thi
b720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
b730: 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62  led the VM has b
b740: 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61  een "packaged" a
b750: 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74  nd is ready.** t
b760: 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68  o run.  After th
b770: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
b780: 6c 6c 65 64 2c 20 66 75 74 68 65 72 20 63 61 6c  lled, futher cal
b790: 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65  ls to .** sqlite
b7a0: 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e  3VdbeAddOp() fun
b7b0: 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69  ctions are prohi
b7c0: 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75  bited.  This rou
b7d0: 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73  tine disconnects
b7e0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f  .** the Vdbe fro
b7f0: 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  m the Parse obje
b800: 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20 67  ct that helped g
b810: 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74 68  enerate it so th
b820: 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64  at the.** the Vd
b830: 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e  be becomes an in
b840: 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79  dependent entity
b850: 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f   and the Parse o
b860: 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20  bject can be.** 
b870: 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a  destroyed..**.**
b880: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
b890: 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f  VdbeRewind() pro
b8a0: 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72  cedure to restor
b8b0: 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68  e a virtual mach
b8c0: 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69  ine back.** to i
b8d0: 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65  ts initial state
b8e0: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62 65   after it has be
b8f0: 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  en run..*/.void 
b900: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
b910: 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c  eady(.  Vdbe *p,
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
b940: 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  BE */.  Parse *p
b950: 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20 20  Parse           
b960: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
b970: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a  g context */.){.
b980: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9a0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
b9b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
b9c0: 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20   int nVar;      
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72  /* Number of par
b9f0: 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ameters */.  int
ba00: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ba20: 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f  umber of VM memo
ba30: 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  ry registers */.
ba40: 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20    int nCursor;  
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
ba70: 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a  rsors required *
ba80: 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20  /.  int nArg;   
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bab0: 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62  arguments in sub
bac0: 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e  programs */.  in
bad0: 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20  t nOnce;        
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
baf0: 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63  Number of OP_Onc
bb00: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a  e instructions *
bb10: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb30: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
bb40: 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72  er */.  u8 *zCsr
bb50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bb60: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
bb70: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
bb80: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  llocation */.  u
bb90: 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *zEnd;        
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bbb0: 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
bbc0: 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
bbd0: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  y */.  int nByte
bbe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bbf0: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63        /* How muc
bc00: 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69  h extra memory i
bc10: 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61  s needed */..  a
bc20: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
bc30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
bc40: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
bc50: 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73  Parse!=0 );.  as
bc60: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
bc70: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
bc80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
bc90: 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29  rse==p->pParse )
bca0: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
bcb0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
bcc0: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b  llocFailed==0 );
bcd0: 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65  .  nVar = pParse
bce0: 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d  ->nVar;.  nMem =
bcf0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
bd00: 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73   nCursor = pPars
bd10: 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20  e->nTab;.  nArg 
bd20: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72  = pParse->nMaxAr
bd30: 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61  g;.  nOnce = pPa
bd40: 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66  rse->nOnce;.  if
bd50: 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e  ( nOnce==0 ) nOn
bd60: 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72  ce = 1; /* Ensur
bd70: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62  e at least one b
bd80: 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46  yte in p->aOnceF
bd90: 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a  lag[] */.  .  /*
bda0: 20 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72   For each cursor
bdb0: 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20   required, also 
bdc0: 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72  allocate a memor
bdd0: 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20  y cell. Memory. 
bde0: 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b   ** cells (nMem+
bdf0: 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d  1-nCursor)..nMem
be00: 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c  , inclusive, wil
be10: 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  l never be used 
be20: 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65  by.  ** the vdbe
be30: 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61   program. Instea
be40: 64 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20  d they are used 
be50: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  to allocate spac
be60: 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43  e for.  ** VdbeC
be70: 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73  ursor/BtCursor s
be80: 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62  tructures. The b
be90: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
bea0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20  sociated with . 
beb0: 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20   ** cursor 0 is 
bec0: 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
bed0: 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f   cell nMem. Memo
bee0: 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29  ry cell (nMem-1)
bef0: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
bf00: 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
bf10: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
bf20: 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20  cursor 1, etc.. 
bf30: 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73   **.  ** See als
bf40: 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f  o: allocateCurso
bf50: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d  r()..  */.  nMem
bf60: 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20   += nCursor;..  
bf70: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
bf80: 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67  e for memory reg
bf90: 69 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69  isters, SQL vari
bfa0: 61 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73  ables, VDBE curs
bfb0: 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e  ors and .  ** an
bfc0: 20 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61   array to marsha
bfd0: 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61  l SQL function a
bfe0: 72 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a  rguments in..  *
bff0: 2f 0a 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29  /.  zCsr = (u8*)
c000: 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b  &p->aOp[p->nOp];
c010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
c020: 65 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20  emory avaliable 
c030: 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a  for allocation *
c040: 2f 0a 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a 29  /.  zEnd = (u8*)
c050: 26 70 2d 3e 61 4f 70 5b 70 50 61 72 73 65 2d 3e  &p->aOp[pParse->
c060: 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46  nOpAlloc];  /* F
c070: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 65  irst byte past e
c080: 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a  nd of zCsr[] */.
c090: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
c0a0: 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20  es(p, &nArg);.  
c0b0: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
c0c0: 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73 65  al = (u8)(pParse
c0d0: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26  ->isMultiWrite &
c0e0: 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f  & pParse->mayAbo
c0f0: 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  rt);.  if( pPars
c100: 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d  e->explain && nM
c110: 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65  em<10 ){.    nMe
c120: 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d 65  m = 10;.  }.  me
c130: 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45  mset(zCsr, 0, zE
c140: 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73 72  nd-zCsr);.  zCsr
c150: 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75 38 2a   += (zCsr - (u8*
c160: 29 30 29 26 37 3b 0a 20 20 61 73 73 65 72 74 28  )0)&7;.  assert(
c170: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
c180: 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20  NMENT(zCsr) );. 
c190: 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b   p->expired = 0;
c1a0: 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f  ..  /* Memory fo
c1b0: 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72  r registers, par
c1c0: 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c  ameters, cursor,
c1d0: 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74   etc, is allocat
c1e0: 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70  ed in two.  ** p
c1f0: 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66  asses.  On the f
c200: 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74 72  irst pass, we tr
c210: 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65  y to reuse unuse
c220: 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20 0a  d space at the .
c230: 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
c240: 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49  opcode array.  I
c250: 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
c260: 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d  to satisfy all m
c270: 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69  emory.  ** requi
c280: 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69  rements by reusi
c290: 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  ng the opcode ar
c2a0: 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74  ray tail, then t
c2b0: 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70  he second.  ** p
c2c0: 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e  ass will fill in
c2d0: 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67 20   the rest using 
c2e0: 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69  a fresh allocati
c2f0: 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  on.  .  **.  ** 
c300: 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70  This two-pass ap
c310: 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75 73  proach that reus
c320: 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  es as much memor
c330: 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  y as possible fr
c340: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74  om.  ** the left
c350: 6f 76 65 72 20 73 70 61 63 65 20 61 74 20 74 68  over space at th
c360: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  e end of the opc
c370: 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20 73 69  ode array can si
c380: 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a  gnificantly.  **
c390: 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75   reduce the amou
c3a0: 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c  nt of memory hel
c3b0: 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20  d by a prepared 
c3c0: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
c3d0: 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65    do {.    nByte
c3e0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65   = 0;.    p->aMe
c3f0: 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  m = allocSpace(p
c400: 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a  ->aMem, nMem*siz
c410: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
c420: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
c430: 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c      p->aVar = al
c440: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72  locSpace(p->aVar
c450: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65  , nVar*sizeof(Me
c460: 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  m), &zCsr, zEnd,
c470: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
c480: 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70  >apArg = allocSp
c490: 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41  ace(p->apArg, nA
c4a0: 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c  rg*sizeof(Mem*),
c4b0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
c4c0: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a  Byte);.    p->az
c4d0: 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Var = allocSpace
c4e0: 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a  (p->azVar, nVar*
c4f0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26  sizeof(char*), &
c500: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
c510: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73  te);.    p->apCs
c520: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
c530: 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72  ->apCsr, nCursor
c540: 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73  *sizeof(VdbeCurs
c550: 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or*),.          
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c570: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
c580: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e  yte);.    p->aOn
c590: 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 70  ceFlag = allocSp
c5a0: 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67  ace(p->aOnceFlag
c5b0: 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c 20  , nOnce, &zCsr, 
c5c0: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
c5d0: 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a     if( nByte ){.
c5e0: 20 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d        p->pFree =
c5f0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
c600: 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b  Zero(db, nByte);
c610: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 73 72 20  .    }.    zCsr 
c620: 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20  = p->pFree;.    
c630: 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79  zEnd = &zCsr[nBy
c640: 74 65 5d 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e  te];.  }while( n
c650: 42 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c  Byte && !db->mal
c660: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
c670: 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75  p->nCursor = nCu
c680: 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65  rsor;.  p->nOnce
c690: 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20  Flag = nOnce;.  
c6a0: 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20  if( p->aVar ){. 
c6b0: 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e     p->nVar = (yn
c6c0: 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 66 6f  Var)nVar;.    fo
c6d0: 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e  r(n=0; n<nVar; n
c6e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 56  ++){.      p->aV
c6f0: 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  ar[n].flags = ME
c700: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d  M_Null;.      p-
c710: 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aVar[n].db = db
c720: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
c730: 28 20 70 2d 3e 61 7a 56 61 72 20 29 7b 0a 20 20  ( p->azVar ){.  
c740: 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61    p->nzVar = pPa
c750: 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20  rse->nzVar;.    
c760: 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c  memcpy(p->azVar,
c770: 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20   pParse->azVar, 
c780: 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28  p->nzVar*sizeof(
c790: 70 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20  p->azVar[0]));. 
c7a0: 20 20 20 6d 65 6d 73 65 74 28 70 50 61 72 73 65     memset(pParse
c7b0: 2d 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50 61 72  ->azVar, 0, pPar
c7c0: 73 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66  se->nzVar*sizeof
c7d0: 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30  (pParse->azVar[0
c7e0: 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ]));.  }.  if( p
c7f0: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d  ->aMem ){.    p-
c800: 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20  >aMem--;        
c810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c820: 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f   aMem[] goes fro
c830: 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20  m 1..nMem */.   
c840: 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b   p->nMem = nMem;
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c860: 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72   /*       not fr
c870: 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a  om 0..nMem-1 */.
c880: 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d      for(n=1; n<=
c890: 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nMem; n++){.    
c8a0: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61    p->aMem[n].fla
c8b0: 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e  gs = MEM_Undefin
c8c0: 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65  ed;.      p->aMe
c8d0: 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  m[n].db = db;.  
c8e0: 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70    }.  }.  p->exp
c8f0: 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65  lain = pParse->e
c900: 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65  xplain;.  sqlite
c910: 33 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a  3VdbeRewind(p);.
c920: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
c930: 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64   VDBE cursor and
c940: 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   release all the
c950: 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20   resources that 
c960: 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65  cursor .** happe
c970: 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ns to hold..*/.v
c980: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
c990: 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a  reeCursor(Vdbe *
c9a0: 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  p, VdbeCursor *p
c9b0: 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d  Cx){.  if( pCx==
c9c0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
c9d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
c9e0: 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d  beSorterClose(p-
c9f0: 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 69 66 28  >db, pCx);.  if(
ca00: 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20   pCx->pBt ){.   
ca10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
ca20: 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20  se(pCx->pBt);.  
ca30: 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43    /* The pCx->pC
ca40: 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c  ursor will be cl
ca50: 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ose automaticall
ca60: 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c  y, if it exists,
ca70: 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   by.    ** the c
ca80: 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20  all above. */.  
ca90: 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70  }else if( pCx->p
caa0: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71  Cursor ){.    sq
cab0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
cac0: 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73  ursor(pCx->pCurs
cad0: 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  or);.  }.#ifndef
cae0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
caf0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
cb00: 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  pCx->pVtabCursor
cb10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
cb20: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
cb30: 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e  abCursor = pCx->
cb40: 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20  pVtabCursor;.   
cb50: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
cb60: 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d  odule *pModule =
cb70: 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56   pVtabCursor->pV
cb80: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  tab->pModule;.  
cb90: 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f    p->inVtabMetho
cba0: 64 20 3d 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75  d = 1;.    pModu
cbb0: 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62  le->xClose(pVtab
cbc0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e  Cursor);.    p->
cbd0: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30  inVtabMethod = 0
cbe0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
cbf0: 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76  /*.** Copy the v
cc00: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
cc10: 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74  the VdbeFrame st
cc20: 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56  ructure to its V
cc30: 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  dbe. This.** is 
cc40: 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  used, for exampl
cc50: 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65  e, when a trigge
cc60: 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73  r sub-program is
cc70: 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f   halted to resto
cc80: 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f  re.** control to
cc90: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
cca0: 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  m..*/.int sqlite
ccb0: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
ccc0: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72  e(VdbeFrame *pFr
ccd0: 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ame){.  Vdbe *v 
cce0: 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76  = pFrame->v;.  v
ccf0: 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46  ->aOnceFlag = pF
cd00: 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b  rame->aOnceFlag;
cd10: 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20  .  v->nOnceFlag 
cd20: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46  = pFrame->nOnceF
cd30: 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20  lag;.  v->aOp = 
cd40: 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76  pFrame->aOp;.  v
cd50: 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e  ->nOp = pFrame->
cd60: 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d  nOp;.  v->aMem =
cd70: 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20   pFrame->aMem;. 
cd80: 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d   v->nMem = pFram
cd90: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70  e->nMem;.  v->ap
cda0: 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70  Csr = pFrame->ap
cdb0: 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f  Csr;.  v->nCurso
cdc0: 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72  r = pFrame->nCur
cdd0: 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61  sor;.  v->db->la
cde0: 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65  stRowid = pFrame
cdf0: 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76  ->lastRowid;.  v
ce00: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61  ->nChange = pFra
ce10: 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72  me->nChange;.  r
ce20: 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63  eturn pFrame->pc
ce30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
ce40: 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a   all cursors..**
ce50: 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65  .** Also release
ce60: 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d   any dynamic mem
ce70: 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20  ory held by the 
ce80: 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61  VM in the Vdbe.a
ce90: 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63  Mem memory .** c
cea0: 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20  ell array. This 
ceb0: 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  is necessary as 
cec0: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
ced0: 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69  array may contai
cee0: 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f  n.** pointers to
cef0: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
cf00: 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e  ts, which may in
cf10: 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f   turn contain po
cf20: 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65  inters to.** ope
cf30: 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74  n cursors..*/.st
cf40: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41  atic void closeA
cf50: 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a  llCursors(Vdbe *
cf60: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72  p){.  if( p->pFr
cf70: 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
cf80: 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20  rame *pFrame;.  
cf90: 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e    for(pFrame=p->
cfa0: 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e  pFrame; pFrame->
cfb0: 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d  pParent; pFrame=
cfc0: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29  pFrame->pParent)
cfd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
cfe0: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46  eFrameRestore(pF
cff0: 72 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rame);.  }.  p->
d000: 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d  pFrame = 0;.  p-
d010: 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20  >nFrame = 0;..  
d020: 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a  if( p->apCsr ){.
d030: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
d040: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
d050: 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rsor; i++){.    
d060: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
d070: 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a   = p->apCsr[i];.
d080: 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a        if( pC ){.
d090: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d0a0: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c  dbeFreeCursor(p,
d0b0: 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d   pC);.        p-
d0c0: 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20  >apCsr[i] = 0;. 
d0d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d0e0: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
d0f0: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
d100: 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31  Array(&p->aMem[1
d110: 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d  ], p->nMem);.  }
d120: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65  .  while( p->pDe
d130: 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  lFrame ){.    Vd
d140: 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20  beFrame *pDel = 
d150: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20  p->pDelFrame;.  
d160: 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d    p->pDelFrame =
d170: 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a   pDel->pParent;.
d180: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
d190: 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29  rameDelete(pDel)
d1a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
d1b0: 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61  te any auxdata a
d1c0: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20  llocations made 
d1d0: 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 73  by the VM */.  s
d1e0: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
d1f0: 41 75 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30  AuxData(p, -1, 0
d200: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
d210: 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d  pAuxData==0 );.}
d220: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
d230: 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65 78   the VM after ex
d240: 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ecution..**.** T
d250: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
d260: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
d270: 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73  lose any cursors
d280: 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a  , lists, and/or.
d290: 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74 20  ** sorters that 
d2a0: 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20  were left open. 
d2b0: 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73   It also deletes
d2c0: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a   the values of.*
d2d0: 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74  * variables in t
d2e0: 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e  he aVar[] array.
d2f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d300: 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29  Cleanup(Vdbe *p)
d310: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
d320: 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66  = p->db;..#ifdef
d330: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
d340: 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72  /* Execute asser
d350: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
d360: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
d370: 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61  e Vdbe.apCsr[] a
d380: 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d  nd .  ** Vdbe.aM
d390: 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65  em[] arrays have
d3a0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c   already been cl
d3b0: 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20  eaned up.  */.  
d3c0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e  int i;.  if( p->
d3d0: 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b  apCsr ) for(i=0;
d3e0: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
d3f0: 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
d400: 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20  pCsr[i]==0 );.  
d410: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
d420: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70     for(i=1; i<=p
d430: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73  ->nMem; i++) ass
d440: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  ert( p->aMem[i].
d450: 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66  flags==MEM_Undef
d460: 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ined );.  }.#end
d470: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  if..  sqlite3DbF
d480: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
d490: 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
d4a0: 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73  g = 0;.  p->pRes
d4b0: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  ultSet = 0;.}../
d4c0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d  *.** Set the num
d4d0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
d4e0: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
d4f0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
d500: 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65  his SQL.** state
d510: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  ment. This is no
d520: 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  w set at compile
d530: 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68   time, rather th
d540: 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65  an during.** exe
d550: 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64  cution of the vd
d560: 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68  be program so th
d570: 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  at sqlite3_colum
d580: 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a  n_count() can.**
d590: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   be called on an
d5a0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
d5b0: 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74  efore sqlite3_st
d5c0: 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ep()..*/.void sq
d5d0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
d5e0: 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ols(Vdbe *p, int
d5f0: 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20   nResColumn){.  
d600: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
d610: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
d620: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
d630: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
d640: 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
d650: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
d660: 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74  NAME_N);.  sqlit
d670: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
d680: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d  aColName);.  n =
d690: 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e   nResColumn*COLN
d6a0: 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73  AME_N;.  p->nRes
d6b0: 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52  Column = (u16)nR
d6c0: 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61  esColumn;.  p->a
d6d0: 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61  ColName = pColNa
d6e0: 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74  me = (Mem*)sqlit
d6f0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
d700: 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e  b, sizeof(Mem)*n
d710: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f   );.  if( p->aCo
d720: 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  lName==0 ) retur
d730: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  n;.  while( n-- 
d740: 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e  > 0 ){.    pColN
d750: 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  ame->flags = MEM
d760: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e  _Null;.    pColN
d770: 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  ame->db = p->db;
d780: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b  .    pColName++;
d790: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
d7a0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
d7b0: 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20  e idx'th column 
d7c0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
d7d0: 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  y the SQL statem
d7e0: 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75  ent..** zName mu
d7f0: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
d800: 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61  to a nul termina
d810: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ted string..**.*
d820: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  * This call must
d830: 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61   be made after a
d840: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
d850: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29  VdbeSetNumCols()
d860: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61  ..**.** The fina
d870: 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65  l parameter, xDe
d880: 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  l, must be one o
d890: 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  f SQLITE_DYNAMIC
d8a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a  , SQLITE_STATIC.
d8b0: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41  ** or SQLITE_TRA
d8c0: 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73  NSIENT. If it is
d8d0: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
d8e0: 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72   then the buffer
d8f0: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
d900: 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20  y zName will be 
d910: 66 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33  freed by sqlite3
d920: 44 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68  DbFree() when th
d930: 65 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f  e vdbe is destro
d940: 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  yed..*/.int sqli
d950: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d960: 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  e(.  Vdbe *p,   
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65        /* Vdbe be
d990: 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a  ing configured *
d9a0: 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20  /.  int idx,    
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9c0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
d9d0: 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70   column zName ap
d9e0: 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  plies to */.  in
d9f0: 74 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20  t var,          
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
da10: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c  * One of the COL
da20: 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73  NAME_* constants
da30: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
da40: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
da50: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
da60: 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
da70: 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20  aining name */. 
da80: 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
da90: 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  id*)            
daa0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61    /* Memory mana
dab0: 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20  gement strategy 
dac0: 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  for zName */.){.
dad0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20    int rc;.  Mem 
dae0: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73  *pColName;.  ass
daf0: 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73  ert( idx<p->nRes
db00: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65  Column );.  asse
db10: 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f  rt( var<COLNAME_
db20: 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  N );.  if( p->db
db30: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
db40: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a  {.    assert( !z
db50: 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51  Name || xDel!=SQ
db60: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a  LITE_DYNAMIC );.
db70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
db80: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61  E_NOMEM;.  }.  a
db90: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61  ssert( p->aColNa
dba0: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e  me!=0 );.  pColN
dbb0: 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e  ame = &(p->aColN
dbc0: 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e  ame[idx+var*p->n
dbd0: 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72  ResColumn]);.  r
dbe0: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
dbf0: 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d  emSetStr(pColNam
dc00: 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  e, zName, -1, SQ
dc10: 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29  LITE_UTF8, xDel)
dc20: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
dc30: 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28  0 || !zName || (
dc40: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26  pColName->flags&
dc50: 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a  MEM_Term)!=0 );.
dc60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
dc70: 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20  /*.** A read or 
dc80: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
dc90: 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  n may or may not
dca0: 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61   be active on da
dcb0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
dcc0: 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61   db. If a transa
dcd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c  ction is active,
dce0: 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74   commit it. If t
dcf0: 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69  here is a.** wri
dd00: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  te-transaction s
dd10: 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61  panning more tha
dd20: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
dd30: 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ile, this routin
dd40: 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20  e.** takes care 
dd50: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
dd60: 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a  urnal trickery..
dd70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
dd80: 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33  beCommit(sqlite3
dd90: 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
dda0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
ddb0: 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e  Trans = 0;  /* N
ddc0: 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73  umber of databas
ddd0: 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76  es with an activ
dde0: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
ddf0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ion */.  int rc 
de00: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
de10: 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d  nt needXcommit =
de20: 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   0;..#ifdef SQLI
de30: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
de40: 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74  ABLE.  /* With t
de50: 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69  his option, sqli
de60: 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73  te3VtabSync() is
de70: 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73   defined to be s
de80: 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49  imply .  ** SQLI
de90: 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f  TE_OK so p is no
dea0: 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20  t used. .  */.  
deb0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
dec0: 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  (p);.#endif..  /
ded0: 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
dee0: 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61  nything else, ca
def0: 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63  ll the xSync() c
df00: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a  allback for any.
df10: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64    ** virtual mod
df20: 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74  ule tables writt
df30: 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73  en in this trans
df40: 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73  action. This has
df50: 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65   to.  ** be done
df60: 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e   before determin
df70: 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61  ing whether a ma
df80: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
df90: 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69  e is .  ** requi
dfa0: 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63  red, as an xSync
dfb0: 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20  () callback may 
dfc0: 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20  add an attached 
dfd0: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f  database.  ** to
dfe0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
dff0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
e000: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62  lite3VtabSync(db
e010: 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  , p);..  /* This
e020: 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73   loop determines
e030: 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d   (a) if the comm
e040: 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62  it hook should b
e050: 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20  e invoked and.  
e060: 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20  ** (b) how many 
e070: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68  database files h
e080: 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74  ave open write t
e090: 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74  ransactions, not
e0a0: 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67   .  ** including
e0b0: 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
e0c0: 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72  se. (b) is impor
e0d0: 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20  tant because if 
e0e0: 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20  more than .  ** 
e0f0: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
e100: 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72  e has an open wr
e110: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
e120: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
e130: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72  l.  ** file is r
e140: 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61  equired for an a
e150: 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20  tomic commit..  
e160: 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  */ .  for(i=0; r
e170: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e180: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
e190: 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
e1a0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
e1b0: 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
e1c0: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
e1d0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
e1e0: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a  eedXcommit = 1;.
e1f0: 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29        if( i!=1 )
e200: 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20   nTrans++;.     
e210: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
e220: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  er(pBt);.      r
e230: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
e240: 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71  ExclusiveLock(sq
e250: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
e260: 70 42 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  pBt));.      sql
e270: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
e280: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Bt);.    }.  }. 
e290: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e2a0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
e2b0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
e2c0: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
e2d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
e2e0: 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b  ns at all, invok
e2f0: 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  e the commit hoo
e300: 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58  k */.  if( needX
e310: 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43  commit && db->xC
e320: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b  ommitCallback ){
e330: 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43  .    rc = db->xC
e340: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62  ommitCallback(db
e350: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20  ->pCommitArg);. 
e360: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
e370: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e380: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
e390: 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITHOOK;.    }.  
e3a0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
e3b0: 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
e3c0: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
e3d0: 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
e3e0: 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
e3f0: 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
e400: 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
e410: 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
e420: 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
e430: 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
e440: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
e450: 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
e460: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
e470: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
e480: 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
e490: 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
e4a0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
e4b0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
e4c0: 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65  :memory: or a te
e4d0: 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20  mp file.  In .  
e4e0: 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20  ** that case we 
e4f0: 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
e500: 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
e510: 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
e520: 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c   the .  ** simpl
e530: 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e  e case then too.
e540: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
e550: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
e560: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
e570: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
e580: 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54  ].pBt)).   || nT
e590: 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20  rans<=1.  ){.   
e5a0: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
e5b0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
e5c0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
e5d0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
e5e0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
e5f0: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
e600: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
e610: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
e620: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b  haseOne(pBt, 0);
e630: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
e640: 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
e650: 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
e660: 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
e670: 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65  ssfully complete
e680: 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a   phase 1. .    *
e690: 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * If one of the 
e6a0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
e6b0: 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c  One() calls fail
e6c0: 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  s, this indicate
e6d0: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65  s an.    ** IO e
e6e0: 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74  rror while delet
e6f0: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
e700: 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  g a journal file
e710: 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79  . It is unlikely
e720: 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75  ,.    ** but cou
e730: 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68  ld happen. In th
e740: 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20  is case abandon 
e750: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
e760: 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e  eturn the error.
e770: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
e780: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
e790: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
e7a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
e7b0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
e7c0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
e7d0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
e7e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
e7f0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
e800: 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  wo(pBt, 0);.    
e810: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
e820: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e830: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e840: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
e850: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e860: 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65  The complex case
e870: 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75   - There is a mu
e880: 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74  lti-file write-t
e890: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
e8a0: 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71  e..  ** This req
e8b0: 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a  uires a master j
e8c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
e8d0: 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61  nsure the transa
e8e0: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ction is.  ** co
e8f0: 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79  mmitted atomicly
e900: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
e910: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
e920: 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71  O.  else{.    sq
e930: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
e940: 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20  = db->pVfs;.    
e950: 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
e960: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
e970: 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69  ter = 0;   /* Fi
e980: 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le-name for the 
e990: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a  master journal *
e9a0: 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
e9b0: 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71   *zMainFile = sq
e9c0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
e9d0: 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
e9e0: 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  .pBt);.    sqlit
e9f0: 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
ea00: 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66   = 0;.    i64 of
ea10: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  fset = 0;.    in
ea20: 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72  t res;.    int r
ea30: 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20  etryCount = 0;. 
ea40: 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65     int nMainFile
ea50: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  ;..    /* Select
ea60: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
ea70: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20  l file name */. 
ea80: 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73     nMainFile = s
ea90: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
eaa0: 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a  MainFile);.    z
eab0: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
eac0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d  MPrintf(db, "%s-
ead0: 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a  mjXXXXXX9XXz", z
eae0: 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69  MainFile);.    i
eaf0: 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20  f( zMaster==0 ) 
eb00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
eb10: 4d 45 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  MEM;.    do {.  
eb20: 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b      u32 iRandom;
eb30: 0a 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79  .      if( retry
eb40: 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  Count ){.       
eb50: 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e   if( retryCount>
eb60: 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  100 ){.         
eb70: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
eb80: 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65  ITE_FULL, "MJ de
eb90: 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74  lete: %s", zMast
eba0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
ebb0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
ebc0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
ebd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
ebe0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
ebf0: 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d   if( retryCount=
ec00: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
ec10: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
ec20: 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c  TE_FULL, "MJ col
ec30: 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74  lide: %s", zMast
ec40: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
ec50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
ec60: 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20  ryCount++;.     
ec70: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
ec80: 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64  ess(sizeof(iRand
ec90: 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a  om), &iRandom);.
eca0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
ecb0: 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73  printf(13, &zMas
ecc0: 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20  ter[nMainFile], 
ecd0: 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a  "-mj%06X9%02X",.
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
ed00: 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66  iRandom>>8)&0xff
ed10: 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78  ffff, iRandom&0x
ed20: 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ff);.      /* Th
ed30: 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74  e antipenultimat
ed40: 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  e character of t
ed50: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ed60: 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20  l name must.    
ed70: 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61    ** be "9" to a
ed80: 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73  void name collis
ed90: 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20  ions when using 
eda0: 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a  8+3 filenames. *
edb0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
edc0: 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53  zMaster[sqlite3S
edd0: 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29  trlen30(zMaster)
ede0: 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20  -3]=='9' );.    
edf0: 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
ee00: 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20  fix3(zMainFile, 
ee10: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
ee20: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
ee30: 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
ee40: 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
ee50: 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
ee60: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
ee70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65  =SQLITE_OK && re
ee80: 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  s );.    if( rc=
ee90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
eea0: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
eeb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
eec0: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
eed0: 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f  lite3OsOpenMallo
eee0: 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  c(pVfs, zMaster,
eef0: 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20   &pMaster, .    
ef00: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
ef10: 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
ef20: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
ef30: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
ef40: 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
ef50: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
ef60: 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20  ER_JOURNAL, 0.  
ef70: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
ef80: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ef90: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
efa0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
efb0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
efc0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
efd0: 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
efe0: 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64  e name of each d
eff0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
f000: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
f010: 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
f020: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
f030: 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65  al file. If an e
f040: 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74  rror occurs at t
f050: 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a  his point close.
f060: 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74      ** and delet
f070: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
f080: 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74  rnal file. All t
f090: 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  he individual jo
f0a0: 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20  urnal files.    
f0b0: 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e  ** still have 'n
f0c0: 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74  ull' as the mast
f0d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
f0e0: 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c  er, so they will
f0f0: 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63   roll.    ** bac
f100: 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
f110: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
f120: 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  urs..    */.    
f130: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
f140: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
f150: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
f160: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
f170: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
f180: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
f190: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
f1a0: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
f1b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
f1c0: 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
f1d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
f1e0: 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
f1f0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
f200: 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e  * Ignore TEMP an
f210: 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62  d :memory: datab
f220: 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ases */.        
f230: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
f240: 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b  ( zFile[0]!=0 );
f250: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65  .        if( !ne
f260: 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74  edSync && !sqlit
f270: 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62  e3BtreeSyncDisab
f280: 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20  led(pBt) ){.    
f290: 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
f2a0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
f2b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f2c0: 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65  e3OsWrite(pMaste
f2d0: 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65  r, zFile, sqlite
f2e0: 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
f2f0: 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  +1, offset);.   
f300: 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73       offset += s
f310: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
f320: 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20  File)+1;.       
f330: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f340: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
f350: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
f360: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
f370: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
f380: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
f390: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
f3a0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
f3b0: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
f3c0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f3d0: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
f3e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
f3f0: 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61    /* Sync the ma
f400: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f410: 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f  e. If the IOCAP_
f420: 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63  SEQUENTIAL devic
f430: 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73  e.    ** flag is
f440: 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74   set this is not
f450: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
f460: 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79  /.    if( needSy
f470: 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  nc .     && 0==(
f480: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
f490: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
f4a0: 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49  Master)&SQLITE_I
f4b0: 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
f4c0: 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f  .     && SQLITE_
f4d0: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
f4e0: 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c  3OsSync(pMaster,
f4f0: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
f500: 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  MAL)).    ){.   
f510: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
f520: 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
f530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
f540: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
f550: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ter, 0);.      s
f560: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
f570: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
f580: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f590: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61  }..    /* Sync a
f5a0: 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20  ll the db files 
f5b0: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
f5c0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
f5d0: 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a   same call.    *
f5e0: 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65  * sets the maste
f5f0: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
f600: 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69  r in each indivi
f610: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  dual journal. If
f620: 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
f630: 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f   occurs here, do
f640: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
f650: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
f660: 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
f670: 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
f680: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
f690: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a  e first call to.
f6a0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
f6b0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
f6c0: 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20  e(), then there 
f6d0: 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74  is a chance that
f6e0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74   the.    ** mast
f6f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
f700: 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64  will be orphaned
f710: 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20  . But we cannot 
f720: 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a  delete it,.    *
f730: 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61  * in case the ma
f740: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f750: 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74  e name was writt
f760: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
f770: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
f780: 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75  before the failu
f790: 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20  re occurred..   
f7a0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
f7b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
f7c0: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
f7d0: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
f7e0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
f7f0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
f800: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
f810: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
f820: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
f830: 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  pBt, zMaster);. 
f840: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f850: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
f860: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
f870: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
f880: 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20  LITE_BUSY );.   
f890: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f8a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
f8b0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
f8c0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
f8d0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
f8e0: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
f8f0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
f900: 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d   file. This comm
f910: 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  its the transact
f920: 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a  ion. After.    *
f930: 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65  * doing this the
f940: 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79   directory is sy
f950: 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72  nced again befor
f960: 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c  e any individual
f970: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
f980: 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65  ion files are de
f990: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
f9a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f9b0: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
f9c0: 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71  ster, 1);.    sq
f9d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f9e0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
f9f0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
fa00: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
fa10: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
fa20: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65  .    /* All file
fa30: 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65  s and directorie
fa40: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
fa50: 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74  een synced, so t
fa60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
fa70: 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
fa80: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
fa90: 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e  haseTwo() are on
faa0: 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73  ly closing files
fab0: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65   and.    ** dele
fac0: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
fad0: 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20  ng journals. If 
fae0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
faf0: 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a  rong while.    *
fb00: 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
fb10: 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61  ing we don't rea
fb20: 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e  lly care. The in
fb30: 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20  tegrity of the. 
fb40: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
fb50: 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61  n is already gua
fb60: 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d  ranteed, but som
fb70: 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a  e stray 'cold' j
fb80: 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d  ournals.    ** m
fb90: 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75  ay be lying arou
fba0: 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  nd. Returning an
fbb0: 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27   error code won'
fbc0: 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a  t help matters..
fbd0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62      */.    disab
fbe0: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
fbf0: 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71  errors();.    sq
fc00: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
fc10: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f  Malloc();.    fo
fc20: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
fc30: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
fc40: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
fc50: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
fc60: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
fc70: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
fc80: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
fc90: 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  pBt, 1);.      }
fca0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
fcb0: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
fcc0: 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f  c();.    enable_
fcd0: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
fce0: 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69  ors();..    sqli
fcf0: 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
fd00: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
fd10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
fd20: 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
fd30: 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  ne checks that t
fd40: 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65  he sqlite3.nVdbe
fd50: 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72  Active count var
fd60: 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73  iable.** matches
fd70: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
fd80: 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73  dbe's in the lis
fd90: 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20  t sqlite3.pVdbe 
fda0: 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72  that are.** curr
fdb0: 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e  ently active. An
fdc0: 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73   assertion fails
fdd0: 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e   if the two coun
fde0: 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e  ts do not match.
fdf0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69  .** This is an i
fe00: 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65  nternal self-che
fe10: 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20  ck only - it is 
fe20: 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c  not an essential
fe30: 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73   processing.** s
fe40: 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tep..**.** This 
fe50: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44  is a no-op if ND
fe60: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e  EBUG is defined.
fe70: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
fe80: 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  UG.static void c
fe90: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
fea0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
feb0: 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74    Vdbe *p;.  int
fec0: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
fed0: 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e  nWrite = 0;.  in
fee0: 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70  t nRead = 0;.  p
fef0: 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20   = db->pVdbe;.  
ff00: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
ff10: 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
ff20: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20  BE_MAGIC_RUN && 
ff30: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
ff40: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69    cnt++;.      i
ff50: 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  f( p->readOnly==
ff60: 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20  0 ) nWrite++;.  
ff70: 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65      if( p->bIsRe
ff80: 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a  ader ) nRead++;.
ff90: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d      }.    p = p-
ffa0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73  >pNext;.  }.  as
ffb0: 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e  sert( cnt==db->n
ffc0: 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20  VdbeActive );.  
ffd0: 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d  assert( nWrite==
ffe0: 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29  db->nVdbeWrite )
fff0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 61  ;.  assert( nRea
10000 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  d==db->nVdbeRead
10010 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66   );.}.#else.#def
10020 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56  ine checkActiveV
10030 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66  dbeCnt(x).#endif
10040 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56  ../*.** If the V
10050 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
10060 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
10070 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d   opened a statem
10080 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent-transaction,
10090 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77  .** close it now
100a0 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d  . Argument eOp m
100b0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41  ust be either SA
100c0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
100d0 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   or.** SAVEPOINT
100e0 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20  _RELEASE. If it 
100f0 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  is SAVEPOINT_ROL
10100 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20  LBACK, then the 
10110 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
10120 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
10130 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20  ed back. If eOp 
10140 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  is SAVEPOINT_REL
10150 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a  EASE, then the .
10160 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
10170 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
10180 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  itted..**.** If 
10190 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
101a0 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f  rs, an SQLITE_IO
101b0 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
101c0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
101d0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51  .** Otherwise SQ
101e0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
101f0 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
10200 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a  Statement(Vdbe *
10210 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73  p, int eOp){.  s
10220 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62  qlite3 *const db
10230 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
10240 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10250 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61  .  /* If p->iSta
10260 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65  tement is greate
10270 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
10280 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e  n this Vdbe open
10290 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65  ed a .  ** state
102a0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
102b0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
102c0 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65  closed here. The
102d0 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a   only exception.
102e0 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20    ** is that an 
102f0 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76  IO error may hav
10300 65 20 6f 63 63 75 72 72 65 64 2c 20 63 61 75 73  e occurred, caus
10310 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79  ing an emergency
10320 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20   rollback..  ** 
10330 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 64 62  In this case (db
10340 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29  ->nStatement==0)
10350 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
10360 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20  othing to do..  
10370 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74  */.  if( db->nSt
10380 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53  atement && p->iS
10390 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
103a0 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74  int i;.    const
103b0 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20   int iSavepoint 
103c0 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d  = p->iStatement-
103d0 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  1;..    assert( 
103e0 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
103f0 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d  OLLBACK || eOp==
10400 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
10410 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  E);.    assert( 
10420 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30  db->nStatement>0
10430 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
10440 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28  p->iStatement==(
10450 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64  db->nStatement+d
10460 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29  b->nSavepoint) )
10470 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
10480 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
10490 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20   .      int rc2 
104a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
104b0 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
104c0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
104d0 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
104e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70  .        if( eOp
104f0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
10500 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
10510 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
10520 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
10530 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  t, SAVEPOINT_ROL
10540 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
10550 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
10560 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53        if( rc2==S
10570 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10580 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
10590 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
105a0 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
105b0 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70  _RELEASE, iSavep
105c0 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  oint);.        }
105d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
105e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
105f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
10600 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10610 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62    }.    }.    db
10620 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a  ->nStatement--;.
10630 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e      p->iStatemen
10640 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
10650 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10660 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  .      if( eOp==
10670 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
10680 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  CK ){.        rc
10690 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
106a0 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45  vepoint(db, SAVE
106b0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
106c0 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
106d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
106e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
106f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
10700 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
10710 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
10720 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f  RELEASE, iSavepo
10730 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  int);.      }.  
10740 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
10750 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
10760 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  nsaction is bein
10770 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61  g rolled back, a
10780 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20  lso restore the 
10790 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
107a0 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65   handles deferre
107b0 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75  d constraint cou
107c0 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75  nter to the valu
107d0 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20  e it had when . 
107e0 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
107f0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
10800 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a  was opened.  */.
10810 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
10820 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
10830 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65  ){.      db->nDe
10840 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e  ferredCons = p->
10850 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20  nStmtDefCons;.  
10860 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
10870 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53  dImmCons = p->nS
10880 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20  tmtDefImmCons;. 
10890 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
108a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
108b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
108c0 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72  called when a tr
108d0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64  ansaction opened
108e0 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65   by the database
108f0 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f   .** handle asso
10900 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
10910 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  VM passed as an 
10920 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75  argument is abou
10930 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d  t to be .** comm
10940 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20  itted. If there 
10950 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
10960 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
10970 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a   key constraint.
10980 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72  ** violations, r
10990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
109a0 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  OR. Otherwise, S
109b0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
109c0 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
109d0 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c  standing FK viol
109e0 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20  ations and this 
109f0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
10a00 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
10a10 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  R, set the resul
10a20 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53  t of the VM to S
10a30 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
10a40 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61  _FOREIGNKEY.** a
10a50 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f  nd write an erro
10a60 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e  r message to it.
10a70 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c   Then return SQL
10a80 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69  ITE_ERROR..*/.#i
10a90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10aa0 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e  T_FOREIGN_KEY.in
10ab0 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  t sqlite3VdbeChe
10ac0 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e  ckFk(Vdbe *p, in
10ad0 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73  t deferred){.  s
10ae0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
10af0 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72  db;.  if( (defer
10b00 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66  red && (db->nDef
10b10 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44  erredCons+db->nD
10b20 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e  eferredImmCons)>
10b30 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65  0) .   || (!defe
10b40 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f  rred && p->nFkCo
10b50 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29  nstraint>0) .  )
10b60 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
10b70 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
10b80 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20  FOREIGNKEY;.    
10b90 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
10ba0 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73   OE_Abort;.    s
10bb0 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
10bc0 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
10bd0 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   "FOREIGN KEY co
10be0 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
10bf0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
10c00 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
10c10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10c20 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
10c30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10c40 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77   is called the w
10c50 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73  hen a VDBE tries
10c60 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68   to halt.  If th
10c70 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61  e VDBE.** has ma
10c80 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69  de changes and i
10c90 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20  s in autocommit 
10ca0 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69  mode, then commi
10cb0 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67  t those.** chang
10cc0 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61  es.  If a rollba
10cd0 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68  ck is needed, th
10ce0 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en do the rollba
10cf0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
10d00 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e  outine is the on
10d10 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74  ly way to move t
10d20 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d  he state of a VM
10d30 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f   from.** SQLITE_
10d40 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c  MAGIC_RUN to SQL
10d50 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20  ITE_MAGIC_HALT. 
10d60 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20   It is harmless 
10d70 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20  to.** call this 
10d80 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20  on a VM that is 
10d90 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
10da0 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a  GIC_HALT state..
10db0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
10dc0 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20  error code.  If 
10dd0 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64  the commit could
10de0 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65   not complete be
10df0 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b  cause of.** lock
10e00 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74   contention, ret
10e10 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
10e20 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59    If SQLITE_BUSY
10e30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
10e40 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c  .** means the cl
10e50 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70  ose did not happ
10e60 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  en and needs to 
10e70 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a  be repeated..*/.
10e80 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48  int sqlite3VdbeH
10e90 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  alt(Vdbe *p){.  
10ea0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ec0 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65  /* Used to store
10ed0 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72   transient retur
10ee0 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c  n codes */.  sql
10ef0 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
10f00 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ;..  /* This fun
10f10 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ction contains t
10f20 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65  he logic that de
10f30 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74  termines if a st
10f40 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20  atement or.  ** 
10f50 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
10f60 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72   be committed or
10f70 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
10f80 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  a result of the.
10f90 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f    ** execution o
10fa0 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  f this virtual m
10fb0 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  achine. .  **.  
10fc0 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  ** If any of the
10fd0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72   following error
10fe0 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20  s occur:.  **.  
10ff0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f  **     SQLITE_NO
11000 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  MEM.  **     SQL
11010 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20  ITE_IOERR.  **  
11020 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20     SQLITE_FULL. 
11030 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
11040 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20  NTERRUPT.  **.  
11050 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65  ** Then the inte
11060 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74  rnal cache might
11070 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20   have been left 
11080 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
11090 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20  nt.  ** state.  
110a0 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62  We need to rollb
110b0 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
110c0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  t transaction, i
110d0 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20  f there is.  ** 
110e0 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70  one, or the comp
110f0 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  lete transaction
11100 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
11110 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
11120 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69  ction..  */..  i
11130 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
11140 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
11150 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
11160 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  EM;.  }.  if( p-
11170 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d  >aOnceFlag ) mem
11180 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67  set(p->aOnceFlag
11190 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61  , 0, p->nOnceFla
111a0 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75  g);.  closeAllCu
111b0 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20  rsors(p);.  if( 
111c0 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
111d0 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20  AGIC_RUN ){.    
111e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
111f0 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74  ;.  }.  checkAct
11200 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
11210 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20  .  /* No commit 
11220 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64  or rollback need
11230 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ed if the progra
11240 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20  m never started 
11250 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53  or if the.  ** S
11260 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65  QL statement doe
11270 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72  s not read or wr
11280 69 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ite a database f
11290 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ile.  */.  if( p
112a0 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49  ->pc>=0 && p->bI
112b0 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69  sReader ){.    i
112c0 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69  nt mrc;   /* Pri
112d0 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20  mary error code 
112e0 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20  from p->rc */.  
112f0 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74    int eStatement
11300 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  Op = 0;.    int 
11310 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20  isSpecialError; 
11320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
11330 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27  t to true if a '
11340 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a  special' error *
11350 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61  /..    /* Lock a
11360 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62  ll btrees used b
11370 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  y the statement 
11380 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
11390 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20  beEnter(p);..   
113a0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e   /* Check for on
113b0 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
113c0 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d   errors */.    m
113d0 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66  rc = p->rc & 0xf
113e0 66 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  f;.    assert( p
113f0 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  ->rc!=SQLITE_IOE
11400 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f  RR_BLOCKED );  /
11410 2a 20 54 68 69 73 20 65 72 72 6f 72 20 6e 6f 20  * This error no 
11420 6c 6f 6e 67 65 72 20 65 78 69 73 74 73 20 2a 2f  longer exists */
11430 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72  .    isSpecialEr
11440 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54  ror = mrc==SQLIT
11450 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
11460 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20  SQLITE_IOERR.   
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11480 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45    || mrc==SQLITE
11490 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72  _INTERRUPT || mr
114a0 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  c==SQLITE_FULL;.
114b0 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61      if( isSpecia
114c0 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  lError ){.      
114d0 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
114e0 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e  was read-only an
114f0 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
11500 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   is SQLITE_INTER
11510 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20  RUPT, .      ** 
11520 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e  no rollback is n
11530 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77  ecessary. Otherw
11540 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20  ise, at least a 
11550 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20  savepoint .     
11560 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
11570 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  must be rolled b
11580 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ack to restore t
11590 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61  he database to a
115a0 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69   .      ** consi
115b0 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
115c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
115d0 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65  ven if the state
115e0 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c  ment is read-onl
115f0 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  y, it is importa
11600 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20  nt to perform.  
11610 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65      ** a stateme
11620 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
11630 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61  n rollback opera
11640 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72  tion. If the err
11650 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63  or .      ** occ
11660 75 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74  urred while writ
11670 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
11680 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  al, sub-journal 
11690 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  or database.    
116a0 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72    ** file as par
116b0 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74  t of an effort t
116c0 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20  o free up cache 
116d0 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74  space (see funct
116e0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ion.      ** pag
116f0 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61  erStress() in pa
11700 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c  ger.c), the roll
11710 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  back is required
11720 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20   to restore .   
11730 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20     ** the pager 
11740 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20  to a consistent 
11750 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
11760 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65        if( !p->re
11770 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53  adOnly || mrc!=S
11780 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
11790 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
117a0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
117b0 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
117c0 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65  _FULL) && p->use
117d0 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  sStmtJournal ){.
117e0 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
117f0 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
11800 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
11810 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11820 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
11830 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62  forced to roll b
11840 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74  ack the active t
11850 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f  ransaction. Befo
11860 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20  re doing.       
11870 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20     ** so, abort 
11880 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d  any other statem
11890 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65  ents this handle
118a0 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
118b0 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20  ctive..         
118c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
118d0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
118e0 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
118f0 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
11900 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
11910 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
11920 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
11930 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
11940 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11950 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
11960 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64   Check for immed
11970 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
11980 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a   violations. */.
11990 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
119a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
119b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65    sqlite3VdbeChe
119c0 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20  ckFk(p, 0);.    
119d0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
119e0 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
119f0 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
11a00 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
11a10 61 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20  active writer . 
11a20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77     ** VM, then w
11a30 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f  e do either a co
11a40 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
11a50 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
11a60 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20  transaction. .  
11a70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
11a80 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73  : This block als
11a90 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66  o runs if one of
11aa0 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72   the special err
11ab0 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20  ors handled .   
11ac0 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63   ** above has oc
11ad0 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a  curred. .    */.
11ae0 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
11af0 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a  VtabInSync(db) .
11b00 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f       && db->auto
11b10 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20  Commit .     && 
11b20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d  db->nVdbeWrite==
11b30 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29  (p->readOnly==0)
11b40 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69   .    ){.      i
11b50 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
11b60 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72  _OK || (p->error
11b70 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
11b80 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72  && !isSpecialErr
11b90 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  or) ){.        r
11ba0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
11bb0 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20  heckFk(p, 1);.  
11bc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
11bd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11be0 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70       if( NEVER(p
11bf0 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20  ->readOnly) ){. 
11c00 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
11c10 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
11c20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
11c30 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
11c40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
11c50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
11c60 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
11c70 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20  REIGNKEY;.      
11c80 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20    }else{ .      
11c90 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d      /* The auto-
11ca0 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74  commit flag is t
11cb0 72 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72  rue, the vdbe pr
11cc0 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73  ogram was succes
11cd0 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20  sful .          
11ce0 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52  ** or hit an 'OR
11cf0 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e   FAIL' constrain
11d00 74 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  t and there are 
11d10 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  no deferred fore
11d20 69 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ign.          **
11d30 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
11d40 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20   to hold up the 
11d50 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
11d60 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74  s means a commit
11d70 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
11d80 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  s required. */. 
11d90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64           rc = vd
11da0 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b  beCommit(db, p);
11db0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11dc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
11dd0 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61  E_BUSY && p->rea
11de0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
11df0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
11e00 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
11e10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11e20 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  BUSY;.        }e
11e30 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
11e40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11e50 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
11e60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11e70 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
11e80 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20  SQLITE_OK);.    
11e90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11ea0 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
11eb0 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20  edCons = 0;.    
11ec0 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
11ed0 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a  redImmCons = 0;.
11ee0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
11ef0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44  ags &= ~SQLITE_D
11f00 65 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20  eferFKs;.       
11f10 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74     sqlite3Commit
11f20 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
11f30 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  db);.        }. 
11f40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11f50 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
11f60 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
11f70 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  E_OK);.      }. 
11f80 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d       db->nStatem
11f90 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ent = 0;.    }el
11fa0 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e  se if( eStatemen
11fb0 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tOp==0 ){.      
11fc0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
11fd0 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72  E_OK || p->error
11fe0 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
11ff0 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
12000 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
12010 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20  INT_RELEASE;.   
12020 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
12030 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
12040 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
12050 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
12060 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
12070 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
12080 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12090 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
120a0 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
120b0 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
120c0 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
120d0 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
120e0 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
120f0 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  it = 1;.      }.
12100 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
12110 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  If eStatementOp 
12120 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
12130 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  n a statement tr
12140 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20  ansaction needs 
12150 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d  to.    ** be com
12160 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
12170 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69   back. Call sqli
12180 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
12190 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a  ement() to.    *
121a0 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73  * do so. If this
121b0 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72   operation retur
121c0 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64  ns an error, and
121d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
121e0 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72  tement.    ** er
121f0 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
12200 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f  TE_OK or SQLITE_
12210 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e  CONSTRAINT, then
12220 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20   promote the.   
12230 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74   ** current stat
12240 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  ement error code
12250 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
12260 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b   eStatementOp ){
12270 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12280 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
12290 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d  ement(p, eStatem
122a0 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66  entOp);.      if
122b0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
122c0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
122d0 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30  E_OK || (p->rc&0
122e0 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
122f0 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20  STRAINT ){.     
12300 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
12310 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12320 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
12330 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
12340 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
12350 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
12360 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
12370 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
12380 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
12390 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  CK);.        sql
123a0 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
123b0 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
123c0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
123d0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
123e0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
123f0 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45  this was an INSE
12400 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
12410 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74  LETE and no stat
12420 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
12430 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  n.    ** has bee
12440 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75  n rolled back, u
12450 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
12460 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68  se connection ch
12470 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20  ange-counter. . 
12480 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
12490 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a  >changeCntOn ){.
124a0 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65        if( eState
124b0 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e  mentOp!=SAVEPOIN
124c0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
124d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
124e0 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
124f0 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
12500 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12510 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
12520 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a  Changes(db, 0);.
12530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
12540 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
12550 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
12560 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f  ase the locks */
12570 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12580 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20  Leave(p);.  }.. 
12590 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63   /* We have succ
125a0 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20  essfully halted 
125b0 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56  and closed the V
125c0 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20  M.  Record this 
125d0 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  fact. */.  if( p
125e0 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64  ->pc>=0 ){.    d
125f0 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d  b->nVdbeActive--
12600 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65  ;.    if( !p->re
12610 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64  adOnly ) db->nVd
12620 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69  beWrite--;.    i
12630 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  f( p->bIsReader 
12640 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d  ) db->nVdbeRead-
12650 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  -;.    assert( d
12660 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d  b->nVdbeActive>=
12670 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
12680 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
12690 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e  >nVdbeRead>=db->
126a0 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
126b0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
126c0 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20  dbeWrite>=0 );. 
126d0 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
126e0 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b  VDBE_MAGIC_HALT;
126f0 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
12700 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28  beCnt(db);.  if(
12710 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
12720 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
12730 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
12740 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
12750 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
12760 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72  lag is set to tr
12770 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63  ue, then any loc
12780 6b 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c  ks that were hel
12790 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63  d.  ** by connec
127a0 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77  tion db have now
127b0 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20   been released. 
127c0 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e  Call sqlite3Conn
127d0 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29  ectionUnlocked()
127e0 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65   .  ** to invoke
127f0 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e   any required un
12800 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
12810 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  backs..  */.  if
12820 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  ( db->autoCommit
12830 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
12840 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
12850 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  d(db);.  }..  as
12860 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
12870 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61  ctive>0 || db->a
12880 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20  utoCommit==0 || 
12890 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
128a0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  0 );.  return (p
128b0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
128c0 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y ? SQLITE_BUSY 
128d0 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a  : SQLITE_OK);.}.
128e0 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42  ../*.** Each VDB
128f0 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75  E holds the resu
12900 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  lt of the most r
12910 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74  ecent sqlite3_st
12920 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20  ep() call.** in 
12930 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75  p->rc.  This rou
12940 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72  tine sets that r
12950 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51  esult back to SQ
12960 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64  LITE_OK..*/.void
12970 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
12980 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65  tStepResult(Vdbe
12990 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20   *p){.  p->rc = 
129a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
129b0 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72  .** Copy the err
129c0 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f  or code and erro
129d0 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67  r message belong
129e0 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45 20  ing to the VDBE 
129f0 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
12a00 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
12a10 74 6f 20 69 74 73 20 64 61 74 61 62 61 73 65 20  to its database 
12a20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20  handle (so that 
12a30 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a  they will be .**
12a40 20 72 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c   returned by cal
12a50 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72  ls to sqlite3_er
12a60 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69  rcode() and sqli
12a70 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a  te3_errmsg())..*
12a80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
12a90 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61  on does not clea
12aa0 72 20 74 68 65 20 56 44 42 45 20 65 72 72 6f 72  r the VDBE error
12ab0 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65   code or message
12ac0 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73  , just.** copies
12ad0 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74   them to the dat
12ae0 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
12af0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
12b00 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64  TransferError(Vd
12b10 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
12b20 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
12b30 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
12b40 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73  .  if( p->zErrMs
12b50 67 20 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c  g ){.    u8 mall
12b60 6f 63 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d  ocFailed = db->m
12b70 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20  allocFailed;.   
12b80 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
12b90 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
12ba0 20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30   if( db->pErr==0
12bb0 20 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71   ) db->pErr = sq
12bc0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62  lite3ValueNew(db
12bd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
12be0 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
12bf0 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d  rr, -1, p->zErrM
12c00 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  sg, SQLITE_UTF8,
12c10 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
12c20 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  T);.    sqlite3E
12c30 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
12c40 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  ;.    db->malloc
12c50 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46  Failed = mallocF
12c60 61 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65  ailed;.    db->e
12c70 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d  rrCode = rc;.  }
12c80 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
12c90 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30  3Error(db, rc, 0
12ca0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12cb0 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
12cc0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
12cd0 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53  OG./*.** If an S
12ce0 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c  QLITE_CONFIG_SQL
12cf0 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69  LOG hook is regi
12d00 73 74 65 72 65 64 20 61 6e 64 20 74 68 65 20 56  stered and the V
12d10 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20  M has been run, 
12d20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a  .** invoke it..*
12d30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
12d40 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56  beInvokeSqllog(V
12d50 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73  dbe *v){.  if( s
12d60 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
12d70 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d  ig.xSqllog && v-
12d80 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
12d90 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e  & v->zSql && v->
12da0 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  pc>=0 ){.    cha
12db0 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73  r *zExpanded = s
12dc0 71 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64  qlite3VdbeExpand
12dd0 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b  Sql(v, v->zSql);
12de0 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e  .    assert( v->
12df0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
12e00 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70   );.    if( zExp
12e10 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73  anded ){.      s
12e20 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
12e30 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20  ig.xSqllog(.    
12e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
12e50 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
12e60 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78  gArg, v->db, zEx
12e70 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20  panded, 1.      
12e80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12e90 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45  DbFree(v->db, zE
12ea0 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a  xpanded);.    }.
12eb0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
12ec0 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53  fine vdbeInvokeS
12ed0 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a  qllog(x).#endif.
12ee0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
12ef0 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
12f00 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f  cution but do no
12f10 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42  t delete the VDB
12f20 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57  E just yet..** W
12f30 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
12f40 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a  essages into *pz
12f50 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20  ErrMsg.  Return 
12f60 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
12f70 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  .**.** After thi
12f80 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e  s routine is run
12f90 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c  , the VDBE shoul
12fa0 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65  d be ready to be
12fb0 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61   executed.** aga
12fc0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f  in..**.** To loo
12fd0 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20  k at it another 
12fe0 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  way, this routin
12ff0 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61  e resets the sta
13000 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72  te of the.** vir
13010 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f  tual machine fro
13020 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  m VDBE_MAGIC_RUN
13030 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48   or VDBE_MAGIC_H
13040 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56  ALT back to.** V
13050 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a  DBE_MAGIC_INIT..
13060 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
13070 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29  beReset(Vdbe *p)
13080 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
13090 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  .  db = p->db;..
130a0 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64    /* If the VM d
130b0 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f  id not run to co
130c0 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69  mpletion or if i
130d0 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e  t encountered an
130e0 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65  .  ** error, the
130f0 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68  n it might not h
13100 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20  ave been halted 
13110 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61  properly.  So ha
13120 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a  lt.  ** it now..
13130 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
13140 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a  beHalt(p);..  /*
13150 20 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73   If the VDBE has
13160 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72   be run even par
13170 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61  tially, then tra
13180 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20  nsfer the error 
13190 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72  code.  ** and er
131a0 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d  ror message from
131b0 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74   the VDBE into t
131c0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
131d0 20 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74   structure.  But
131e0 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42  .  ** if the VDB
131f0 45 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  E has just been 
13200 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68  set to run but h
13210 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  as not actually 
13220 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a  executed any.  *
13230 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79  * instructions y
13240 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61  et, leave the ma
13250 69 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  in database erro
13260 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e  r information un
13270 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20  changed..  */.  
13280 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
13290 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71      vdbeInvokeSq
132a0 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c  llog(p);.    sql
132b0 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
132c0 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71  Error(p);.    sq
132d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
132e0 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
132f0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
13300 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f  .    if( p->runO
13310 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70  nlyOnce ) p->exp
13320 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ired = 1;.  }els
13330 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70  e if( p->rc && p
13340 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20  ->expired ){.   
13350 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20   /* The expired 
13360 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20  flag was set on 
13370 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20  the VDBE before 
13380 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20  the first call. 
13390 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
133a0 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e  _step(). For con
133b0 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20  sistency (since 
133c0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77  sqlite3_step() w
133d0 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  as.    ** called
133e0 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  ), set the datab
133f0 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69  ase error in thi
13400 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a  s case as well..
13410 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
13420 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72  e3Error(db, p->r
13430 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20  c, p->zErrMsg ? 
13440 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72  "%s" : 0, p->zEr
13450 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
13460 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
13470 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
13480 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
13490 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20  }..  /* Reclaim 
134a0 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  all memory used 
134b0 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f  by the VDBE.  */
134c0 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a  .  Cleanup(p);..
134d0 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c    /* Save profil
134e0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
134f0 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72  from this VDBE r
13500 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  un..  */.#ifdef 
13510 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
13520 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  .    FILE *out =
13530 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f   fopen("vdbe_pro
13540 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b  file.out", "a");
13550 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  .    if( out ){.
13560 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
13570 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
13580 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  "---- ");.      
13590 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
135a0 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
135b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
135c0 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e  02x", p->aOp[i].
135d0 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  opcode);.      }
135e0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
135f0 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
13600 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a   if( p->zSql ){.
13610 20 20 20 20 20 20 20 20 63 68 61 72 20 63 2c 20          char c, 
13620 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pc = 0;.        
13630 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
13640 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72   ");.        for
13650 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53  (i=0; (c = p->zS
13660 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  ql[i])!=0; i++){
13670 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
13680 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74  c=='\n' ) fprint
13690 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20  f(out, "-- ");. 
136a0 20 20 20 20 20 20 20 20 20 70 75 74 63 28 63 2c           putc(c,
136b0 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20   out);.         
136c0 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20   pc = c;.       
136d0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
136e0 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74  c!='\n' ) fprint
136f0 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  f(out, "\n");.  
13700 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
13710 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
13720 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
13730 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20  r zHdr[100];.   
13740 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
13750 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64  rintf(sizeof(zHd
13760 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25  r), zHdr, "%6u %
13770 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20  12llu %8llu ",. 
13780 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
13790 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20  [i].cnt,.       
137a0 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
137b0 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cles,.          
137c0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30   p->aOp[i].cnt>0
137d0 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63   ? p->aOp[i].cyc
137e0 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e  les/p->aOp[i].cn
137f0 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b  t : 0.        );
13800 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
13810 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72  (out, "%s", zHdr
13820 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13830 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75  e3VdbePrintOp(ou
13840 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
13850 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13860 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
13870 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
13880 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d 65   p->iCurrentTime
13890 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63   = 0;.  p->magic
138a0 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e   = VDBE_MAGIC_IN
138b0 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  IT;.  return p->
138c0 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  rc & db->errMask
138d0 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}. ./*.** Clea
138e0 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20  n up and delete 
138f0 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
13900 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  cution.  Return 
13910 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
13920 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   is.** the resul
13930 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61  t code.  Write a
13940 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
13950 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72   text into *pzEr
13960 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
13970 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
13980 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
13990 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
139a0 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d  .  if( p->magic=
139b0 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
139c0 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
139d0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
139e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
139f0 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20  VdbeReset(p);.  
13a00 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20    assert( (rc & 
13a10 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d  p->db->errMask)=
13a20 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  =rc );.  }.  sql
13a30 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70  ite3VdbeDelete(p
13a40 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
13a50 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61  }../*.** If para
13a60 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73  meter iOp is les
13a70 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
13a80 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  n invoke the des
13a90 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61  tructor for.** a
13aa0 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ll auxiliary dat
13ab0 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65  a pointers curre
13ac0 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 20 74  ntly cached by t
13ad0 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a  he VM passed as.
13ae0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67  ** the first arg
13af0 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ument..**.** Or,
13b00 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 61 74   if iOp is great
13b10 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
13b20 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
13b30 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
13b40 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64  .** only invoked
13b50 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c   for those auxil
13b60 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65  iary data pointe
13b70 72 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68  rs created by th
13b80 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74  e user .** funct
13b90 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74  ion invoked by t
13ba0 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f  he OP_Function o
13bb0 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63  pcode at instruc
13bc0 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20  tion iOp of .** 
13bd0 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e  VM pVdbe, and on
13be0 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a  ly then if:.**.*
13bf0 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63  *    * the assoc
13c00 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70  iated function p
13c10 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
13c20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63  32nd or later (c
13c30 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ounting.**      
13c40 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
13c50 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20  ht), or.**.**   
13c60 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e   * the correspon
13c70 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75  ding bit in argu
13c80 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65  ment mask is cle
13c90 61 72 20 28 77 68 65 72 65 20 74 68 65 20 66 69  ar (where the fi
13ca0 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63  rst.**      func
13cb0 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63  tion parameter c
13cc0 6f 72 72 73 70 6f 6e 64 73 20 74 6f 20 62 69 74  orrsponds to bit
13cd0 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69   0 etc.)..*/.voi
13ce0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
13cf0 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65 20  eteAuxData(Vdbe 
13d00 2a 70 56 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c  *pVdbe, int iOp,
13d10 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75   int mask){.  Au
13d20 78 44 61 74 61 20 2a 2a 70 70 20 3d 20 26 70 56  xData **pp = &pV
13d30 64 62 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20  dbe->pAuxData;. 
13d40 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20   while( *pp ){. 
13d50 20 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78     AuxData *pAux
13d60 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20   = *pp;.    if( 
13d70 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20  (iOp<0).     || 
13d80 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20  (pAux->iOp==iOp 
13d90 26 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33  && (pAux->iArg>3
13da0 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41  1 || !(mask & MA
13db0 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41  SKBIT32(pAux->iA
13dc0 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20  rg)))).    ){.  
13dd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41      testcase( pA
13de0 75 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a  ux->iArg==31 );.
13df0 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e        if( pAux->
13e00 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  xDelete ){.     
13e10 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65     pAux->xDelete
13e20 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20  (pAux->pAux);.  
13e30 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20      }.      *pp 
13e40 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20  = pAux->pNext;. 
13e50 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
13e60 65 65 28 70 56 64 62 65 2d 3e 64 62 2c 20 70 41  ee(pVdbe->db, pA
13e70 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ux);.    }else{.
13e80 20 20 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d        pp= &pAux-
13e90 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
13ea0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
13eb0 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
13ec0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
13ed0 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
13ee0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
13ef0 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72  t,.** except for
13f00 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20   object itself, 
13f10 77 68 69 63 68 20 69 73 20 70 72 65 73 65 72 76  which is preserv
13f20 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  ed..**.** The di
13f30 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
13f40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
13f50 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  nd sqlite3VdbeDe
13f60 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a  lete() is that.*
13f70 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61  * VdbeDelete() a
13f80 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20  lso unlinks the 
13f90 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69  Vdbe from the li
13fa0 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69  st of VMs associ
13fb0 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
13fc0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
13fd0 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74  tion and frees t
13fe0 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  he object itself
13ff0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14000 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74  3VdbeClearObject
14010 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
14020 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f  be *p){.  SubPro
14030 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65  gram *pSub, *pNe
14040 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  xt;.  int i;.  a
14050 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20  ssert( p->db==0 
14060 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a  || p->db==db );.
14070 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
14080 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56  y(p->aVar, p->nV
14090 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65  ar);.  releaseMe
140a0 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
140b0 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
140c0 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
140d0 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f  for(pSub=p->pPro
140e0 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62  gram; pSub; pSub
140f0 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
14100 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74  xt = pSub->pNext
14110 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f 70  ;.    vdbeFreeOp
14120 41 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e  Array(db, pSub->
14130 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b  aOp, pSub->nOp);
14140 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
14150 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20  ee(db, pSub);.  
14160 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56  }.  for(i=p->nzV
14170 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ar-1; i>=0; i--)
14180 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
14190 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b  b, p->azVar[i]);
141a0 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  .  vdbeFreeOpArr
141b0 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70  ay(db, p->aOp, p
141c0 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65  ->nOp);.  sqlite
141d0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
141e0 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ColName);.  sqli
141f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14200 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >zSql);.  sqlite
14210 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70  3DbFree(db, p->p
14220 46 72 65 65 29 3b 0a 23 69 66 20 64 65 66 69 6e  Free);.#if defin
14230 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
14240 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20  _TREE_EXPLAIN). 
14250 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
14260 62 2c 20 70 2d 3e 7a 45 78 70 6c 61 69 6e 29 3b  b, p->zExplain);
14270 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
14280 28 64 62 2c 20 70 2d 3e 70 45 78 70 6c 61 69 6e  (db, p->pExplain
14290 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
142a0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
142b0 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
142c0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
142d0 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
142e0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
142f0 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
14300 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
14310 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
14320 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14330 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
14340 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14350 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20  ClearObject(db, 
14360 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p);.  if( p->pPr
14370 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
14380 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
14390 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
143a0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
143b0 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
143c0 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
143d0 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
143e0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
143f0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
14400 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
14410 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
14420 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70  _MAGIC_DEAD;.  p
14430 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->db = 0;.  sqli
14440 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
14450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
14460 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72 20  sure the cursor 
14470 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72 65  p is ready to re
14480 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20  ad or write the 
14490 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a  row to which it.
144a0 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69  ** was last posi
144b0 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20  tioned.  Return 
144c0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
144d0 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72   an OOM fault or
144e0 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72   I/O error.** pr
144f0 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70  events us from p
14500 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63  ositioning the c
14510 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72  ursor to its cor
14520 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rect position..*
14530 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f  *.** If a MoveTo
14540 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65   operation is pe
14550 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76  nding on the giv
14560 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  en cursor, then 
14570 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54  do that.** MoveT
14580 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f  o now.  If no mo
14590 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63  ve is pending, c
145a0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
145b0 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a  he row has been.
145c0 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  ** deleted out f
145d0 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
145e0 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68  rsor and if it h
145f0 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77  as, mark the row
14600 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f   as.** a NULL ro
14610 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  w..**.** If the 
14620 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
14630 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
14640 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e  e correct row an
14650 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a  d that row has.*
14660 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74  * not been delet
14670 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
14680 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68  r the cursor, th
14690 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
146a0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
146b0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
146c0 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43  rsorMoveto(VdbeC
146d0 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28  ursor *p){.  if(
146e0 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
146f0 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  to ){.    int re
14700 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51  s, rc;.#ifdef SQ
14710 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78  LITE_TEST.    ex
14720 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
14730 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23  _search_count;.#
14740 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
14750 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a  ( p->isTable );.
14760 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14770 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
14780 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ked(p->pCursor, 
14790 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  0, p->movetoTarg
147a0 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20  et, 0, &res);.  
147b0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
147c0 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73  n rc;.    p->las
147d0 74 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65  tRowid = p->move
147e0 74 6f 54 61 72 67 65 74 3b 0a 20 20 20 20 69 66  toTarget;.    if
147f0 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72  ( res!=0 ) retur
14800 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
14810 5f 42 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 72 6f  _BKPT;.    p->ro
14820 77 69 64 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a  widIsValid = 1;.
14830 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
14840 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ST.    sqlite3_s
14850 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  earch_count++;.#
14860 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65 66  endif.    p->def
14870 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
14880 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61  .    p->cacheSta
14890 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
148a0 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  E;.  }else if( p
148b0 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
148c0 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20   int hasMoved;. 
148d0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
148e0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
148f0 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f  sMoved(p->pCurso
14900 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20  r, &hasMoved);. 
14910 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
14920 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68  rn rc;.    if( h
14930 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20  asMoved ){.     
14940 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
14950 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
14960 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20       p->nullRow 
14970 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
14980 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14990 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
149a0 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
149b0 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ons:.**.** sqlit
149c0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
149d0 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
149e0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
149f0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
14a00 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
14a10 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
14a20 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  ut().** sqlite3V
14a30 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a  dbeSerialGet().*
14a40 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65  *.** encapsulate
14a50 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
14a60 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73  erializes values
14a70 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20   for storage in 
14a80 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61  SQLite.** data a
14a90 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  nd index records
14aa0 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65  . Each serialize
14ab0 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73  d value consists
14ac0 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c   of a.** 'serial
14ad0 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f  -type' and a blo
14ae0 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73  b of data. The s
14af0 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e  erial type is an
14b00 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   8-byte unsigned
14b10 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f  .** integer, sto
14b20 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e  red as a varint.
14b30 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c  .**.** In an SQL
14b40 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ite index record
14b50 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  , the serial typ
14b60 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65  e is stored dire
14b70 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74  ctly before.** t
14b80 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  he blob of data 
14b90 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f  that it correspo
14ba0 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62  nds to. In a tab
14bb0 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73  le record, all s
14bc0 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61  erial.** types a
14bd0 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  re stored at the
14be0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65   start of the re
14bf0 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c  cord, and the bl
14c00 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a  obs of data at.*
14c10 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65  * the end. Hence
14c20 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73   these functions
14c30 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65   allow the calle
14c40 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a  r to handle the.
14c50 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61  ** serial-type a
14c60 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70  nd data blob sep
14c70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  arately..**.** T
14c80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
14c90 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
14ca0 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65   various storage
14cb0 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74   classes for dat
14cc0 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61  a:.**.**   seria
14cd0 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79  l type        by
14ce0 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20  tes of data     
14cf0 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d   type.**   -----
14d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
14d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
14d20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
14d30 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20  .**      0      
14d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
14d50 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
14d60 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20  .**      1      
14d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
14d80 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
14d90 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
14da0 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
14db0 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
14dc0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
14dd0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20  eger.**      3  
14de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14df0 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
14e00 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
14e10 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20  *      4        
14e20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20               4  
14e30 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
14e40 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
14e50 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20   5              
14e60 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20         6        
14e70 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
14e80 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20  er.**      6    
14e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ea0 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69   8            si
14eb0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
14ec0 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20       7          
14ed0 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
14ee0 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f          IEEE flo
14ef0 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20  at.**      8    
14f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f10 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
14f20 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30  teger constant 0
14f30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20  .**      9      
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
14f50 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
14f60 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a  ger constant 1.*
14f70 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20  *     10,11     
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f90 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76            reserv
14fa0 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e  ed for expansion
14fb0 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64  .**    N>=12 and
14fc0 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31   even       (N-1
14fd0 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42  2)/2        BLOB
14fe0 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64  .**    N>=13 and
14ff0 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31   odd        (N-1
15000 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74  3)/2        text
15010 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64  .**.** The 8 and
15020 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64   9 types were ad
15030 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69  ded in 3.3.0, fi
15040 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72  le format 4.  Pr
15050 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  ior versions.** 
15060 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  of SQLite will n
15070 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  ot understand th
15080 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  ose serial types
15090 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
150a0 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79  rn the serial-ty
150b0 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  pe for the value
150c0 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e   stored in pMem.
150d0 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
150e0 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65  dbeSerialType(Me
150f0 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
15100 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74  e_format){.  int
15110 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
15120 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  lags;.  int n;..
15130 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
15140 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
15150 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
15160 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
15170 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
15180 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73  ut whether to us
15190 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20  e 1, 2, 4, 6 or 
151a0 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20  8 bytes. */.#   
151b0 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45  define MAX_6BYTE
151c0 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38   ((((i64)0x00008
151d0 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20  000)<<32)-1).   
151e0 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75   i64 i = pMem->u
151f0 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20  .i;.    u64 u;. 
15200 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20     if( i<0 ){.  
15210 20 20 20 20 69 66 28 20 69 3c 28 2d 4d 41 58 5f      if( i<(-MAX_
15220 36 42 59 54 45 29 20 29 20 72 65 74 75 72 6e 20  6BYTE) ) return 
15230 36 3b 0a 20 20 20 20 20 20 2f 2a 20 50 72 65 76  6;.      /* Prev
15240 69 6f 75 73 20 74 65 73 74 20 70 72 65 76 65 6e  ious test preven
15250 74 73 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32 33  ts:  u = -(-9223
15260 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38 29  372036854775808)
15270 20 2a 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d 69   */.      u = -i
15280 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15290 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a     u = i;.    }.
152a0 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29      if( u<=127 )
152b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  {.      return (
152c0 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65  (i&1)==i && file
152d0 5f 66 6f 72 6d 61 74 3e 3d 34 29 20 3f 20 38 2b  _format>=4) ? 8+
152e0 28 75 33 32 29 75 20 3a 20 31 3b 0a 20 20 20 20  (u32)u : 1;.    
152f0 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37  }.    if( u<=327
15300 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  67 ) return 2;. 
15310 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30     if( u<=838860
15320 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20  7 ) return 3;.  
15330 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33    if( u<=2147483
15340 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a  647 ) return 4;.
15350 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
15360 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b  BYTE ) return 5;
15370 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20  .    return 6;. 
15380 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
15390 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72  EM_Real ){.    r
153a0 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
153b0 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d  ssert( pMem->db-
153c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
153d0 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
153e0 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e  MEM_Blob) );.  n
153f0 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66   = pMem->n;.  if
15400 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
15410 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
15420 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
15430 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30  }.  assert( n>=0
15440 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e   );.  return ((n
15450 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61  *2) + 12 + ((fla
15460 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29  gs&MEM_Str)!=0))
15470 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15480 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
15490 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
154a0 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
154b0 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
154c0 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  pe..*/.u32 sqlit
154d0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
154e0 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
154f0 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
15500 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
15510 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61     return (seria
15520 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
15530 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69  }else{.    stati
15540 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65  c const u8 aSize
15550 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20  [] = { 0, 1, 2, 
15560 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30  3, 4, 6, 8, 8, 0
15570 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20  , 0, 0, 0 };.   
15580 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65   return aSize[se
15590 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a  rial_type];.  }.
155a0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
155b0 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65  re on an archite
155c0 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64  cture with mixed
155d0 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67  -endian floating
155e0 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a   .** points (ex:
155f0 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70   ARM7) then swap
15600 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74   the lower 4 byt
15610 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20  es with the .** 
15620 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20  upper 4 bytes.  
15630 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
15640 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73  t..**.** For mos
15650 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  t architectures,
15660 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
15670 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a  ..**.** (later):
15680 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64    It is reported
15690 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20   to me that the 
156a0 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f  mixed-endian pro
156b0 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20  blem.** on ARM7 
156c0 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68  is an issue with
156d0 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74   GCC, not with t
156e0 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49  he ARM7 chip.  I
156f0 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20  t seems.** that 
15700 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f  early versions o
15710 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65  f GCC stored the
15720 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20   two words of a 
15730 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20  64-bit.** float 
15740 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64  in the wrong ord
15750 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72  er.  And that er
15760 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ror has been pro
15770 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20  pagated.** ever 
15780 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d  since.  The blam
15790 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
157a0 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74  rily with GCC, t
157b0 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69  hough..** GCC mi
157c0 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f  ght have just co
157d0 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  pying the proble
157e0 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  m from a prior c
157f0 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d  ompiler..** I am
15800 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20   also told that 
15810 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
15820 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f  f GCC that follo
15830 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  w a different.**
15840 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74   ABI get the byt
15850 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a  e order right..*
15860 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20  *.** Developers 
15870 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20  using SQLite on 
15880 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63  an ARM7 should c
15890 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74  ompile and run t
158a0 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74  heir.** applicat
158b0 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ion using -DSQLI
158c0 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65  TE_DEBUG=1 at le
158d0 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20  ast once.  With 
158e0 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64  DEBUG.** enabled
158f0 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62  , some asserts b
15900 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65  elow will ensure
15910 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f   that the byte o
15920 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74  rder of.** float
15930 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
15940 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a   is correct..**.
15950 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20  ** (2007-08-30) 
15960 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20   Frank van Vugt 
15970 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73  has studied this
15980 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79   problem closely
15990 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64  .** and has send
159a0 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f   his findings to
159b0 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65   the SQLite deve
159c0 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a  lopers.  Frank.*
159d0 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f  * writes that so
159e0 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73  me Linux kernels
159f0 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20   offer floating 
15a00 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a  point hardware.*
15a10 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74  * emulation that
15a20 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69   uses only 32-bi
15a30 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74  t mantissas inst
15a40 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a  ead of a full .*
15a50 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71  * 48-bits as req
15a60 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45  uired by the IEE
15a70 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68  E standard.  (Th
15a80 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e  is is the.** CON
15a90 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20  FIG_FPE_FASTFPE 
15aa0 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63  option.)  On suc
15ab0 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74  h systems, float
15ac0 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74  ing point.** byt
15ad0 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d  e swapping becom
15ae0 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61  es very complica
15af0 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70  ted.  To avoid p
15b00 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20  roblems,.** the 
15b10 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73  necessary byte s
15b20 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69  wapping is carri
15b30 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36  ed out using a 6
15b40 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
15b50 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36   rather than a 6
15b60 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72  4-bit float.  Fr
15b70 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74  ank assures us t
15b80 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  hat the code her
15b90 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68  e.** works for h
15ba0 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76  im.  We, the dev
15bb0 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f  elopers, have no
15bc0 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64   way to independ
15bd0 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20  ently.** verify 
15be0 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20  this, but Frank 
15bf0 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68  seems to know wh
15c00 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67  at he is talking
15c10 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20   about.** so we 
15c20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69  trust him..*/.#i
15c30 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  fdef SQLITE_MIXE
15c40 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
15c50 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20  LOAT.static u64 
15c60 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e  floatSwap(u64 in
15c70 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  ){.  union {.   
15c80 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20   u64 r;.    u32 
15c90 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  i[2];.  } u;.  u
15ca0 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69  32 t;..  u.r = i
15cb0 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b  n;.  t = u.i[0];
15cc0 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b  .  u.i[0] = u.i[
15cd0 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74  1];.  u.i[1] = t
15ce0 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a  ;.  return u.r;.
15cf0 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  }.# define swapM
15d00 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
15d10 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61  X)  X = floatSwa
15d20 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  p(X).#else.# def
15d30 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
15d40 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64  ianFloat(X).#end
15d50 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
15d60 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64  the serialized d
15d70 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65  ata blob for the
15d80 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
15d90 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62   pMem into .** b
15da0 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  uf. It is assume
15db0 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
15dc0 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  r has allocated 
15dd0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
15de0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
15df0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
15e00 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e  written..**.** n
15e10 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  Buf is the amoun
15e20 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20  t of space left 
15e30 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63  in buf[].  The c
15e40 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
15e50 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f  ible.** for allo
15e60 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70  cating enough sp
15e70 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20  ace to buf[] to 
15e80 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20  hold the entire 
15e90 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65  field, exclusive
15ea0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d  .** of the pMem-
15eb0 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66  >u.nZero bytes f
15ec0 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61  or a MEM_Zero va
15ed0 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lue..**.** Retur
15ee0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
15ef0 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77  bytes actually w
15f00 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b  ritten into buf[
15f10 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  ].  The number.*
15f20 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  * of bytes in th
15f30 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
15f40 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69  il is included i
15f50 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
15f60 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68  ue only.** if th
15f70 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a  ose bytes were z
15f80 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a  eroed in buf[]..
15f90 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56  */ .u32 sqlite3V
15fa0 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20  dbeSerialPut(u8 
15fb0 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  *buf, Mem *pMem,
15fc0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
15fd0 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20  ){.  u32 len;.. 
15fe0 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20   /* Integer and 
15ff0 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65  Real */.  if( se
16000 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20  rial_type<=7 && 
16010 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b  serial_type>0 ){
16020 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20  .    u64 v;.    
16030 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73  u32 i;.    if( s
16040 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
16050 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
16060 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66  izeof(v)==sizeof
16070 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20  (pMem->r) );.   
16080 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70     memcpy(&v, &p
16090 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76  Mem->r, sizeof(v
160a0 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
160b0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
160c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
160d0 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
160e0 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
160f0 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64   = i = sqlite3Vd
16100 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
16110 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
16120 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a    while( i-- ){.
16130 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28        buf[i] = (
16140 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
16150 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
16160 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
16170 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
16180 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
16190 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
161a0 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
161b0 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
161c0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
161d0 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e  _Zero)?pMem->u.n
161e0 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20  Zero:0).        
161f0 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c       == (int)sql
16200 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
16210 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
16220 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  e) );.    len = 
16230 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d  pMem->n;.    mem
16240 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a  cpy(buf, pMem->z
16250 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75  , len);.    retu
16260 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
16270 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61  * NULL or consta
16280 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20  nts 0 or 1 */.  
16290 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
162a0 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
162b0 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
162c0 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
162d0 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
162e0 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
162f0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
16300 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
16310 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
16320 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20   bytes read..*/ 
16330 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
16340 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
16350 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
16360 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
16370 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
16380 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
16390 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
163a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
163b0 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
163c0 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
163d0 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
163f0 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
16400 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
16410 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 3b 0a 20  */.){.  u64 x;. 
16420 20 75 33 32 20 79 3b 0a 20 20 69 6e 74 20 69 3b   u32 y;.  int i;
16430 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
16440 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
16450 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65  se 10:   /* Rese
16460 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
16470 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
16480 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  11:   /* Reserve
16490 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
164a0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20   */.    case 0: 
164b0 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20  {  /* NULL */.  
164c0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
164d0 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
164e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
164f0 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20     case 1: { /* 
16500 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  1-byte signed in
16510 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
16520 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e  Mem->u.i = (sign
16530 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a  ed char)buf[0];.
16540 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
16550 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
16560 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
16570 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
16580 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
16590 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
165a0 20 20 20 69 20 3d 20 32 35 36 2a 28 73 69 67 6e     i = 256*(sign
165b0 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 20 7c  ed char)buf[0] |
165c0 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70   buf[1];.      p
165d0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 69 36 34 29  Mem->u.i = (i64)
165e0 69 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  i;.      pMem->f
165f0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
16600 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
16610 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
16620 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
16630 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
16640 20 20 20 20 20 20 69 20 3d 20 36 35 35 33 36 2a        i = 65536*
16650 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
16660 5b 30 5d 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38  [0] | (buf[1]<<8
16670 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20  ) | buf[2];.    
16680 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 69    pMem->u.i = (i
16690 36 34 29 69 3b 0a 20 20 20 20 20 20 70 4d 65 6d  64)i;.      pMem
166a0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
166b0 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
166c0 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  3;.    }.    cas
166d0 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
166e0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
166f0 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 28 28 75  */.      y = ((u
16700 6e 73 69 67 6e 65 64 29 62 75 66 5b 30 5d 3c 3c  nsigned)buf[0]<<
16710 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31  24) | (buf[1]<<1
16720 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29  6) | (buf[2]<<8)
16730 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20   | buf[3];.     
16740 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 69 36   pMem->u.i = (i6
16750 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20  4)*(int*)&y;.   
16760 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
16770 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
16780 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
16790 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
167a0 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
167b0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
167c0 78 20 3d 20 32 35 36 2a 28 73 69 67 6e 65 64 20  x = 256*(signed 
167d0 63 68 61 72 29 62 75 66 5b 30 5d 20 2b 20 62 75  char)buf[0] + bu
167e0 66 5b 31 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20  f[1];.      y = 
167f0 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 32  ((unsigned)buf[2
16800 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d  ]<<24) | (buf[3]
16810 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c  <<16) | (buf[4]<
16820 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20  <8) | buf[5];.  
16830 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
16840 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  | y;.      pMem-
16850 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  >u.i = *(i64*)&x
16860 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
16870 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
16880 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20       return 6;. 
16890 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
168a0 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67     /* 8-byte sig
168b0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
168c0 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20     case 7: { /* 
168d0 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f  IEEE floating po
168e0 69 6e 74 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  int */.#if !defi
168f0 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
16900 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
16910 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
16920 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72  NT).      /* Ver
16930 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
16940 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
16950 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
16960 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a  the same.      *
16970 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f  * byte order.  O
16980 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54  r, that if SQLIT
16990 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
169a0 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20  4BIT_FLOAT is.  
169b0 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74      ** defined t
169c0 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  hat 64-bit float
169d0 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
169e0 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65   really are mixe
169f0 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61  d.      ** endia
16a00 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
16a10 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
16a20 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78  64 t1 = ((u64)0x
16a30 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20  3ff00000)<<32;. 
16a40 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
16a50 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e  t double r1 = 1.
16a60 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32 20  0;.      u64 t2 
16a70 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70  = t1;.      swap
16a80 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
16a90 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65  (t2);.      asse
16aa0 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d  rt( sizeof(r1)==
16ab0 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65  sizeof(t2) && me
16ac0 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73  mcmp(&r1, &t2, s
16ad0 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b  izeof(r1))==0 );
16ae0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 78 20  .#endif.      x 
16af0 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66  = ((unsigned)buf
16b00 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [0]<<24) | (buf[
16b10 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32  1]<<16) | (buf[2
16b20 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a  ]<<8) | buf[3];.
16b30 20 20 20 20 20 20 79 20 3d 20 28 28 75 6e 73 69        y = ((unsi
16b40 67 6e 65 64 29 62 75 66 5b 34 5d 3c 3c 32 34 29  gned)buf[4]<<24)
16b50 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20   | (buf[5]<<16) 
16b60 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20  | (buf[6]<<8) | 
16b70 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20  buf[7];.      x 
16b80 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20  = (x<<32) | y;. 
16b90 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
16ba0 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20  type==6 ){.     
16bb0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
16bc0 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
16bd0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
16be0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d  MEM_Int;.      }
16bf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
16c00 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
16c10 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65  =8 && sizeof(pMe
16c20 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20  m->r)==8 );.    
16c30 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
16c40 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20  ianFloat(x);.   
16c50 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65       memcpy(&pMe
16c60 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66  m->r, &x, sizeof
16c70 28 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  (x));.        pM
16c80 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69  em->flags = sqli
16c90 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72  te3IsNaN(pMem->r
16ca0 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d  ) ? MEM_Null : M
16cb0 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d  EM_Real;.      }
16cc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b  .      return 8;
16cd0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16ce0 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72  8:    /* Integer
16cf0 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39   0 */.    case 9
16d00 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  : {  /* Integer 
16d10 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 */.      pMem-
16d20 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79  >u.i = serial_ty
16d30 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  pe-8;.      pMem
16d40 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
16d50 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
16d60 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  0;.    }.    def
16d70 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74  ault: {.      st
16d80 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61  atic const u16 a
16d90 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42  Flag[] = { MEM_B
16da0 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d  lob|MEM_Ephem, M
16db0 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d  EM_Str|MEM_Ephem
16dc0 20 7d 3b 0a 20 20 20 20 20 20 75 33 32 20 6c 65   };.      u32 le
16dd0 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  n = (serial_type
16de0 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d  -12)/2;.      pM
16df0 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29  em->z = (char *)
16e00 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  buf;.      pMem-
16e10 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  >n = len;.      
16e20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a  pMem->xDel = 0;.
16e30 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
16e40 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c  s = aFlag[serial
16e50 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20  _type&1];.      
16e60 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20  return len;.    
16e70 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
16e80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16e90 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
16ea0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66  to allocate suff
16eb0 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72  icient space for
16ec0 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f   an UnpackedReco
16ed0 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  rd.** structure 
16ee0 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
16ef0 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  be used with sql
16f00 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
16f10 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65  pack() if.** the
16f20 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
16f30 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
16f40 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
16f50 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a  e pKeyInfo..**.*
16f60 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65  * The space is e
16f70 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ither allocated 
16f80 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d  using sqlite3DbM
16f90 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72  allocRaw() or fr
16fa0 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65  om within.** the
16fb0 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65   unaligned buffe
16fc0 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65  r passed via the
16fd0 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72   second and thir
16fe0 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65  d arguments (pre
16ff0 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b  sumably.** stack
17000 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20   space). If the 
17010 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70  former, then *pp
17020 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61  Free is set to a
17030 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68   pointer that sh
17040 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74  ould.** be event
17050 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74  ually freed by t
17060 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
17070 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
17080 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20   Or, if the .** 
17090 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73  allocation comes
170a0 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65   from the pSpace
170b0 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c  /szSpace buffer,
170c0 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20   *ppFree is set 
170d0 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72  to NULL.** befor
170e0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
170f0 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
17100 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
17110 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
17120 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
17130 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
17140 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
17150 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
17160 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
17170 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
17180 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a   of the record *
17190 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65  /.  char *pSpace
171a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
171b0 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64      /* Unaligned
171c0 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
171d0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63   */.  int szSpac
171e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
171f0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
17200 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74   pSpace[] in byt
17210 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  es */.  char **p
17220 70 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20  pFree           
17230 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
17240 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72  Caller should fr
17250 65 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  ee this pointer 
17260 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64  */.){.  Unpacked
17270 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20  Record *p;      
17280 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63          /* Unpac
17290 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65  ked record to re
172a0 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  turn */.  int nO
172b0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
172c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63            /* Inc
172d0 72 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79  rement pSpace by
172e0 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69   nOff to align i
172f0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  t */.  int nByte
17300 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17310 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17320 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
17330 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20  ed for *p */..  
17340 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68  /* We want to sh
17350 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ift the pointer 
17360 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20 74  pSpace up such t
17370 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74 65  hat it is 8-byte
17380 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54   aligned..  ** T
17390 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  hus, we need to 
173a0 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75  calculate a valu
173b0 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e  e, nOff, between
173c0 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69   0 and 7, to shi
173d0 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20  ft .  ** it by. 
173e0 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61 6c   If pSpace is al
173f0 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69  ready 8-byte ali
17400 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c  gned, nOff shoul
17410 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a  d be zero..  */.
17420 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53    nOff = (8 - (S
17430 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
17440 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20 26  (pSpace) & 7)) &
17450 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f   7;.  nByte = RO
17460 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
17470 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73  ckedRecord)) + s
17480 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79  izeof(Mem)*(pKey
17490 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b  Info->nField+1);
174a0 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53  .  if( nByte>szS
174b0 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20  pace+nOff ){.   
174c0 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
174d0 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62  cord *)sqlite3Db
174e0 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
174f0 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
17500 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28 63      *ppFree = (c
17510 68 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66 28  har *)p;.    if(
17520 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   !p ) return 0;.
17530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
17540 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
17550 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b  *)&pSpace[nOff];
17560 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30  .    *ppFree = 0
17570 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d  ;.  }..  p->aMem
17580 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72   = (Mem*)&((char
17590 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65  *)p)[ROUND8(size
175a0 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
175b0 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  d))];.  assert( 
175c0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
175d0 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e  rder!=0 );.  p->
175e0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
175f0 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  nfo;.  p->nField
17600 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
17610 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72  eld + 1;.  retur
17620 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n p;.}../*.** Gi
17630 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74  ven the nKey-byt
17640 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  e encoding of a 
17650 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d  record in pKey[]
17660 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a  , populate the .
17670 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  ** UnpackedRecor
17680 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69  d structure indi
17690 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f 75  cated by the fou
176a0 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74  rth argument wit
176b0 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  h the.** content
176c0 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64  s of the decoded
176d0 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69   record..*/ .voi
176e0 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  d sqlite3VdbeRec
176f0 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79  ordUnpack(.  Key
17700 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
17710 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
17720 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63  on about the rec
17730 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ord format */.  
17740 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  int nKey,       
17750 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
17760 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63  f the binary rec
17770 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
17780 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20  oid *pKey,      
17790 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65  /* The binary re
177a0 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  cord */.  Unpack
177b0 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20  edRecord *p     
177c0 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69   /* Populate thi
177d0 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66 6f  s structure befo
177e0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f  re returning. */
177f0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
17800 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
17810 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
17820 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20  d char *)pKey;. 
17830 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69   int d; .  u32 i
17840 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
17850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
17860 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74  fset in aKey[] t
17870 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
17880 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20   u16 u;         
17890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178a0 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
178b0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
178c0 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20  32 szHdr;.  Mem 
178d0 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b  *pMem = p->aMem;
178e0 0a 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 30  ..  p->flags = 0
178f0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
17900 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
17910 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20  (pMem) );.  idx 
17920 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
17930 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20  ey, szHdr);.  d 
17940 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30  = szHdr;.  u = 0
17950 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
17960 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69  zHdr && u<p->nFi
17970 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29  eld && d<=nKey )
17980 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
17990 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20  _type;..    idx 
179a0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
179b0 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61  aKey[idx], seria
179c0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65  l_type);.    pMe
179d0 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m->enc = pKeyInf
179e0 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d  o->enc;.    pMem
179f0 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ->db = pKeyInfo-
17a00 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d  >db;.    /* pMem
17a10 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20  ->flags = 0; // 
17a20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17a30 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20  lGet() will set 
17a40 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20  this for us */. 
17a50 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63     pMem->zMalloc
17a60 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73   = 0;.    d += s
17a70 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
17a80 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65  Get(&aKey[d], se
17a90 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29  rial_type, pMem)
17aa0 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20  ;.    pMem++;.  
17ab0 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73    u++;.  }.  ass
17ac0 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f  ert( u<=pKeyInfo
17ad0 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a  ->nField + 1 );.
17ae0 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b    p->nField = u;
17af0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
17b00 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
17b10 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72   the two table r
17b20 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63  ows or index rec
17b30 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65  ords.** specifie
17b40 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65  d by {nKey1, pKe
17b50 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20  y1} and pPKey2. 
17b60 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65   It returns a ne
17b70 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20  gative, zero.** 
17b80 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  or positive inte
17b90 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c  ger if key1 is l
17ba0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
17bb0 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65  to or .** greate
17bc0 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68  r than key2.  Th
17bd0 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  e {nKey1, pKey1}
17be0 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62   key must be a b
17bf0 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62  lob.** created b
17c00 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  y th OP_MakeReco
17c10 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65  rd opcode of the
17c20 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65   VDBE.  The pPKe
17c30 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62  y2.** key must b
17c40 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73  e a parsed key s
17c50 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20  uch as obtained 
17c60 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56  from.** sqlite3V
17c70 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a  dbeParseRecord..
17c80 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b  **.** Key1 and K
17c90 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  ey2 do not have 
17ca0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73  to contain the s
17cb0 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ame number of fi
17cc0 65 6c 64 73 2e 0a 2a 2a 20 54 68 65 20 6b 65 79  elds..** The key
17cd0 20 77 69 74 68 20 66 65 77 65 72 20 66 69 65 6c   with fewer fiel
17ce0 64 73 20 69 73 20 75 73 75 61 6c 6c 79 20 63 6f  ds is usually co
17cf0 6d 70 61 72 65 73 20 6c 65 73 73 20 74 68 61 6e  mpares less than
17d00 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20   the .** longer 
17d10 6b 65 79 2e 20 20 48 6f 77 65 76 65 72 20 69 66  key.  However if
17d20 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e   the UNPACKED_IN
17d30 43 52 4b 45 59 20 66 6c 61 67 73 20 69 6e 20 70  CRKEY flags in p
17d40 50 4b 65 79 32 20 69 73 20 73 65 74 0a 2a 2a 20  PKey2 is set.** 
17d50 61 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70  and the common p
17d60 72 65 66 69 78 65 73 20 61 72 65 20 65 71 75 61  refixes are equa
17d70 6c 2c 20 74 68 65 6e 20 6b 65 79 31 20 69 73 20  l, then key1 is 
17d80 6c 65 73 73 20 74 68 61 6e 20 6b 65 79 32 2e 0a  less than key2..
17d90 2a 2a 20 4f 72 20 69 66 20 74 68 65 20 55 4e 50  ** Or if the UNP
17da0 41 43 4b 45 44 5f 4d 41 54 43 48 5f 50 52 45 46  ACKED_MATCH_PREF
17db0 49 58 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  IX flag is set a
17dc0 6e 64 20 74 68 65 20 70 72 65 66 69 78 65 73 20  nd the prefixes 
17dd0 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 74 68  are.** equal, th
17de0 65 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65 20  en the keys are 
17df0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
17e00 20 65 71 75 61 6c 20 61 6e 64 0a 2a 2a 20 74 68   equal and.** th
17e10 65 20 70 61 72 74 73 20 62 65 79 6f 6e 64 20 74  e parts beyond t
17e20 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78  he common prefix
17e30 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f   are ignored..*/
17e40 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
17e50 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20  RecordCompare(. 
17e60 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
17e70 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
17e80 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
17e90 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
17ea0 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a  pPKey2        /*
17eb0 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
17ec0 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
17ed0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
17ee0 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
17ef0 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
17f00 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
17f10 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
17f20 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
17f30 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c  f next header el
17f40 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73  ement */.  u32 s
17f50 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a  zHdr1;        /*
17f60 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
17f70 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
17f80 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
17f90 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
17fa0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
17fb0 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
17fc0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
17fd0 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Key1;.  KeyInfo 
17fe0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d  *pKeyInfo;.  Mem
17ff0 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e   mem1;..  pKeyIn
18000 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
18010 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e  yInfo;.  mem1.en
18020 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
18030 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70  c;.  mem1.db = p
18040 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f  KeyInfo->db;.  /
18050 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30  * mem1.flags = 0
18060 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e  ;  // Will be in
18070 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c  itialized by sql
18080 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
18090 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c  t() */.  VVA_ONL
180a0 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20  Y( mem1.zMalloc 
180b0 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e  = 0; ) /* Only n
180c0 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28  eeded by assert(
180d0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
180e0 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20  .  /* Compilers 
180f0 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61  may complain tha
18100 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f  t mem1.u.i is po
18110 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74  tentially uninit
18120 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65  ialized..  ** We
18130 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a   could initializ
18140 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68  e it, as shown h
18150 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20  ere, to silence 
18160 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73  those complaints
18170 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61  ..  ** But in fa
18180 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c  ct, mem1.u.i wil
18190 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79  l never actually
181a0 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69   be used uniniti
181b0 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e  alized, and doin
181c0 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65  g .  ** the unne
181d0 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69  cessary initiali
181e0 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61  zation has a mea
181f0 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65  surable negative
18200 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a   performance.  *
18210 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20  * impact, since 
18220 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
18230 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e  a very high runn
18240 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20  er.  And so, we 
18250 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69  choose.  ** to i
18260 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c  gnore the compil
18270 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20  er warnings and 
18280 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61  leave this varia
18290 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  ble uninitialize
182a0 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65  d..  */.  /*  me
182b0 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20  m1.u.i = 0;  // 
182c0 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65  not needed, here
182d0 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70   to silence comp
182e0 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  iler warning */.
182f0 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56    .  idx1 = getV
18300 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
18310 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73  zHdr1);.  d1 = s
18320 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28  zHdr1;.  assert(
18330 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
18340 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
18350 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
18360 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  eld || CORRUPT_D
18370 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
18380 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
18390 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
183a0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
183b0 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
183c0 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
183d0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
183e0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
183f0 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
18400 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
18410 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
18420 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
18430 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
18440 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
18450 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
18460 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
18470 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65  e1 );..    /* Ve
18480 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20  rify that there 
18490 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70  is enough key sp
184a0 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f  ace remaining to
184b0 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20   avoid.    ** a 
184c0 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e  buffer overread.
184d0 20 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c    The "d1+serial
184e0 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70  _type1+2" subexp
184f0 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  ression will.   
18500 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72   ** always be gr
18510 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
18520 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e  ual to the amoun
18530 74 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65  t of required ke
18540 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  y space..    ** 
18550 55 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69  Use that approxi
18560 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20  mation to avoid 
18570 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69  the more expensi
18580 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ve call to.    *
18590 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
185a0 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20  ialTypeLen() in 
185b0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
185c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
185d0 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  d1+serial_type1+
185e0 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20  2>(u32)nKey1.   
185f0 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56    && d1+sqlite3V
18600 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
18610 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28  (serial_type1)>(
18620 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29  u32)nKey1 .    )
18630 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
18640 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74     }..    /* Ext
18650 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  ract the values 
18660 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a  to be compared..
18670 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
18680 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
18690 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
186a0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
186b0 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem1);..    /* 
186c0 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
186d0 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
186e0 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
186f0 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65  are(&mem1, &pPKe
18700 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65  y2->aMem[i], pKe
18710 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29  yInfo->aColl[i])
18720 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
18730 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18740 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30   mem1.zMalloc==0
18750 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d   );  /* See comm
18760 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  ent below */.   
18770 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
18780 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
18790 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
187a0 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74  rc;  /* Invert t
187b0 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45  he result for DE
187c0 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a  SC sort order. *
187d0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
187e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
187f0 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69  .    i++;.  }whi
18800 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  le( idx1<szHdr1 
18810 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
18820 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  eld );..  /* No 
18830 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
18840 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
18850 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
18860 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
18870 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
18880 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
18890 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
188a0 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
188b0 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
188c0 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
188d0 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
188e0 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a  Release(&mem1)..
188f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
18900 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  em1.zMalloc==0 )
18910 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
18920 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
18930 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
18940 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
18950 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
18960 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
18970 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
18980 75 61 6c 2e 20 49 66 20 74 68 65 20 55 4e 50 41  ual. If the UNPA
18990 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a 20 20 2a  CKED_INCRKEY.  *
189a0 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  * flag is set, t
189b0 68 65 6e 20 62 72 65 61 6b 20 74 68 65 20 74 69  hen break the ti
189c0 65 20 62 79 20 74 72 65 61 74 69 6e 67 20 6b 65  e by treating ke
189d0 79 32 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20  y2 as larger..  
189e0 2a 2a 20 49 66 20 74 68 65 20 55 50 41 43 4b 45  ** If the UPACKE
189f0 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20 66  D_PREFIX_MATCH f
18a00 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
18a10 20 6b 65 79 73 20 77 69 74 68 20 63 6f 6d 6d 6f   keys with commo
18a20 6e 20 70 72 65 66 69 78 65 73 0a 20 20 2a 2a 20  n prefixes.  ** 
18a30 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
18a40 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 4f 74 68  o be equal.  Oth
18a50 65 72 77 69 73 65 2c 20 74 68 65 20 6c 6f 6e 67  erwise, the long
18a60 65 72 20 6b 65 79 20 69 73 20 74 68 65 20 0a 20  er key is the . 
18a70 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20 41 73 20   ** larger.  As 
18a80 69 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20  it happens, the 
18a90 70 50 4b 65 79 32 20 77 69 6c 6c 20 61 6c 77 61  pPKey2 will alwa
18aa0 79 73 20 62 65 20 74 68 65 20 6c 6f 6e 67 65 72  ys be the longer
18ab0 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 69  .  ** if there i
18ac0 73 20 61 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  s a difference..
18ad0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72    */.  assert( r
18ae0 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  c==0 );.  if( pP
18af0 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e  Key2->flags & UN
18b00 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 29  PACKED_INCRKEY )
18b10 7b 0a 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20  {.    rc = -1;. 
18b20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79   }else if( pPKey
18b30 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  2->flags & UNPAC
18b40 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48  KED_PREFIX_MATCH
18b50 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 65 61 76 65   ){.    /* Leave
18b60 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 7d 65 6c 73   rc==0 */.  }els
18b70 65 20 69 66 28 20 69 64 78 31 3c 73 7a 48 64 72  e if( idx1<szHdr
18b80 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  1 ){.    rc = 1;
18b90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
18ba0 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75  ;.}. ../*.** pCu
18bb0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69  r points at an i
18bc0 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74  ndex entry creat
18bd0 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  ed using the OP_
18be0 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
18bf0 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72  e..** Read the r
18c00 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66  owid (the last f
18c10 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f  ield in the reco
18c20 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74  rd) and store it
18c30 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52   in *rowid..** R
18c40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
18c50 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
18c60 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72  rks, or an error
18c70 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
18c80 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68  .**.** pCur migh
18c90 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  t be pointing to
18ca0 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66   text obtained f
18cb0 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  rom a corrupt da
18cc0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
18cd0 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63  So the content c
18ce0 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
18cf0 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74  .  Do appropriat
18d00 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20  e checks on the 
18d10 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  content..*/.int 
18d20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
18d30 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  wid(sqlite3 *db,
18d40 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
18d50 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20   i64 *rowid){.  
18d60 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
18d70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
18d80 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20  2 szHdr;        
18d90 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68  /* Size of the h
18da0 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74  eader */.  u32 t
18db0 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20  ypeRowid;    /* 
18dc0 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  Serial type of t
18dd0 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33  he rowid */.  u3
18de0 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20  2 lenRowid;     
18df0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72  /* Size of the r
18e00 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c  owid */.  Mem m,
18e10 20 76 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   v;..  UNUSED_PA
18e20 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 0a 20 20  RAMETER(db);..  
18e30 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a 65 20  /* Get the size 
18e40 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
18e50 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65  ry.  Only indice
18e60 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73  s entries of les
18e70 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42  s.  ** than 2GiB
18e80 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61   are support - a
18e90 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75  nything large mu
18ea0 73 74 20 62 65 20 64 61 74 61 62 61 73 65 20 63  st be database c
18eb0 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20  orruption..  ** 
18ec0 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  Any corruption i
18ed0 73 20 64 65 74 65 63 74 65 64 20 69 6e 20 73 71  s detected in sq
18ee0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
18ef0 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68  ellPtr(), though
18f00 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63  , so.  ** this c
18f10 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61  ode can safely a
18f20 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c  ssume that nCell
18f30 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73 20 20  Key is 32-bits  
18f40 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
18f50 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
18f60 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20  orIsValid(pCur) 
18f70 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63  );.  VVA_ONLY(rc
18f80 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 65   =) sqlite3Btree
18f90 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  KeySize(pCur, &n
18fa0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65  CellKey);.  asse
18fb0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
18fc0 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70 43 75 72  K );     /* pCur
18fd0 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
18fe0 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e   so KeySize cann
18ff0 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73  ot fail */.  ass
19000 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26  ert( (nCellKey &
19010 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29   SQLITE_MAX_U32)
19020 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20  ==(u64)nCellKey 
19030 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e  );..  /* Read in
19040 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f   the complete co
19050 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64  ntent of the ind
19060 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 65  ex entry */.  me
19070 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65  mset(&m, 0, size
19080 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73  of(m));.  rc = s
19090 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
190a0 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
190b0 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (u32)nCellKey, 1
190c0 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
190d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
190e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
190f0 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74  index entry must
19100 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65   begin with a he
19110 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28  ader size */.  (
19120 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
19130 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72  ((u8*)m.z, szHdr
19140 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
19150 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73  zHdr==3 );.  tes
19160 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e  tcase( szHdr==m.
19170 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  n );.  if( unlik
19180 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28  ely(szHdr<3 || (
19190 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29  int)szHdr>m.n) )
191a0 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
191b0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
191c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
191d0 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ast field of the
191e0 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65   index should be
191f0 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68   an integer - th
19200 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65  e ROWID..  ** Ve
19210 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61  rify that the la
19220 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20  st entry really 
19230 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a  is an integer. *
19240 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
19250 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
19260 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f  szHdr-1], typeRo
19270 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
19280 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29  ( typeRowid==1 )
19290 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
192a0 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20  peRowid==2 );.  
192b0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
192c0 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  wid==3 );.  test
192d0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
192e0 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =4 );.  testcase
192f0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29  ( typeRowid==5 )
19300 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
19310 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20  peRowid==6 );.  
19320 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
19330 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74  wid==8 );.  test
19340 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
19350 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  =9 );.  if( unli
19360 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31  kely(typeRowid<1
19370 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20   || typeRowid>9 
19380 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29  || typeRowid==7)
19390 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
193a0 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
193b0 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  n;.  }.  lenRowi
193c0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  d = sqlite3VdbeS
193d0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70  erialTypeLen(typ
193e0 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
193f0 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73  ase( (u32)m.n==s
19400 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b  zHdr+lenRowid );
19410 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
19420 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c  (u32)m.n<szHdr+l
19430 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20  enRowid) ){.    
19440 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
19450 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
19460 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69    /* Fetch the i
19470 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65  nteger off the e
19480 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
19490 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
194a0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
194b0 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c  ((u8*)&m.z[m.n-l
194c0 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f  enRowid], typeRo
194d0 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77  wid, &v);.  *row
194e0 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71  id = v.u.i;.  sq
194f0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
19500 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
19510 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
19520 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
19530 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
19540 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
19550 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e  after m has been
19560 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e  .  ** allocated.
19570 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a    Free the m obj
19580 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
19590 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a  QLITE_CORRUPT. *
195a0 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  /.idx_rowid_corr
195b0 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61  uption:.  testca
195c0 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30  se( m.zMalloc!=0
195d0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
195e0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
195f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19600 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d  _CORRUPT_BKPT;.}
19610 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
19620 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69  the key of the i
19630 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
19640 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69  cursor pC is poi
19650 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74  nting to against
19660 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69  .** the key stri
19670 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e  ng in pUnpacked.
19680 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52    Write into *pR
19690 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74  es a number.** t
196a0 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c  hat is negative,
196b0 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
196c0 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73  ve if pC is less
196d0 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
196e0 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74  .** or greater t
196f0 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20  han pUnpacked.  
19700 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
19710 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a   on success..**.
19720 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20  ** pUnpacked is 
19730 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77  either created w
19740 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f  ithout a rowid o
19750 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73  r is truncated s
19760 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69  o that it.** omi
19770 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20  ts the rowid at 
19780 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f  the end.  The ro
19790 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  wid at the end o
197a0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
197b0 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20  y.** is ignored 
197c0 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c  as well.  Hence,
197d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
197e0 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  ly compares the 
197f0 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20  prefixes .** of 
19800 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74  the keys prior t
19810 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  o the final rowi
19820 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72  d, not the entir
19830 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e key..*/.int sq
19840 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43  lite3VdbeIdxKeyC
19850 6f 6d 70 61 72 65 28 0a 20 20 56 64 62 65 43 75  ompare(.  VdbeCu
19860 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20  rsor *pC,       
19870 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
19880 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
19890 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61  gainst */.  Unpa
198a0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70  ckedRecord *pUnp
198b0 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63  acked,  /* Unpac
198c0 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b  ked version of k
198d0 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67  ey to compare ag
198e0 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  ainst */.  int *
198f0 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  res             
19900 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
19910 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72  the comparison r
19920 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b  esult here */.){
19930 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
19940 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
19950 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
19960 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20  = pC->pCursor;. 
19970 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72   Mem m;..  asser
19980 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
19990 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
199a0 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  r) );.  VVA_ONLY
199b0 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74  (rc =) sqlite3Bt
199c0 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
199d0 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61   &nCellKey);.  a
199e0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
199f0 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43  E_OK );    /* pC
19a00 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ur is always val
19a10 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61  id so KeySize ca
19a20 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f  nnot fail */.  /
19a30 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20  * nCellKey will 
19a40 61 6c 77 61 79 73 20 62 65 20 62 65 74 77 65 65  always be betwee
19a50 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66 66 66  n 0 and 0xffffff
19a60 66 66 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  ff because of th
19a70 65 20 73 61 79 0a 20 20 2a 2a 20 74 68 61 74 20  e say.  ** that 
19a80 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
19a90 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47  r() and sqlite3G
19aa0 65 74 56 61 72 69 6e 74 33 32 28 29 20 61 72 65  etVarint32() are
19ab0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a   implemented */.
19ac0 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d    if( nCellKey<=
19ad0 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78  0 || nCellKey>0x
19ae0 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  7fffffff ){.    
19af0 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  *res = 0;.    re
19b00 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
19b10 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
19b20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69  memset(&m, 0, si
19b30 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d  zeof(m));.  rc =
19b40 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
19b50 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75  romBtree(pC->pCu
19b60 72 73 6f 72 2c 20 30 2c 20 28 75 33 32 29 6e 43  rsor, 0, (u32)nC
19b70 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
19b80 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
19b90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
19ba0 20 61 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b   assert( pUnpack
19bb0 65 64 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41  ed->flags & UNPA
19bc0 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43  CKED_PREFIX_MATC
19bd0 48 20 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71  H );.  *res = sq
19be0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
19bf0 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c  ompare(m.n, m.z,
19c00 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73   pUnpacked);.  s
19c10 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
19c20 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
19c30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19c40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
19c50 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c  ine sets the val
19c60 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ue to be returne
19c70 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  d by subsequent 
19c80 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
19c90 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e  te3_changes() on
19ca0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
19cb0 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76  ndle 'db'. .*/.v
19cc0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
19cd0 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  etChanges(sqlite
19ce0 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e  3 *db, int nChan
19cf0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ge){.  assert( s
19d00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
19d10 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
19d20 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20    db->nChange = 
19d30 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e  nChange;.  db->n
19d40 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e  TotalChange += n
19d50 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
19d60 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74   Set a flag in t
19d70 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74  he vdbe to updat
19d80 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
19d90 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20  nter when it is 
19da0 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20  finalised.** or 
19db0 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reset..*/.void s
19dc0 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43  qlite3VdbeCountC
19dd0 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b  hanges(Vdbe *v){
19de0 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  .  v->changeCntO
19df0 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 1;.}../*.** 
19e00 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61  Mark every prepa
19e10 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73  red statement as
19e20 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
19e30 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
19e40 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65  ion.** as expire
19e50 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69  d..**.** An expi
19e60 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65  red statement me
19e70 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69  ans that recompi
19e80 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  lation of the st
19e90 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65  atement is.** re
19ea0 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d  commend.  Statem
19eb0 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e  ents expire when
19ec0 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74   things happen t
19ed0 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a  hat make their.*
19ee0 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c  * programs obsol
19ef0 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75  ete.  Removing u
19f00 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
19f10 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69  tions or collati
19f20 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c  ng.** sequences,
19f30 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20   or changing an 
19f40 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75  authorization fu
19f50 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74  nction are the t
19f60 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67  ypes of.** thing
19f70 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70  s that make prep
19f80 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
19f90 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69  obsolete..*/.voi
19fa0 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50  d sqlite3ExpireP
19fb0 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
19fc0 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
19fd0 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72    Vdbe *p;.  for
19fe0 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20  (p = db->pVdbe; 
19ff0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
1a000 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d      p->expired =
1a010 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
1a020 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
1a030 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  base associated 
1a040 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a  with the Vdbe..*
1a050 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74  /.sqlite3 *sqlit
1a060 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76  e3VdbeDb(Vdbe *v
1a070 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64  ){.  return v->d
1a080 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  b;.}../*.** Retu
1a090 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1a0a0 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  an sqlite3_value
1a0b0 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
1a0c0 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
1a0d0 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74  bound.** paramet
1a0e0 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e  er iVar of VM v.
1a0f0 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20   Except, if the 
1a100 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20  value is an SQL 
1a110 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  NULL, return .**
1a120 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65   0 instead. Unle
1a130 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61  ss it is NULL, a
1a140 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66  pply affinity af
1a150 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51  f (one of the SQ
1a160 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f  LITE_AFF_*.** co
1a170 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20  nstants) to the 
1a180 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74  value before ret
1a190 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a  urning it..**.**
1a1a0 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
1a1b0 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65  lue must be free
1a1c0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
1a1d0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c  using sqlite3Val
1a1e0 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c  ueFree()..*/.sql
1a1f0 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69  ite3_value *sqli
1a200 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56  te3VdbeGetBoundV
1a210 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e  alue(Vdbe *v, in
1a220 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b  t iVar, u8 aff){
1a230 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e  .  assert( iVar>
1a240 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  0 );.  if( v ){.
1a250 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
1a260 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d  &v->aVar[iVar-1]
1a270 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d  ;.    if( 0==(pM
1a280 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
1a290 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73  Null) ){.      s
1a2a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52  qlite3_value *pR
1a2b0 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  et = sqlite3Valu
1a2c0 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20  eNew(v->db);.   
1a2d0 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
1a2e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1a2f0 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a  beMemCopy((Mem *
1a300 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20  )pRet, pMem);.  
1a310 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
1a320 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  ueApplyAffinity(
1a330 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54  pRet, aff, SQLIT
1a340 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 20  E_UTF8);.       
1a350 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
1a360 74 6f 72 65 54 79 70 65 28 28 4d 65 6d 20 2a 29  toreType((Mem *)
1a370 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pRet);.      }. 
1a380 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74       return pRet
1a390 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1a3a0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1a3b0 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76   Configure SQL v
1a3c0 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20  ariable iVar so 
1a3d0 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e  that binding a n
1a3e0 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73  ew value to it s
1a3f0 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c  ignals.** to sql
1a400 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28  ite3_reoptimize(
1a410 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72  ) that re-prepar
1a420 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ing the statemen
1a430 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20  t may result.** 
1a440 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72  in a better quer
1a450 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  y plan..*/.void 
1a460 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
1a470 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69  rmask(Vdbe *v, i
1a480 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65  nt iVar){.  asse
1a490 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
1a4a0 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20  if( iVar>32 ){. 
1a4b0 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20     v->expmask = 
1a4c0 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65  0xffffffff;.  }e
1a4d0 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d  lse{.    v->expm
1a4e0 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c  ask |= ((u32)1 <
1a4f0 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d  < (iVar-1));.  }
1a500 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1a510 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1a520 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ABLE./*.** Trans
1a530 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  fer error messag
1a540 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73  e text from an s
1a550 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72  qlite3_vtab.zErr
1a560 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64  Msg (text stored
1a570 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  .** in memory ob
1a580 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1a590 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f  te3_malloc) into
1a5a0 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20   a Vdbe.zErrMsg 
1a5b0 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20  (text stored.** 
1a5c0 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
1a5d0 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
1a5e0 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69  bMalloc)..*/.voi
1a5f0 64 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70  d sqlite3VtabImp
1a600 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a  ortErrmsg(Vdbe *
1a610 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  p, sqlite3_vtab 
1a620 2a 70 56 74 61 62 29 7b 0a 20 20 73 71 6c 69 74  *pVtab){.  sqlit
1a630 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
1a640 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1a650 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
1a660 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
1a670 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
1a680 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  db, pVtab->zErrM
1a690 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  sg);.  sqlite3_f
1a6a0 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ree(pVtab->zErrM
1a6b0 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45  sg);.  pVtab->zE
1a6c0 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a 23 65 6e  rrMsg = 0;.}.#en
1a6d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1a6e0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
1a6f0 2a 2f 0a                                         */.