/ Hex Artifact Content
Login

Artifact 636a7e2eaaa48c3e3585b28b9b1673df78fc0fad:


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: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
a320: 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50    zP4 = displayP
a330: 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  4(pOp, pMem->z, 
a340: 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 34  32);.    if( zP4
a350: 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20  !=pMem->z ){.   
a360: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
a370: 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50  mSetStr(pMem, zP
a380: 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  4, -1, SQLITE_UT
a390: 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  F8, 0);.    }els
a3a0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
a3b0: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20   pMem->z!=0 );. 
a3c0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
a3d0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
a3e0: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70  Mem->z);.      p
a3f0: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
a400: 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20  E_UTF8;.    }.  
a410: 20 20 70 4d 65 6d 2d 3e 6d 65 6d 54 79 70 65 20    pMem->memType 
a420: 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 70  = MEM_Str;.    p
a430: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
a440: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
a450: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
a460: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d  e3VdbeMemGrow(pM
a470: 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20  em, 4, 0) ){.   
a480: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a490: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a4a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
a4b0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
a4c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
a4d0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
a4e0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
a4f0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32       pMem->n = 2
a500: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
a510: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
a520: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
a530: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
a540: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6d 65  /.      pMem->me
a550: 6d 54 79 70 65 20 3d 20 4d 45 4d 5f 53 74 72 3b  mType = MEM_Str;
a560: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
a570: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
a580: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
a590: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
a5a0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
a5b0: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28  MMENTS.      if(
a5c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
a5d0: 72 6f 77 28 70 4d 65 6d 2c 20 35 30 30 2c 20 30  row(pMem, 500, 0
a5e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
a5f0: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
a600: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
a610: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a620: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
a630: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
a640: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
a650: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
a660: 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f  m->n = displayCo
a670: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
a680: 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20  pMem->z, 500);. 
a690: 20 20 20 20 20 70 4d 65 6d 2d 3e 6d 65 6d 54 79       pMem->memTy
a6a0: 70 65 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20  pe = MEM_Str;.  
a6b0: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
a6c0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c  SQLITE_UTF8;.#el
a6d0: 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  se.      pMem->f
a6e0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a700: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e         /* Commen
a710: 74 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  t */.      pMem-
a720: 3e 6d 65 6d 54 79 70 65 20 3d 20 4d 45 4d 5f 4e  >memType = MEM_N
a730: 75 6c 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ull;.#endif.    
a740: 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f  }..    p->nResCo
a750: 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d  lumn = 8 - 4*(p-
a760: 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20  >explain-1);.   
a770: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
a780: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20   &p->aMem[1];.  
a790: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
a7a0: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
a7b0: 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20  LITE_ROW;.  }.  
a7c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
a7d0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
a7e0: 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23  IT_EXPLAIN */..#
a7f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
a800: 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  UG./*.** Print t
a810: 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20  he SQL that was 
a820: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
a830: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e   a VDBE program.
a840: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a850: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62  VdbePrintSql(Vdb
a860: 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63  e *p){.  const c
a870: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66  har *z = 0;.  if
a880: 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20  ( p->zSql ){.   
a890: 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20   z = p->zSql;.  
a8a0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70  }else if( p->nOp
a8b0: 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  >=1 ){.    const
a8c0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
a8d0: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69  p->aOp[0];.    i
a8e0: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
a8f0: 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e  OP_Init && pOp->
a900: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20  p4.z!=0 ){.     
a910: 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a   z = pOp->p4.z;.
a920: 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c        while( sql
a930: 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20  ite3Isspace(*z) 
a940: 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) z++;.    }.  }
a950: 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74  .  if( z ) print
a960: 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  f("SQL: [%s]\n",
a970: 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23   z);.}.#endif..#
a980: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
a990: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
a9a0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
a9b0: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
a9c0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
a9d0: 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20  IOTRACE message 
a9e0: 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74  showing SQL cont
a9f0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
aa00: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
aa10: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
aa20: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
aa30: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
aa40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54    if( sqlite3IoT
aa50: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
aa60: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
aa70: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
aa80: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
aa90: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
aaa0: 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70  P_Init && pOp->p
aab0: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  4.z!=0 ){.    in
aac0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72  t i, j;.    char
aad0: 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71   z[1000];.    sq
aae0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
aaf0: 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73  izeof(z), z, "%s
ab00: 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  ", pOp->p4.z);. 
ab10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69     for(i=0; sqli
ab20: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29  te3Isspace(z[i])
ab30: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72  ; i++){}.    for
ab40: 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (j=0; z[i]; i++)
ab50: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
ab60: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29  te3Isspace(z[i])
ab70: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
ab80: 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20  z[i-1]!=' ' ){. 
ab90: 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20           z[j++] 
aba0: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d  = ' ';.        }
abb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
abc0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a        z[j++] = z
abd0: 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
abe0: 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b   }.    z[j] = 0;
abf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72  .    sqlite3IoTr
ac00: 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20  ace("SQL %s\n", 
ac10: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
ac20: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
ac30: 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45  _TRACE && SQLITE
ac40: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
ac50: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  */../*.** Alloca
ac60: 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20  te space from a 
ac70: 66 69 78 65 64 20 73 69 7a 65 20 62 75 66 66 65  fixed size buffe
ac80: 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  r and return a p
ac90: 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61  ointer to.** tha
aca0: 74 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73  t space.  If ins
acb0: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
acc0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
acd0: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
ace0: 20 54 68 65 20 70 42 75 66 20 70 61 72 61 6d 65   The pBuf parame
acf0: 74 65 72 20 69 73 20 74 68 65 20 69 6e 69 74 69  ter is the initi
ad00: 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f  al value of a po
ad10: 69 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c  inter which will
ad20: 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65 20  .** receive the 
ad30: 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75  new memory.  pBu
ad40: 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55  f is normally NU
ad50: 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73 20  LL.  If pBuf is 
ad60: 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20  not.** NULL, it 
ad70: 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72  means that memor
ad80: 79 20 73 70 61 63 65 20 68 61 73 20 61 6c 72 65  y space has alre
ad90: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
ada0: 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74  ed and that.** t
adb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
adc0: 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20  ld not allocate 
add0: 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20  any new memory. 
ade0: 20 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f   When pBuf is no
adf0: 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79  t.** NULL simply
ae00: 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f   return pBuf.  O
ae10: 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77  nly allocate new
ae20: 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68   memory space wh
ae30: 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55  en pBuf.** is NU
ae40: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20  LL..**.** nByte 
ae50: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
ae60: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
ae70: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70  needed..**.** *p
ae80: 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20  pFrom points to 
ae90: 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 20  available space 
aea0: 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73 20  and pEnd points 
aeb0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
aec0: 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73  e.** available s
aed0: 70 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61 63  pace.  When spac
aee0: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20  e is allocated, 
aef0: 2a 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61 6e  *ppFrom is advan
af00: 63 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ced past.** the 
af10: 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  end of the alloc
af20: 61 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a  ated space..**.*
af30: 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63  * *pnByte is a c
af40: 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75  ounter of the nu
af50: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
af60: 20 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65   space that have
af70: 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c   failed.** to al
af80: 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72  locate.  If ther
af90: 65 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e  e is insufficien
afa0: 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72  t space in *ppFr
afb0: 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  om to satisfy th
afc0: 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68  e.** request, th
afd0: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e  en increment *pn
afe0: 42 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75  Byte by the amou
aff0: 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  nt of the reques
b000: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
b010: 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20  d *allocSpace(. 
b020: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
b030: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72        /* Where r
b040: 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69  eturn pointer wi
b050: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a  ll be stored */.
b060: 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
b070: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b080: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c   of bytes to all
b090: 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a  ocate */.  u8 **
b0a0: 70 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20  ppFrom,         
b0b0: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63  /* IN/OUT: Alloc
b0c0: 61 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d  ate from *ppFrom
b0d0: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20   */.  u8 *pEnd, 
b0e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
b0f0: 69 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65 20  inter to 1 byte 
b100: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
b110: 2a 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a  *ppFrom buffer *
b120: 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20  /.  int *pnByte 
b130: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
b140: 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  llocation cannot
b150: 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d   be made, increm
b160: 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29  ent *pnByte */.)
b170: 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  {.  assert( EIGH
b180: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
b190: 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69  (*ppFrom) );.  i
b1a0: 66 28 20 70 42 75 66 20 29 20 72 65 74 75 72 6e  f( pBuf ) return
b1b0: 20 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d   pBuf;.  nByte =
b1c0: 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a   ROUND8(nByte);.
b1d0: 20 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29    if( &(*ppFrom)
b1e0: 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20  [nByte] <= pEnd 
b1f0: 29 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28 76  ){.    pBuf = (v
b200: 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20  oid*)*ppFrom;.  
b210: 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79    *ppFrom += nBy
b220: 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  te;.  }else{.   
b230: 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74   *pnByte += nByt
b240: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
b250: 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pBuf;.}../*.** R
b260: 65 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62  ewind the VDBE b
b270: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
b280: 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74  ning in preparat
b290: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69  ion for.** runni
b2a0: 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ng it..*/.void s
b2b0: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
b2c0: 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64  (Vdbe *p){.#if d
b2d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
b2e0: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
b2f0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
b300: 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20  int i;.#endif.  
b310: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
b320: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
b330: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
b340: 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  NIT );..  /* The
b350: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20  re should be at 
b360: 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65  least one opcode
b370: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
b380: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20   p->nOp>0 );..  
b390: 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63  /* Set the magic
b3a0: 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   to VDBE_MAGIC_R
b3b0: 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  UN sooner rather
b3c0: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a   than later. */.
b3d0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
b3e0: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69  E_MAGIC_RUN;..#i
b3f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
b400: 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70  G.  for(i=1; i<p
b410: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nMem; i++){.  
b420: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65    assert( p->aMe
b430: 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29  m[i].db==p->db )
b440: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
b450: 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e  ->pc = -1;.  p->
b460: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b470: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
b480: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
b490: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
b4a0: 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e  AGIC_RUN;.  p->n
b4b0: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d  Change = 0;.  p-
b4c0: 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20  >cacheCtr = 1;. 
b4d0: 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65   p->minWriteFile
b4e0: 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20  Format = 255;.  
b4f0: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20  p->iStatement = 
b500: 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74  0;.  p->nFkConst
b510: 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65  raint = 0;.#ifde
b520: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
b530: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
b540: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d  Op; i++){.    p-
b550: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b  >aOp[i].cnt = 0;
b560: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  .    p->aOp[i].c
b570: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23  ycles = 0;.  }.#
b580: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  endif.}../*.** P
b590: 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c  repare a virtual
b5a0: 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65   machine for exe
b5b0: 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66  cution for the f
b5c0: 69 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a  irst time after.
b5d0: 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  ** creating the 
b5e0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
b5f0: 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20    This involves 
b600: 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61  things such.** a
b610: 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61  s allocating sta
b620: 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69  ck space and ini
b630: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72  tializing the pr
b640: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a  ogram counter..*
b650: 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45  * After the VDBE
b660: 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c   has be prepped,
b670: 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75   it can be execu
b680: 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f  ted by one or mo
b690: 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  re.** calls to s
b6a0: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
b6b0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  .  .**.** This f
b6c0: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
b6d0: 61 6c 6c 65 64 20 65 78 61 63 74 20 6f 6e 63 65  alled exact once
b6e0: 20 6f 6e 20 61 20 65 61 63 68 20 76 69 72 74 75   on a each virtu
b6f0: 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41  al machine..** A
b700: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
b710: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  e is called the 
b720: 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61 63  VM has been "pac
b730: 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20 72 65  kaged" and is re
b740: 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20  ady.** to run.  
b750: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
b760: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75  ne is called, fu
b770: 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a  ther calls to .*
b780: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  * sqlite3VdbeAdd
b790: 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  Op() functions a
b7a0: 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20  re prohibited.  
b7b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73  This routine dis
b7c0: 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20  connects.** the 
b7d0: 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61  Vdbe from the Pa
b7e0: 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  rse object that 
b7f0: 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20  helped generate 
b800: 69 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a  it so that the.*
b810: 2a 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d  * the Vdbe becom
b820: 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e  es an independen
b830: 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65  t entity and the
b840: 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61   Parse object ca
b850: 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65  n be.** destroye
b860: 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  d..**.** Use the
b870: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
b880: 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74  nd() procedure t
b890: 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74  o restore a virt
b8a0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b  ual machine back
b8b0: 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69  .** to its initi
b8c0: 61 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69  al state after i
b8d0: 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a  t has been run..
b8e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
b8f0: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20  dbeMakeReady(.  
b900: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b920: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20  * The VDBE */.  
b930: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20  Parse *pParse   
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b950: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
b960: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
b970: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
b980: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b990: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
b9a0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  ion */.  int nVa
b9b0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
b9c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b9d0: 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20  r of parameters 
b9e0: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20  */.  int nMem;  
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ba10: 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73   VM memory regis
ba20: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ters */.  int nC
ba30: 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20  ursor;          
ba40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ba50: 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65  er of cursors re
ba60: 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  quired */.  int 
ba70: 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  nArg;           
ba80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ba90: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
baa0: 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73  s in subprograms
bab0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b   */.  int nOnce;
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bad0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
bae0: 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75  f OP_Once instru
baf0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
bb00: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
bb10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
bb20: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
bb30: 75 38 20 2a 7a 43 73 72 3b 20 20 20 20 20 20 20  u8 *zCsr;       
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb50: 2a 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62  * Memory availab
bb60: 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f  le for allocatio
bb70: 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e 64 3b  n */.  u8 *zEnd;
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
bba0: 79 74 65 20 70 61 73 74 20 61 6c 6c 6f 63 61 74  yte past allocat
bbb0: 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
bbc0: 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bbe0: 20 48 6f 77 20 6d 75 63 68 20 65 78 74 72 61 20   How much extra 
bbf0: 6d 65 6d 6f 72 79 20 69 73 20 6e 65 65 64 65 64  memory is needed
bc00: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
bc10: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
bc20: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61   p->nOp>0 );.  a
bc30: 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
bc40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
bc50: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
bc60: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
bc70: 65 72 74 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e  ert( pParse==p->
bc80: 70 50 61 72 73 65 20 29 3b 0a 20 20 64 62 20 3d  pParse );.  db =
bc90: 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
bca0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
bcb0: 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20  ed==0 );.  nVar 
bcc0: 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  = pParse->nVar;.
bcd0: 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d    nMem = pParse-
bce0: 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72  >nMem;.  nCursor
bcf0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
bd00: 0a 20 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65  .  nArg = pParse
bd10: 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e  ->nMaxArg;.  nOn
bd20: 63 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e  ce = pParse->nOn
bd30: 63 65 3b 0a 20 20 69 66 28 20 6e 4f 6e 63 65 3d  ce;.  if( nOnce=
bd40: 3d 30 20 29 20 6e 4f 6e 63 65 20 3d 20 31 3b 20  =0 ) nOnce = 1; 
bd50: 2f 2a 20 45 6e 73 75 72 65 20 61 74 20 6c 65 61  /* Ensure at lea
bd60: 73 74 20 6f 6e 65 20 62 79 74 65 20 69 6e 20 70  st one byte in p
bd70: 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f  ->aOnceFlag[] */
bd80: 0a 20 20 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63  .  .  /* For eac
bd90: 68 20 63 75 72 73 6f 72 20 72 65 71 75 69 72 65  h cursor require
bda0: 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  d, also allocate
bdb0: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20   a memory cell. 
bdc0: 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c  Memory.  ** cell
bdd0: 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f  s (nMem+1-nCurso
bde0: 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73  r)..nMem, inclus
bdf0: 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20  ive, will never 
be00: 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20  be used by.  ** 
be10: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
be20: 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79 20 61  . Instead they a
be30: 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  re used to alloc
be40: 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20  ate space for.  
be50: 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74  ** VdbeCursor/Bt
be60: 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65  Cursor structure
be70: 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d  s. The blob of m
be80: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
be90: 20 77 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73   with .  ** curs
bea0: 6f 72 20 30 20 69 73 20 73 74 6f 72 65 64 20 69  or 0 is stored i
beb0: 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d  n memory cell nM
bec0: 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20  em. Memory cell 
bed0: 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74  (nMem-1).  ** st
bee0: 6f 72 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66  ores the blob of
bef0: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
bf00: 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 31  ed with cursor 1
bf10: 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  , etc..  **.  **
bf20: 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63   See also: alloc
bf30: 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a  ateCursor()..  *
bf40: 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72  /.  nMem += nCur
bf50: 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  sor;..  /* Alloc
bf60: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
bf70: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 2c 20  mory registers, 
bf80: 53 51 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56  SQL variables, V
bf90: 44 42 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20  DBE cursors and 
bfa0: 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74  .  ** an array t
bfb0: 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75  o marshal SQL fu
bfc0: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
bfd0: 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7a 43 73 72   in..  */.  zCsr
bfe0: 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b   = (u8*)&p->aOp[
bff0: 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20 20 20 20  p->nOp];        
c000: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76      /* Memory av
c010: 61 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f  aliable for allo
c020: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64  cation */.  zEnd
c030: 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b   = (u8*)&p->aOp[
c040: 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63  pParse->nOpAlloc
c050: 5d 3b 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74  ];  /* First byt
c060: 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20 7a 43  e past end of zC
c070: 73 72 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c  sr[] */..  resol
c080: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e  veP2Values(p, &n
c090: 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53  Arg);.  p->usesS
c0a0: 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  tmtJournal = (u8
c0b0: 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74  )(pParse->isMult
c0c0: 69 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65  iWrite && pParse
c0d0: 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69  ->mayAbort);.  i
c0e0: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
c0f0: 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b  in && nMem<10 ){
c100: 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a  .    nMem = 10;.
c110: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73    }.  memset(zCs
c120: 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29  r, 0, zEnd-zCsr)
c130: 3b 0a 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73  ;.  zCsr += (zCs
c140: 72 20 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20  r - (u8*)0)&7;. 
c150: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
c160: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43  YTE_ALIGNMENT(zC
c170: 73 72 29 20 29 3b 0a 20 20 70 2d 3e 65 78 70 69  sr) );.  p->expi
c180: 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d  red = 0;..  /* M
c190: 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74  emory for regist
c1a0: 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c  ers, parameters,
c1b0: 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73   cursor, etc, is
c1c0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77   allocated in tw
c1d0: 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20  o.  ** passes.  
c1e0: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73  On the first pas
c1f0: 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75  s, we try to reu
c200: 73 65 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  se unused space 
c210: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64  at the .  ** end
c220: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
c230: 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65  rray.  If we are
c240: 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73   unable to satis
c250: 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20  fy all memory.  
c260: 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  ** requirements 
c270: 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f  by reusing the o
c280: 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c  pcode array tail
c290: 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e  , then the secon
c2a0: 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c  d.  ** pass will
c2b0: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73   fill in the res
c2c0: 74 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20  t using a fresh 
c2d0: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20  allocation.  .  
c2e0: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f  **.  ** This two
c2f0: 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74  -pass approach t
c300: 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75  hat reuses as mu
c310: 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
c320: 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20  sible from.  ** 
c330: 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61  the leftover spa
c340: 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
c350: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
c360: 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e  y can significan
c370: 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20  tly.  ** reduce 
c380: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65  the amount of me
c390: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70  mory held by a p
c3a0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
c3b0: 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20  t..  */.  do {. 
c3c0: 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20     nByte = 0;.  
c3d0: 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f    p->aMem = allo
c3e0: 63 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20  cSpace(p->aMem, 
c3f0: 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nMem*sizeof(Mem)
c400: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
c410: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
c420: 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Var = allocSpace
c430: 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73  (p->aVar, nVar*s
c440: 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73  izeof(Mem), &zCs
c450: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
c460: 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d  ;.    p->apArg =
c470: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
c480: 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f  pArg, nArg*sizeo
c490: 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20  f(Mem*), &zCsr, 
c4a0: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
c4b0: 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c     p->azVar = al
c4c0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61  locSpace(p->azVa
c4d0: 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63  r, nVar*sizeof(c
c4e0: 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45  har*), &zCsr, zE
c4f0: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
c500: 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f   p->apCsr = allo
c510: 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c  cSpace(p->apCsr,
c520: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
c530: 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20  VdbeCursor*),.  
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c550: 20 20 20 20 20 20 20 20 26 7a 43 73 72 2c 20 7a          &zCsr, z
c560: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
c570: 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d    p->aOnceFlag =
c580: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
c590: 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 2c  OnceFlag, nOnce,
c5a0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
c5b0: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  Byte);.    if( n
c5c0: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70 2d  Byte ){.      p-
c5d0: 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33  >pFree = sqlite3
c5e0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
c5f0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20   nByte);.    }. 
c600: 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72     zCsr = p->pFr
c610: 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26  ee;.    zEnd = &
c620: 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d  zCsr[nByte];.  }
c630: 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20  while( nByte && 
c640: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
c650: 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73  d );..  p->nCurs
c660: 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20  or = nCursor;.  
c670: 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e  p->nOnceFlag = n
c680: 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61  Once;.  if( p->a
c690: 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56  Var ){.    p->nV
c6a0: 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72  ar = (ynVar)nVar
c6b0: 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e  ;.    for(n=0; n
c6c0: 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20  <nVar; n++){.   
c6d0: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c     p->aVar[n].fl
c6e0: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
c6f0: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
c700: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a  .db = db;.    }.
c710: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56    }.  if( p->azV
c720: 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56  ar ){.    p->nzV
c730: 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56  ar = pParse->nzV
c740: 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ar;.    memcpy(p
c750: 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d  ->azVar, pParse-
c760: 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72  >azVar, p->nzVar
c770: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72  *sizeof(p->azVar
c780: 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  [0]));.    memse
c790: 74 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  t(pParse->azVar,
c7a0: 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61   0, pParse->nzVa
c7b0: 72 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d  r*sizeof(pParse-
c7c0: 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d  >azVar[0]));.  }
c7d0: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
c7e0: 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b  {.    p->aMem--;
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20        /* aMem[] 
c810: 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65  goes from 1..nMe
c820: 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d  m */.    p->nMem
c830: 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20   = nMem;        
c840: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20           /*     
c850: 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d    not from 0..nM
c860: 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28  em-1 */.    for(
c870: 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b  n=1; n<=nMem; n+
c880: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65  +){.      p->aMe
c890: 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  m[n].flags = MEM
c8a0: 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20  _Undefined;.    
c8b0: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20    p->aMem[n].db 
c8c0: 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = db;.    }.  }.
c8d0: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70    p->explain = p
c8e0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a  Parse->explain;.
c8f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77    sqlite3VdbeRew
c900: 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ind(p);.}../*.**
c910: 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75   Close a VDBE cu
c920: 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65  rsor and release
c930: 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63   all the resourc
c940: 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a  es that cursor .
c950: 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f  ** happens to ho
c960: 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
c970: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
c980: 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43  r(Vdbe *p, VdbeC
c990: 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69  ursor *pCx){.  i
c9a0: 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20  f( pCx==0 ){.   
c9b0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
c9c0: 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
c9d0: 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78  Close(p->db, pCx
c9e0: 29 3b 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42  );.  if( pCx->pB
c9f0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
ca00: 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e  BtreeClose(pCx->
ca10: 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  pBt);.    /* The
ca20: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69   pCx->pCursor wi
ca30: 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f  ll be close auto
ca40: 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74  matically, if it
ca50: 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20   exists, by.    
ca60: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  ** the call abov
ca70: 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  e. */.  }else if
ca80: 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29  ( pCx->pCursor )
ca90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
caa0: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43  eeCloseCursor(pC
cab0: 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d  x->pCursor);.  }
cac0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cad0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
cae0: 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74  E.  if( pCx->pVt
caf0: 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  abCursor ){.    
cb00: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
cb10: 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
cb20: 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72   = pCx->pVtabCur
cb30: 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73  sor;.    const s
cb40: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
cb50: 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 43 75  Module = pVtabCu
cb60: 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f  rsor->pVtab->pMo
cb70: 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  dule;.    p->inV
cb80: 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20  tabMethod = 1;. 
cb90: 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f     pModule->xClo
cba0: 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b  se(pVtabCursor);
cbb0: 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  .    p->inVtabMe
cbc0: 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  thod = 0;.  }.#e
cbd0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ndif.}../*.** Co
cbe0: 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 73 74  py the values st
cbf0: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62 65  ored in the Vdbe
cc00: 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 65 20  Frame structure 
cc10: 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68 69  to its Vdbe. Thi
cc20: 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f  s.** is used, fo
cc30: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
cc40: 61 20 74 72 69 67 67 65 72 20 73 75 62 2d 70 72  a trigger sub-pr
cc50: 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20  ogram is halted 
cc60: 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f  to restore.** co
cc70: 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69  ntrol to the mai
cc80: 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e  n program..*/.in
cc90: 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  t sqlite3VdbeFra
cca0: 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 46 72  meRestore(VdbeFr
ccb0: 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20  ame *pFrame){.  
ccc0: 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65  Vdbe *v = pFrame
ccd0: 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 6e 63 65 46  ->v;.  v->aOnceF
cce0: 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  lag = pFrame->aO
ccf0: 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f  nceFlag;.  v->nO
cd00: 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65  nceFlag = pFrame
cd10: 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76  ->nOnceFlag;.  v
cd20: 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e  ->aOp = pFrame->
cd30: 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20  aOp;.  v->nOp = 
cd40: 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76  pFrame->nOp;.  v
cd50: 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->aMem = pFrame-
cd60: 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d  >aMem;.  v->nMem
cd70: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b   = pFrame->nMem;
cd80: 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46  .  v->apCsr = pF
cd90: 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76  rame->apCsr;.  v
cda0: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61  ->nCursor = pFra
cdb0: 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76  me->nCursor;.  v
cdc0: 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20  ->db->lastRowid 
cdd0: 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f  = pFrame->lastRo
cde0: 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67  wid;.  v->nChang
cdf0: 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61  e = pFrame->nCha
ce00: 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  nge;.  return pF
ce10: 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a  rame->pc;.}../*.
ce20: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  ** Close all cur
ce30: 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  sors..**.** Also
ce40: 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e   release any dyn
ce50: 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64  amic memory held
ce60: 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68   by the VM in th
ce70: 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f  e Vdbe.aMem memo
ce80: 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61  ry .** cell arra
ce90: 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  y. This is neces
cea0: 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f  sary as the memo
ceb0: 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61  ry cell array ma
cec0: 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69  y contain.** poi
ced0: 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 61  nters to VdbeFra
cee0: 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63  me objects, whic
cef0: 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f  h may in turn co
cf00: 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74  ntain pointers t
cf10: 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72  o.** open cursor
cf20: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
cf30: 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72  d closeAllCursor
cf40: 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  s(Vdbe *p){.  if
cf50: 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20  ( p->pFrame ){. 
cf60: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46     VdbeFrame *pF
cf70: 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46  rame;.    for(pF
cf80: 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20  rame=p->pFrame; 
cf90: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b  pFrame->pParent;
cfa0: 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e   pFrame=pFrame->
cfb0: 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71  pParent);.    sq
cfc0: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
cfd0: 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20  store(pFrame);. 
cfe0: 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d   }.  p->pFrame =
cff0: 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20   0;.  p->nFrame 
d000: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61  = 0;..  if( p->a
d010: 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  pCsr ){.    int 
d020: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
d030: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
d040: 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75  +){.      VdbeCu
d050: 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70  rsor *pC = p->ap
d060: 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Csr[i];.      if
d070: 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pC ){.        
d080: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
d090: 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20  ursor(p, pC);.  
d0a0: 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69        p->apCsr[i
d0b0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
d0c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
d0d0: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65  ->aMem ){.    re
d0e0: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70  leaseMemArray(&p
d0f0: 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d  ->aMem[1], p->nM
d100: 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  em);.  }.  while
d110: 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29  ( p->pDelFrame )
d120: 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20  {.    VdbeFrame 
d130: 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46  *pDel = p->pDelF
d140: 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65  rame;.    p->pDe
d150: 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70  lFrame = pDel->p
d160: 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69  Parent;.    sqli
d170: 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65  te3VdbeFrameDele
d180: 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20  te(pDel);.  }.. 
d190: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61   /* Delete any a
d1a0: 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f  uxdata allocatio
d1b0: 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 56  ns made by the V
d1c0: 4d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  M */.  sqlite3Vd
d1d0: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
d1e0: 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73  p, -1, 0);.  ass
d1f0: 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61  ert( p->pAuxData
d200: 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
d210: 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20  Clean up the VM 
d220: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
d230: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
d240: 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74  ine will automat
d250: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79  ically close any
d260: 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c   cursors, lists,
d270: 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65   and/or.** sorte
d280: 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65 66  rs that were lef
d290: 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f  t open.  It also
d2a0: 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c   deletes the val
d2b0: 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62  ues of.** variab
d2c0: 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b  les in the aVar[
d2d0: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
d2e0: 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28  ic void Cleanup(
d2f0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
d300: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
d310: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
d320: 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75  DEBUG.  /* Execu
d330: 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  te assert() stat
d340: 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65  ements to ensure
d350: 20 74 68 61 74 20 74 68 65 20 56 64 62 65 2e 61   that the Vdbe.a
d360: 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a  pCsr[] and .  **
d370: 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72   Vdbe.aMem[] arr
d380: 61 79 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ays have already
d390: 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70   been cleaned up
d3a0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  .  */.  int i;. 
d3b0: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20   if( p->apCsr ) 
d3c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
d3d0: 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65  ursor; i++) asse
d3e0: 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d  rt( p->apCsr[i]=
d3f0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
d400: 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Mem ){.    for(i
d410: 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20  =1; i<=p->nMem; 
d420: 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
d430: 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d  aMem[i].flags==M
d440: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a  EM_Undefined );.
d450: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
d460: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
d470: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
d480: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
d490: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
d4a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
d4b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
d4c0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
d4d0: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
d4e0: 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a  ned by this SQL.
d4f0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ** statement. Th
d500: 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74  is is now set at
d510: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72   compile time, r
d520: 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e  ather than durin
d530: 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f  g.** execution o
d540: 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  f the vdbe progr
d550: 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74  am so that sqlit
d560: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
d570: 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c  ) can.** be call
d580: 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61  ed on an SQL sta
d590: 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71  tement before sq
d5a0: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f  lite3_step()..*/
d5b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
d5c0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65  eSetNumCols(Vdbe
d5d0: 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c   *p, int nResCol
d5e0: 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f  umn){.  Mem *pCo
d5f0: 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  lName;.  int n;.
d600: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d610: 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73  p->db;..  releas
d620: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
d630: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
d640: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
d650: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
d660: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
d670: 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c  );.  n = nResCol
d680: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20  umn*COLNAME_N;. 
d690: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
d6a0: 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e   (u16)nResColumn
d6b0: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20  ;.  p->aColName 
d6c0: 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  = pColName = (Me
d6d0: 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  m*)sqlite3DbMall
d6e0: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
d6f0: 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66  f(Mem)*n );.  if
d700: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30  ( p->aColName==0
d710: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69   ) return;.  whi
d720: 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20  le( n-- > 0 ){. 
d730: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61     pColName->fla
d740: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
d750: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20     pColName->db 
d760: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f  = p->db;.    pCo
d770: 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a  lName++;.  }.}..
d780: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
d790: 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68  me of the idx'th
d7a0: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65   column to be re
d7b0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51  turned by the SQ
d7c0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
d7d0: 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20  zName must be a 
d7e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c  pointer to a nul
d7f0: 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69   terminated stri
d800: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ng..**.** This c
d810: 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65  all must be made
d820: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
d830: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
d840: 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20  umCols()..**.** 
d850: 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  The final parame
d860: 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20  ter, xDel, must 
d870: 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  be one of SQLITE
d880: 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45  _DYNAMIC, SQLITE
d890: 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51  _STATIC.** or SQ
d8a0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20  LITE_TRANSIENT. 
d8b0: 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f  If it is SQLITE_
d8c0: 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68  DYNAMIC, then th
d8d0: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
d8e0: 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20  .** to by zName 
d8f0: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79  will be freed by
d900: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
d910: 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69   when the vdbe i
d920: 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a  s destroyed..*/.
d930: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
d940: 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62  etColName(.  Vdb
d950: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d970: 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66   Vdbe being conf
d980: 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  igured */.  int 
d990: 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d9b0: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
d9c0: 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f  zName applies to
d9d0: 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20   */.  int var,  
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
da00: 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63   the COLNAME_* c
da10: 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f  onstants */.  co
da20: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
da30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
da40: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
da50: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
da60: 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ame */.  void (*
da70: 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20  xDel)(void*)    
da80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
da90: 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73  ory management s
daa0: 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d  trategy for zNam
dab0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
dac0: 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  ;.  Mem *pColNam
dad0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  e;.  assert( idx
dae0: 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29  <p->nResColumn )
daf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c  ;.  assert( var<
db00: 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69  COLNAME_N );.  i
db10: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
db20: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73  Failed ){.    as
db30: 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20  sert( !zName || 
db40: 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e  xDel!=SQLITE_DYN
db50: 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75  AMIC );.    retu
db60: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
db70: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
db80: 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b  ->aColName!=0 );
db90: 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28  .  pColName = &(
dba0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b  p->aColName[idx+
dbb0: 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  var*p->nResColum
dbc0: 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n]);.  rc = sqli
dbd0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
dbe0: 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
dbf0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
dc00: 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65  8, xDel);.  asse
dc10: 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e  rt( rc!=0 || !zN
dc20: 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65  ame || (pColName
dc30: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d  ->flags&MEM_Term
dc40: 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )!=0 );.  return
dc50: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
dc60: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
dc70: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72  ansaction may or
dc80: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69   may not be acti
dc90: 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ve on database h
dca0: 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20  andle.** db. If 
dcb0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
dcc0: 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20   active, commit 
dcd0: 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  it. If there is 
dce0: 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73  a.** write-trans
dcf0: 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20  action spanning 
dd00: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
dd10: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
dd20: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b  s routine.** tak
dd30: 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d  es care of the m
dd40: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72  aster journal tr
dd50: 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ickery..*/.stati
dd60: 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74  c int vdbeCommit
dd70: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
dd80: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
dd90: 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20  .  int nTrans = 
dda0: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
ddb0: 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
ddc0: 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d  an active write-
ddd0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
dde0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ddf0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58  _OK;.  int needX
de00: 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66  commit = 0;..#if
de10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
de20: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
de30: 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69  * With this opti
de40: 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53  on, sqlite3VtabS
de50: 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64  ync() is defined
de60: 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20   to be simply . 
de70: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f   ** SQLITE_OK so
de80: 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20   p is not used. 
de90: 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  .  */.  UNUSED_P
dea0: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e  ARAMETER(p);.#en
deb0: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65  dif..  /* Before
dec0: 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
ded0: 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78  else, call the x
dee0: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
def0: 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72  for any.  ** vir
df00: 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c  tual module tabl
df10: 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  es written in th
df20: 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
df30: 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a  This has to.  **
df40: 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
df50: 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74  determining whet
df60: 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  her a master jou
df70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20  rnal file is .  
df80: 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20  ** required, as 
df90: 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  an xSync() callb
dfa0: 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61  ack may add an a
dfb0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
dfc0: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61  .  ** to the tra
dfd0: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
dfe0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
dff0: 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20  bSync(db, p);.. 
e000: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
e010: 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
e020: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
e030: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
e040: 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
e050: 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
e060: 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
e070: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
e080: 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
e090: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
e0a0: 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
e0b0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
e0c0: 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
e0d0: 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
e0e0: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
e0f0: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
e100: 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
e110: 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
e120: 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
e130: 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
e140: 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
e150: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
e160: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
e170: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
e180: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
e190: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
e1a0: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
e1b0: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
e1c0: 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
e1d0: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  it = 1;.      if
e1e0: 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b  ( i!=1 ) nTrans+
e1f0: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
e200: 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b  BtreeEnter(pBt);
e210: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e220: 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76  te3PagerExclusiv
e230: 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72  eLock(sqlite3Btr
e240: 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20  eePager(pBt));. 
e250: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e260: 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20  eLeave(pBt);.   
e270: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21   }.  }.  if( rc!
e280: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e290: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
e2a0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
e2b0: 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72  are any write-tr
e2c0: 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c  ansactions at al
e2d0: 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  l, invoke the co
e2e0: 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69  mmit hook */.  i
e2f0: 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26  f( needXcommit &
e300: 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  & db->xCommitCal
e310: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20  lback ){.    rc 
e320: 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  = db->xCommitCal
e330: 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69  lback(db->pCommi
e340: 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72  tArg);.    if( r
e350: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
e360: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
e370: 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a  INT_COMMITHOOK;.
e380: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e390: 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
e3a0: 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
e3b0: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
e3c0: 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
e3d0: 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
e3e0: 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
e3f0: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
e400: 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
e410: 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
e420: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
e430: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
e440: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
e450: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
e460: 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
e470: 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
e480: 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
e490: 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
e4a0: 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
e4b0: 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e   or a temp file.
e4c0: 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20    In .  ** that 
e4d0: 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73  case we do not s
e4e0: 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
e4f0: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
e500: 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20  , so use the .  
e510: 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74  ** simple case t
e520: 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  hen too..  */.  
e530: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
e540: 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74  rlen30(sqlite3Bt
e550: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
e560: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a  b->aDb[0].pBt)).
e570: 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a     || nTrans<=1.
e580: 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30    ){.    for(i=0
e590: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
e5a0: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
e5b0: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
e5c0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
e5d0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
e5e0: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
e5f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
e600: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
e610: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
e620: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
e630: 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c  o the commit onl
e640: 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73  y if all databas
e650: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  es successfully 
e660: 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31  complete phase 1
e670: 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65  . .    ** If one
e680: 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d   of the BtreeCom
e690: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
e6a0: 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20  lls fails, this 
e6b0: 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20  indicates an.   
e6c0: 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69   ** IO error whi
e6d0: 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  le deleting or t
e6e0: 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72  runcating a jour
e6f0: 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20  nal file. It is 
e700: 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a  unlikely,.    **
e710: 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65   but could happe
e720: 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  n. In this case 
e730: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
e740: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
e750: 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  e error..    */.
e760: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
e770: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
e780: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
e790: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
e7a0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
e7b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
e7c0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
e7d0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
e7e0: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20  itPhaseTwo(pBt, 
e7f0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
e800: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
e810: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e820: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
e830: 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  it(db);.    }.  
e840: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  }..  /* The comp
e850: 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65  lex case - There
e860: 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   is a multi-file
e870: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
e880: 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20  on active..  ** 
e890: 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20  This requires a 
e8a0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e8b0: 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ile to ensure th
e8c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
e8d0: 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20  .  ** committed 
e8e0: 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23  atomicly..  */.#
e8f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e900: 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65  IT_DISKIO.  else
e910: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
e920: 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56  s *pVfs = db->pV
e930: 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64  fs;.    int need
e940: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68  Sync = 0;.    ch
e950: 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
e960: 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20     /* File-name 
e970: 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a  for the master j
e980: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68  ournal */.    ch
e990: 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46  ar const *zMainF
e9a0: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
e9b0: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
e9c0: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
e9d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
e9e0: 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  *pMaster = 0;.  
e9f0: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
ea00: 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  ;.    int res;. 
ea10: 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e     int retryCoun
ea20: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  t = 0;.    int n
ea30: 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f  MainFile;..    /
ea40: 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65  * Select a maste
ea50: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
ea60: 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e  ame */.    nMain
ea70: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74  File = sqlite3St
ea80: 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65  rlen30(zMainFile
ea90: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
eaa0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
eab0: 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58  db, "%s-mjXXXXXX
eac0: 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65  9XXz", zMainFile
ead0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74  );.    if( zMast
eae0: 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  er==0 ) return S
eaf0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
eb00: 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20   do {.      u32 
eb10: 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69  iRandom;.      i
eb20: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b  f( retryCount ){
eb30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74  .        if( ret
eb40: 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20  ryCount>100 ){. 
eb50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
eb60: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c  _log(SQLITE_FULL
eb70: 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73  , "MJ delete: %s
eb80: 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ", zMaster);.   
eb90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
eba0: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
ebb0: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
ebc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ebd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74     }else if( ret
ebe0: 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20  ryCount==1 ){.  
ebf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ec00: 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  log(SQLITE_FULL,
ec10: 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73   "MJ collide: %s
ec20: 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ", zMaster);.   
ec30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ec40: 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b       retryCount+
ec50: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
ec60: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
ec70: 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52  of(iRandom), &iR
ec80: 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71  andom);.      sq
ec90: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
eca0: 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69  3, &zMaster[nMai
ecb0: 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58  nFile], "-mj%06X
ecc0: 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20  9%02X",.        
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e         (iRandom>
ecf0: 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20 69 52  >8)&0xffffff, iR
ed00: 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20  andom&0xff);.   
ed10: 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65     /* The antipe
ed20: 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63  nultimate charac
ed30: 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65  ter of the maste
ed40: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
ed50: 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  ust.      ** be 
ed60: 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d  "9" to avoid nam
ed70: 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65  e collisions whe
ed80: 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65  n using 8+3 file
ed90: 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  names. */.      
eda0: 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b  assert( zMaster[
edb0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
edc0: 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27  zMaster)-3]=='9'
edd0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
ede0: 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61  3FileSuffix3(zMa
edf0: 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29  inFile, zMaster)
ee00: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
ee10: 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
ee20: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
ee30: 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
ee40: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68  , &res);.    }wh
ee50: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
ee60: 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20  OK && res );.   
ee70: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ee80: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  OK ){.      /* O
ee90: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
eea0: 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20  ournal. */.     
eeb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
eec0: 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20  penMalloc(pVfs, 
eed0: 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65  zMaster, &pMaste
eee0: 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51  r, .          SQ
eef0: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
ef00: 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
ef10: 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20  CREATE|.        
ef20: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
ef30: 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f  CLUSIVE|SQLITE_O
ef40: 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
ef50: 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  AL, 0.      );. 
ef60: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
ef70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ef80: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
ef90: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
efa0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
efb0: 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
efc0: 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
efd0: 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  f each database 
efe0: 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e  file in the tran
eff0: 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  saction into the
f000: 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74   new.    ** mast
f010: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
f020: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
f030: 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
f040: 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61  t close.    ** a
f050: 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  nd delete the ma
f060: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f070: 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76  e. All the indiv
f080: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
f090: 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c  les.    ** still
f0a0: 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20   have 'null' as 
f0b0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f0c0: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74  al pointer, so t
f0d0: 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20  hey will roll.  
f0e0: 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65    ** back indepe
f0f0: 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69  ndently if a fai
f100: 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20  lure occurs..   
f110: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
f120: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
f130: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
f140: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
f150: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  pBt;.      if( s
f160: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
f170: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
f180: 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20       char const 
f190: 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *zFile = sqlite3
f1a0: 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
f1b0: 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ame(pBt);.      
f1c0: 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29    if( zFile==0 )
f1d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
f1e0: 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  inue;  /* Ignore
f1f0: 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72   TEMP and :memor
f200: 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  y: databases */.
f210: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f220: 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b    assert( zFile[
f230: 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  0]!=0 );.       
f240: 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26   if( !needSync &
f250: 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53  & !sqlite3BtreeS
f260: 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29  yncDisabled(pBt)
f270: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
f280: 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
f290: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
f2a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f2b0: 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65  e(pMaster, zFile
f2c0: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
f2d0: 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73  0(zFile)+1, offs
f2e0: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  et);.        off
f2f0: 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  set += sqlite3St
f300: 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b  rlen30(zFile)+1;
f310: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
f320: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f330: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
f340: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
f350: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
f360: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
f370: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
f380: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
f390: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
f3a0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
f3b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
f3c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f3d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
f3e0: 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  c the master jou
f3f0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
f400: 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  e IOCAP_SEQUENTI
f410: 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a  AL device.    **
f420: 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69   flag is set thi
f430: 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
f440: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
f450: 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20  ( needSync .    
f460: 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f   && 0==(sqlite3O
f470: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
f480: 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26  istics(pMaster)&
f490: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
f4a0: 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26  UENTIAL).     &&
f4b0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
f4c0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
f4d0: 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  pMaster, SQLITE_
f4e0: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20  SYNC_NORMAL)).  
f4f0: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
f500: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
f510: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
f520: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
f530: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
f540: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
f550: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
f560: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f570: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
f580: 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64  * Sync all the d
f590: 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64  b files involved
f5a0: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
f5b0: 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61  ion. The same ca
f5c0: 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74  ll.    ** sets t
f5d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
f5e0: 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63  l pointer in eac
f5f0: 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  h individual jou
f600: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20  rnal. If.    ** 
f610: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
f620: 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c  here, do not del
f630: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
f640: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
f650: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
f660: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  e error occurs d
f670: 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  uring the first 
f680: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
f690: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
f6a0: 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65  tPhaseOne(), the
f6b0: 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61  n there is a cha
f6c0: 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  nce that the.   
f6d0: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
f6e0: 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  al file will be 
f6f0: 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65  orphaned. But we
f700: 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69   cannot delete i
f710: 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73  t,.    ** in cas
f720: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
f730: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77  rnal file name w
f740: 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
f750: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
f760: 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
f770: 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  he failure occur
f780: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
f790: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
f7a0: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
f7b0: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
f7c0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
f7d0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
f7e0: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
f7f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
f800: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
f810: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61  haseOne(pBt, zMa
f820: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ster);.      }. 
f830: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f840: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
f850: 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
f860: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
f870: 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Y );.    if( rc!
f880: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f890: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
f8a0: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
f8b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f8c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
f8d0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
f8e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
f8f0: 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20  his commits the 
f900: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74  transaction. Aft
f910: 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  er.    ** doing 
f920: 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f  this the directo
f930: 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61  ry is synced aga
f940: 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e  in before any in
f950: 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20  dividual.    ** 
f960: 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65  transaction file
f970: 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20  s are deleted.. 
f980: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
f990: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
f9a0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29  Vfs, zMaster, 1)
f9b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
f9c0: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
f9d0: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
f9e0: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  0;.    if( rc ){
f9f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fa00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
fa10: 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69  All files and di
fa20: 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61  rectories have a
fa30: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
fa40: 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  ed, so the follo
fa50: 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  wing.    ** call
fa60: 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
fa70: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
fa80: 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69  ) are only closi
fa90: 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20  ng files and.   
faa0: 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20   ** deleting or 
fab0: 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e  truncating journ
fac0: 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e  als. If somethin
fad0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69  g goes wrong whi
fae0: 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
faf0: 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64  s happening we d
fb00: 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65  on't really care
fb10: 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20  . The integrity 
fb20: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  of the.    ** tr
fb30: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
fb40: 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c  eady guaranteed,
fb50: 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20   but some stray 
fb60: 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a  'cold' journals.
fb70: 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79      ** may be ly
fb80: 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75  ing around. Retu
fb90: 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
fba0: 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d  ode won't help m
fbb0: 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  atters..    */. 
fbc0: 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
fbd0: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
fbe0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
fbf0: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
fc00: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
fc10: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
fc20: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
fc30: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
fc40: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
fc50: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
fc60: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
fc70: 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b  haseTwo(pBt, 1);
fc80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fc90: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
fca0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
fcb0: 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
fcc0: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a  d_io_errors();..
fcd0: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
fce0: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  ommit(db);.  }.#
fcf0: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
fd00: 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  rc;.}../* .** Th
fd10: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
fd20: 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  s that the sqlit
fd30: 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63  e3.nVdbeActive c
fd40: 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a  ount variable.**
fd50: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d   matches the num
fd60: 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e  ber of vdbe's in
fd70: 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65   the list sqlite
fd80: 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65  3.pVdbe that are
fd90: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63  .** currently ac
fda0: 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69  tive. An asserti
fdb0: 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20  on fails if the 
fdc0: 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f  two counts do no
fdd0: 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73  t match..** This
fde0: 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
fdf0: 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20  self-check only 
fe00: 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65  - it is not an e
fe10: 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73  ssential process
fe20: 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a  ing.** step..**.
fe30: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  ** This is a no-
fe40: 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  op if NDEBUG is 
fe50: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  defined..*/.#ifn
fe60: 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
fe70: 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69  c void checkActi
fe80: 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65  veVdbeCnt(sqlite
fe90: 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
fea0: 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  p;.  int cnt = 0
feb0: 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d  ;.  int nWrite =
fec0: 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20   0;.  int nRead 
fed0: 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70  = 0;.  p = db->p
fee0: 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  Vdbe;.  while( p
fef0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d   ){.    if( p->m
ff00: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
ff10: 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30  _RUN && p->pc>=0
ff20: 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
ff30: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65  .      if( p->re
ff40: 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69  adOnly==0 ) nWri
ff50: 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  te++;.      if( 
ff60: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e  p->bIsReader ) n
ff70: 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Read++;.    }.  
ff80: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
ff90: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e    }.  assert( cn
ffa0: 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t==db->nVdbeActi
ffb0: 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ve );.  assert( 
ffc0: 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62  nWrite==db->nVdb
ffd0: 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65  eWrite );.  asse
ffe0: 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e  rt( nRead==db->n
fff0: 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65  VdbeRead );.}.#e
10000 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63  lse.#define chec
10010 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78  kActiveVdbeCnt(x
10020 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
10030 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73  If the Vdbe pass
10040 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
10050 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20  argument opened 
10060 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  a statement-tran
10070 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73  saction,.** clos
10080 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65  e it now. Argume
10090 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65  nt eOp must be e
100a0 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f  ither SAVEPOINT_
100b0 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53  ROLLBACK or.** S
100c0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
100d0 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
100e0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
100f0 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hen the statemen
10100 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
10110 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
10120 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50   If eOp is SAVEP
10130 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68  OINT_RELEASE, th
10140 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65  en the .** state
10150 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
10160 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
10170 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
10180 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
10190 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
101a0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
101b0 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
101c0 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
101d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
101e0 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
101f0 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65  t(Vdbe *p, int e
10200 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Op){.  sqlite3 *
10210 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62  const db = p->db
10220 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
10230 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
10240 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69   p->iStatement i
10250 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
10260 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56  ero, then this V
10270 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20  dbe opened a .  
10280 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
10290 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68  nsaction that sh
102a0 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68  ould be closed h
102b0 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78  ere. The only ex
102c0 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  ception.  ** is 
102d0 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72  that an IO error
102e0 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 72   may have occurr
102f0 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65  ed, causing an e
10300 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63  mergency rollbac
10310 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  k..  ** In this 
10320 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65  case (db->nState
10330 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68  ment==0), and th
10340 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
10350 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o do..  */.  if(
10360 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
10370 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  && p->iStatement
10380 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
10390 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61     const int iSa
103a0 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74  vepoint = p->iSt
103b0 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20  atement-1;..    
103c0 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56  assert( eOp==SAV
103d0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
103e0 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  || eOp==SAVEPOIN
103f0 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20  T_RELEASE);.    
10400 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
10410 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20  tement>0 );.    
10420 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74  assert( p->iStat
10430 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61  ement==(db->nSta
10440 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65  tement+db->nSave
10450 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66  point) );..    f
10460 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
10470 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
10480 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
10490 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65  _OK;.      Btree
104a0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
104b0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
104c0 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
104d0 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
104e0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
104f0 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
10500 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
10510 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
10520 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
10530 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
10540 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
10550 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
10560 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
10570 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
10580 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
10590 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
105a0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
105b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
105c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
105d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
105e0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
105f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10600 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65  }.    db->nState
10610 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69  ment--;.    p->i
10620 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a  Statement = 0;..
10630 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10640 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
10650 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
10660 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
10670 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10680 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
10690 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  db, SAVEPOINT_RO
106a0 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
106b0 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
106c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
106d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
106e0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
106f0 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
10700 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
10710 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
10720 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
10730 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
10740 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
10750 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
10760 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74   back, also rest
10770 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ore the .    ** 
10780 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
10790 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
107a0 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20  aint counter to 
107b0 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64  the value it had
107c0 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   when .    ** th
107d0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
107e0 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
107f0 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
10800 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
10810 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
10820 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
10830 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66  ns = p->nStmtDef
10840 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e  Cons;.      db->
10850 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
10860 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d   = p->nStmtDefIm
10870 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  mCons;.    }.  }
10880 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10890 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
108a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
108b0 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
108c0 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  n opened by the 
108d0 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e  database .** han
108e0 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  dle associated w
108f0 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65  ith the VM passe
10900 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
10910 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
10920 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49  .** committed. I
10930 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
10940 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64  tanding deferred
10950 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
10960 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61  straint.** viola
10970 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51  tions, return SQ
10980 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65  LITE_ERROR. Othe
10990 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
109a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
109b0 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
109c0 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61   FK violations a
109d0 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
109e0 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
109f0 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74  ITE_ERROR, set t
10a00 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
10a10 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f   VM to SQLITE_CO
10a20 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
10a30 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  KEY.** and write
10a40 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
10a50 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65  e to it. Then re
10a60 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
10a70 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  R..*/.#ifndef SQ
10a80 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
10a90 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65  N_KEY.int sqlite
10aa0 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62  3VdbeCheckFk(Vdb
10ab0 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72  e *p, int deferr
10ac0 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ed){.  sqlite3 *
10ad0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
10ae0 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20 28  ( (deferred && (
10af0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
10b00 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49  s+db->nDeferredI
10b10 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c  mmCons)>0) .   |
10b20 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20  | (!deferred && 
10b30 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
10b40 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d  >0) .  ){.    p-
10b50 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e  >rc = SQLITE_CON
10b60 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
10b70 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72  EY;.    p->error
10b80 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
10b90 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  t;.    sqlite3Se
10ba0 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
10bb0 4d 73 67 2c 20 64 62 2c 20 22 46 4f 52 45 49 47  Msg, db, "FOREIG
10bc0 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
10bd0 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72   failed");.    r
10be0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
10bf0 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
10c00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
10c10 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
10c20 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
10c30 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
10c40 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
10c50 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
10c60 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
10c70 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
10c80 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
10c90 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
10ca0 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
10cb0 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
10cc0 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
10cd0 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
10ce0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10cf0 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
10d00 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
10d10 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
10d20 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
10d30 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
10d40 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
10d50 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
10d60 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
10d70 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
10d80 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
10d90 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
10da0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
10db0 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
10dc0 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
10dd0 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
10de0 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
10df0 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
10e00 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
10e10 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
10e20 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
10e30 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
10e40 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
10e50 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
10e60 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
10e70 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
10e80 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ea0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
10eb0 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65  to store transie
10ec0 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  nt return codes 
10ed0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
10ee0 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
10ef0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
10f00 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
10f10 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
10f20 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
10f30 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
10f40 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
10f50 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
10f60 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
10f70 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
10f80 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
10f90 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
10fa0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
10fb0 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
10fc0 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
10fd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
10fe0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
10ff0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
11000 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
11010 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
11020 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
11030 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
11040 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
11050 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
11060 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
11070 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
11080 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
11090 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
110a0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
110b0 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
110c0 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
110d0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
110e0 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
110f0 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
11100 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
11110 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62   */..  if( p->db
11120 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
11130 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
11140 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
11150 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c    if( p->aOnceFl
11160 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61  ag ) memset(p->a
11170 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e  OnceFlag, 0, p->
11180 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c  nOnceFlag);.  cl
11190 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29  oseAllCursors(p)
111a0 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
111b0 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
111c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
111d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
111e0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
111f0 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  nt(db);..  /* No
11200 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
11210 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68  ack needed if th
11220 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20  e program never 
11230 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74 68  started or if th
11240 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  e.  ** SQL state
11250 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  ment does not re
11260 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64 61  ad or write a da
11270 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f  tabase file.  */
11280 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
11290 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  && p->bIsReader 
112a0 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20  ){.    int mrc; 
112b0 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72    /* Primary err
112c0 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e  or code from p->
112d0 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53  rc */.    int eS
112e0 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a  tatementOp = 0;.
112f0 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61      int isSpecia
11300 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
11310 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
11320 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27  e if a 'special'
11330 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f   error */..    /
11340 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65  * Lock all btree
11350 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74  s used by the st
11360 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73  atement */.    s
11370 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
11380 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  p);..    /* Chec
11390 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  k for one of the
113a0 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
113b0 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
113c0 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61  rc & 0xff;.    a
113d0 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
113e0 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
113f0 45 44 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 65  ED );  /* This e
11400 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 65  rror no longer e
11410 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 73 53  xists */.    isS
11420 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72  pecialError = mr
11430 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11440 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
11450 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20  OERR.           
11460 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63            || mrc
11470 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  ==SQLITE_INTERRU
11480 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  PT || mrc==SQLIT
11490 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20  E_FULL;.    if( 
114a0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29  isSpecialError )
114b0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
114c0 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64  e query was read
114d0 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72  -only and the er
114e0 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
114f0 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20  TE_INTERRUPT, . 
11500 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62       ** no rollb
11510 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79  ack is necessary
11520 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20  . Otherwise, at 
11530 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e  least a savepoin
11540 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  t .      ** tran
11550 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
11560 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72  rolled back to r
11570 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
11580 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20  ase to a .      
11590 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74  ** consistent st
115a0 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ate..      **.  
115b0 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74      ** Even if t
115c0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
115d0 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73  read-only, it is
115e0 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65   important to pe
115f0 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61  rform.      ** a
11600 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72   statement or tr
11610 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
11620 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66  ck operation. If
11630 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20   the error .    
11640 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20 77 68    ** occurred wh
11650 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ile writing to t
11660 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d  he journal, sub-
11670 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62  journal or datab
11680 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  ase.      ** fil
11690 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  e as part of an 
116a0 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75  effort to free u
116b0 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28 73  p cache space (s
116c0 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  ee function.    
116d0 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73    ** pagerStress
116e0 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20  () in pager.c), 
116f0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  the rollback is 
11700 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73 74  required to rest
11710 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ore .      ** th
11720 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e  e pager to a con
11730 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
11740 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
11750 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c  ( !p->readOnly |
11760 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e  | mrc!=SQLITE_IN
11770 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20  TERRUPT ){.     
11780 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c     if( (mrc==SQL
11790 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
117a0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26  ==SQLITE_FULL) &
117b0 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  & p->usesStmtJou
117c0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  rnal ){.        
117d0 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
117e0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
117f0 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ACK;.        }el
11800 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
11810 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74   We are forced t
11820 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20  o roll back the 
11830 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
11840 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  on. Before doing
11850 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
11860 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65  , abort any othe
11870 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69  r statements thi
11880 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74  s handle current
11890 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20  ly has active.. 
118a0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
118b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
118c0 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
118d0 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
118e0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  CK);.          s
118f0 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
11900 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
11910 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
11920 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
11930 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
11940 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
11950 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  or immediate for
11960 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69  eign key violati
11970 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ons. */.    if( 
11980 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
11990 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
119a0 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
119b0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  0);.    }.  .   
119c0 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
119d0 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
119e0 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74  et and this is t
119f0 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77  he only active w
11a00 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d  riter .    ** VM
11a10 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74  , then we do eit
11a20 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20  her a commit or 
11a30 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20  rollback of the 
11a40 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
11a50 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion. .    **.   
11a60 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62   ** Note: This b
11a70 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69  lock also runs i
11a80 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  f one of the spe
11a90 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64  cial errors hand
11aa0 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76  led .    ** abov
11ab0 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  e has occurred. 
11ac0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11ad0 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79  !sqlite3VtabInSy
11ae0 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20  nc(db) .     && 
11af0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a  db->autoCommit .
11b00 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62       && db->nVdb
11b10 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64  eWrite==(p->read
11b20 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b  Only==0) .    ){
11b30 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
11b40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
11b50 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
11b60 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70  OE_Fail && !isSp
11b70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20  ecialError) ){. 
11b80 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11b90 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
11ba0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
11bb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11bc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
11bd0 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e   NEVER(p->readOn
11be0 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ly) ){.         
11bf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
11c00 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
11c10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11c20 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
11c30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
11c40 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
11c50 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
11c60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11c70 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   .          /* T
11c80 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
11c90 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
11ca0 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61   vdbe program wa
11cb0 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20  s successful .  
11cc0 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69          ** or hi
11cd0 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63  t an 'OR FAIL' c
11ce0 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
11cf0 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72  ere are no defer
11d00 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20  red foreign.    
11d10 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e        ** key con
11d20 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64  straints to hold
11d30 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
11d40 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
11d50 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20  a commit .      
11d60 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
11d70 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
11d80 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74   rc = vdbeCommit
11d90 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
11da0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
11db0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
11dc0 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  & p->readOnly ){
11dd0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11de0 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
11df0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11e00 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
11e10 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11e20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11e30 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
11e40 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
11e50 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
11e60 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
11e70 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  K);.        }els
11e80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  e{.          db-
11e90 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
11ea0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
11eb0 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
11ec0 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
11ed0 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
11ee0 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b  SQLITE_DeferFKs;
11ef0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11f00 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
11f10 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
11f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
11f30 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
11f40 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
11f50 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
11f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d       }.      db-
11f70 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
11f80 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
11f90 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29  StatementOp==0 )
11fa0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
11fb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
11fc0 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
11fd0 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
11fe0 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
11ff0 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  = SAVEPOINT_RELE
12000 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ASE;.      }else
12010 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74   if( p->errorAct
12020 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ion==OE_Abort ){
12030 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
12040 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
12050 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
12060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12070 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
12080 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
12090 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
120a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
120b0 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
120c0 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
120d0 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
120e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
120f0 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74  .    /* If eStat
12100 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a  ementOp is non-z
12110 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74  ero, then a stat
12120 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
12130 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  n needs to.    *
12140 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  * be committed o
12150 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43  r rolled back. C
12160 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43  all sqlite3VdbeC
12170 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20  loseStatement() 
12180 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e  to.    ** do so.
12190 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   If this operati
121a0 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
121b0 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72  ror, and the cur
121c0 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  rent statement. 
121d0 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65     ** error code
121e0 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72   is SQLITE_OK or
121f0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
12200 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65  NT, then promote
12210 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
12220 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72  ent statement er
12230 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f  ror code..    */
12240 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d  .    if( eStatem
12250 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72  entOp ){.      r
12260 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
12270 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
12280 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a   eStatementOp);.
12290 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
122a0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
122b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
122c0 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51  (p->rc&0xff)==SQ
122d0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
122e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
122f0 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
12300 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
12310 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
12320 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a  ;.          p->z
12330 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
12340 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
12350 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
12360 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
12370 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
12380 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
12390 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
123a0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
123b0 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
123c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
123d0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
123e0 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   an INSERT, UPDA
123f0 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64  TE or DELETE and
12400 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
12410 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ansaction.    **
12420 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64   has been rolled
12430 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68   back, update th
12440 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
12450 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75  ction change-cou
12460 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  nter. .    */.  
12470 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43    if( p->changeC
12480 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  ntOn ){.      if
12490 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d  ( eStatementOp!=
124a0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
124b0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CK ){.        sq
124c0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
124d0 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
124e0 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ge);.      }else
124f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12500 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
12510 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  db, 0);.      }.
12520 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
12530 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
12540 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
12550 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
12560 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
12570 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  ;.  }..  /* We h
12580 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
12590 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
125a0 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
125b0 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
125c0 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
125d0 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65  ){.    db->nVdbe
125e0 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66  Active--;.    if
125f0 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ( !p->readOnly )
12600 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d   db->nVdbeWrite-
12610 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49  -;.    if( p->bI
12620 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56  sReader ) db->nV
12630 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61  dbeRead--;.    a
12640 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
12650 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62  Active>=db->nVdb
12660 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73  eRead );.    ass
12670 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65  ert( db->nVdbeRe
12680 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69  ad>=db->nVdbeWri
12690 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  te );.    assert
126a0 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ( db->nVdbeWrite
126b0 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  >=0 );.  }.  p->
126c0 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
126d0 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b  IC_HALT;.  check
126e0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
126f0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
12700 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
12710 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
12720 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
12730 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
12740 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
12750 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e  et to true, then
12760 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20   any locks that 
12770 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62  were held.  ** b
12780 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  y connection db 
12790 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
127a0 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c  leased. Call sql
127b0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
127c0 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74  locked() .  ** t
127d0 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71  o invoke any req
127e0 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  uired unlock-not
127f0 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
12800 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75   */.  if( db->au
12810 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
12820 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
12830 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20  nUnlocked(db);. 
12840 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62   }..  assert( db
12850 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20  ->nVdbeActive>0 
12860 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  || db->autoCommi
12870 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61  t==0 || db->nSta
12880 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72  tement==0 );.  r
12890 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51  eturn (p->rc==SQ
128a0 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49  LITE_BUSY ? SQLI
128b0 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45  TE_BUSY : SQLITE
128c0 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  _OK);.}.../*.** 
128d0 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20  Each VDBE holds 
128e0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
128f0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  e most recent sq
12900 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c  lite3_step() cal
12910 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20  l.** in p->rc.  
12920 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
12930 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61  s that result ba
12940 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e  ck to SQLITE_OK.
12950 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12960 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73  VdbeResetStepRes
12970 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ult(Vdbe *p){.  
12980 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
12990 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  K;.}../*.** Copy
129a0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
129b0 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
129c0 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  e belonging to t
129d0 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a  he VDBE passed.*
129e0 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
129f0 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64  rgument to its d
12a00 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28  atabase handle (
12a10 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c  so that they wil
12a20 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65  l be .** returne
12a30 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71  d by calls to sq
12a40 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20  lite3_errcode() 
12a50 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  and sqlite3_errm
12a60 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  sg())..**.** Thi
12a70 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
12a80 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56 44  not clear the VD
12a90 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72  BE error code or
12aa0 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a   message, just.*
12ab0 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f  * copies them to
12ac0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
12ad0 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
12ae0 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
12af0 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a  Error(Vdbe *p){.
12b00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
12b10 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
12b20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70  = p->rc;.  if( p
12b30 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
12b40 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64   u8 mallocFailed
12b50 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69   = db->mallocFai
12b60 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  led;.    sqlite3
12b70 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
12b80 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  c();.    if( db-
12b90 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70  >pErr==0 ) db->p
12ba0 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Err = sqlite3Val
12bb0 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73  ueNew(db);.    s
12bc0 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
12bd0 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
12be0 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
12bf0 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
12c00 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
12c10 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
12c20 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62  Malloc();.    db
12c30 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
12c40 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20   mallocFailed;. 
12c50 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d     db->errCode =
12c60 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   rc;.  }else{.  
12c70 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
12c80 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20  b, rc, 0);.  }. 
12c90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
12ca0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
12cb0 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a  BLE_SQLLOG./*.**
12cc0 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f   If an SQLITE_CO
12cd0 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b  NFIG_SQLLOG hook
12ce0 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61   is registered a
12cf0 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65  nd the VM has be
12d00 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f  en run, .** invo
12d10 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ke it..*/.static
12d20 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65   void vdbeInvoke
12d30 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b  Sqllog(Vdbe *v){
12d40 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
12d50 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
12d60 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c  og && v->rc==SQL
12d70 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71  ITE_OK && v->zSq
12d80 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b  l && v->pc>=0 ){
12d90 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61  .    char *zExpa
12da0 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64  nded = sqlite3Vd
12db0 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76  beExpandSql(v, v
12dc0 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73  ->zSql);.    ass
12dd0 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74  ert( v->db->init
12de0 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20  .busy==0 );.    
12df0 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b  if( zExpanded ){
12e00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
12e10 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
12e20 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20 73 71  og(.          sq
12e30 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
12e40 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d  g.pSqllogArg, v-
12e50 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20  >db, zExpanded, 
12e60 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  1.      );.     
12e70 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76   sqlite3DbFree(v
12e80 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29  ->db, zExpanded)
12e90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
12ea0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62  lse.# define vdb
12eb0 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29  eInvokeSqllog(x)
12ec0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
12ed0 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
12ee0 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
12ef0 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
12f00 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
12f10 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
12f20 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
12f30 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
12f40 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
12f50 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
12f60 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
12f70 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
12f80 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
12f90 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
12fa0 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
12fb0 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
12fc0 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
12fd0 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
12fe0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
12ff0 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
13000 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
13010 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
13020 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
13030 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
13040 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
13050 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
13060 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
13070 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20  te3 *db;.  db = 
13080 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->db;..  /* If 
13090 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
130a0 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
130b0 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
130c0 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
130d0 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
130e0 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
130f0 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
13100 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
13110 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73  it now..  */.  s
13120 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
13130 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
13140 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20  VDBE has be run 
13150 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20  even partially, 
13160 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
13170 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  e error code.  *
13180 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  * and error mess
13190 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42  age from the VDB
131a0 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  E into the main 
131b0 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
131c0 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66  re.  But.  ** if
131d0 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75   the VDBE has ju
131e0 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72  st been set to r
131f0 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61  un but has not a
13200 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64  ctually executed
13210 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75   any.  ** instru
13220 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76  ctions yet, leav
13230 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  e the main datab
13240 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d  ase error inform
13250 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
13260 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
13270 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65  c>=0 ){.    vdbe
13280 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b  InvokeSqllog(p);
13290 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
132a0 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29  TransferError(p)
132b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
132c0 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
132d0 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
132e0 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Msg = 0;.    if(
132f0 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
13300 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31  ) p->expired = 1
13310 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
13320 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65  >rc && p->expire
13330 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  d ){.    /* The 
13340 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73  expired flag was
13350 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45   set on the VDBE
13360 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
13370 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
13380 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
13390 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79   For consistency
133a0 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f   (since sqlite3_
133b0 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a  step() was.    *
133c0 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74  * called), set t
133d0 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  he database erro
133e0 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  r in this case a
133f0 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  s well..    */. 
13400 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
13410 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45  db, p->rc, p->zE
13420 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30  rrMsg ? "%s" : 0
13430 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
13440 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13450 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
13460 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
13470 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
13480 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f  Reclaim all memo
13490 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56  ry used by the V
134a0 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e  DBE.  */.  Clean
134b0 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76  up(p);..  /* Sav
134c0 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f  e profiling info
134d0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69  rmation from thi
134e0 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f  s VDBE run..  */
134f0 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
13500 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c  FILE.  {.    FIL
13510 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22  E *out = fopen("
13520 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74  vdbe_profile.out
13530 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28  ", "a");.    if(
13540 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e   out ){.      in
13550 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  t i;.      fprin
13560 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29  tf(out, "---- ")
13570 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
13580 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
13590 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
135a0 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d  (out, "%02x", p-
135b0 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b  >aOp[i].opcode);
135c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
135d0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
135e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
135f0 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  zSql ){.        
13600 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a  char c, pc = 0;.
13610 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
13620 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20  out, "-- ");.   
13630 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63       for(i=0; (c
13640 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d   = p->zSql[i])!=
13650 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  0; i++){.       
13660 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20     if( pc=='\n' 
13670 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  ) fprintf(out, "
13680 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  -- ");.         
13690 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20   putc(c, out);. 
136a0 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b           pc = c;
136b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
136c0 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20     if( pc!='\n' 
136d0 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  ) fprintf(out, "
136e0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
136f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
13700 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
13710 20 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31       char zHdr[1
13720 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  00];.        sql
13730 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
13740 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72  zeof(zHdr), zHdr
13750 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38  , "%6u %12llu %8
13760 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20  llu ",.         
13770 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c    p->aOp[i].cnt,
13780 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
13790 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20  Op[i].cycles,.  
137a0 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
137b0 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f  i].cnt>0 ? p->aO
137c0 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61  p[i].cycles/p->a
137d0 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20  Op[i].cnt : 0.  
137e0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
137f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
13800 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20  s", zHdr);.     
13810 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
13820 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70  intOp(out, i, &p
13830 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20  ->aOp[i]);.     
13840 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28   }.      fclose(
13850 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  out);.    }.  }.
13860 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75 72  #endif.  p->iCur
13870 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20  rentTime = 0;.  
13880 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
13890 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
138a0 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d  turn p->rc & db-
138b0 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a  >errMask;.}. ./*
138c0 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64  .** Clean up and
138d0 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61   delete a VDBE a
138e0 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20  fter execution. 
138f0 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
13900 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74  er which is.** t
13910 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20  he result code. 
13920 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
13930 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e   message text in
13940 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f  to *pzErrMsg..*/
13950 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
13960 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70  Finalize(Vdbe *p
13970 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
13980 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
13990 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
139a0 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61  GIC_RUN || p->ma
139b0 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
139c0 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  HALT ){.    rc =
139d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
139e0 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74  t(p);.    assert
139f0 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65  ( (rc & p->db->e
13a00 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20  rrMask)==rc );. 
13a10 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
13a20 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74  Delete(p);.  ret
13a30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13a40 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f   If parameter iO
13a50 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  p is less than z
13a60 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ero, then invoke
13a70 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
13a80 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c  for.** all auxil
13a90 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65  iary data pointe
13aa0 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63  rs currently cac
13ab0 68 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  hed by the VM pa
13ac0 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66  ssed as.** the f
13ad0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
13ae0 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20  *.** Or, if iOp 
13af0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
13b00 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
13b10 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73 74 72  , then the destr
13b20 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79  uctor is.** only
13b30 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f   invoked for tho
13b40 73 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  se auxiliary dat
13b50 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74  a pointers creat
13b60 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20 0a  ed by the user .
13b70 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  ** function invo
13b80 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75  ked by the OP_Fu
13b90 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74  nction opcode at
13ba0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70   instruction iOp
13bb0 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65   of .** VM pVdbe
13bc0 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20  , and only then 
13bd0 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74  if:.**.**    * t
13be0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 75  he associated fu
13bf0 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
13c00 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20   is the 32nd or 
13c10 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a  later (counting.
13c20 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66  **      from lef
13c30 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a  t to right), or.
13c40 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63  **.**    * the c
13c50 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
13c60 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73   in argument mas
13c70 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68 65 72  k is clear (wher
13c80 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20  e the first.**  
13c90 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72      function par
13ca0 61 6d 65 74 65 72 20 63 6f 72 72 73 70 6f 6e 64  ameter corrspond
13cb0 73 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29  s to bit 0 etc.)
13cc0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13cd0 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
13ce0 74 61 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  ta(Vdbe *pVdbe, 
13cf0 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73  int iOp, int mas
13d00 6b 29 7b 0a 20 20 41 75 78 44 61 74 61 20 2a 2a  k){.  AuxData **
13d10 70 70 20 3d 20 26 70 56 64 62 65 2d 3e 70 41 75  pp = &pVdbe->pAu
13d20 78 44 61 74 61 3b 0a 20 20 77 68 69 6c 65 28 20  xData;.  while( 
13d30 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61  *pp ){.    AuxDa
13d40 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a  ta *pAux = *pp;.
13d50 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a      if( (iOp<0).
13d60 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69       || (pAux->i
13d70 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70 41 75 78  Op==iOp && (pAux
13d80 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d  ->iArg>31 || !(m
13d90 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28  ask & MASKBIT32(
13da0 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29 0a 20  pAux->iArg)))). 
13db0 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74     ){.      test
13dc0 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41 72 67  case( pAux->iArg
13dd0 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66  ==31 );.      if
13de0 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20  ( pAux->xDelete 
13df0 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d  ){.        pAux-
13e00 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70  >xDelete(pAux->p
13e10 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aux);.      }.  
13e20 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e      *pp = pAux->
13e30 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
13e40 69 74 65 33 44 62 46 72 65 65 28 70 56 64 62 65  ite3DbFree(pVdbe
13e50 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20  ->db, pAux);.   
13e60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
13e70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a  = &pAux->pNext;.
13e80 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
13e90 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  ** Free all memo
13ea0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
13eb0 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73  th the Vdbe pass
13ec0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
13ed0 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78   argument,.** ex
13ee0 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20  cept for object 
13ef0 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73  itself, which is
13f00 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a   preserved..**.*
13f10 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
13f20 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
13f30 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74  nction and sqlit
13f40 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69  e3VdbeDelete() i
13f50 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65  s that.** VdbeDe
13f60 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69  lete() also unli
13f70 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f  nks the Vdbe fro
13f80 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d  m the list of VM
13f90 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
13fa0 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  h.** the databas
13fb0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64  e connection and
13fc0 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63   frees the objec
13fd0 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69  t itself..*/.voi
13fe0 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65  d sqlite3VdbeCle
13ff0 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  arObject(sqlite3
14000 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
14010 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53    SubProgram *pS
14020 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e  ub, *pNext;.  in
14030 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t i;.  assert( p
14040 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ->db==0 || p->db
14050 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73  ==db );.  releas
14060 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
14070 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72  r, p->nVar);.  r
14080 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
14090 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
140a0 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
140b0 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62  E_N);.  for(pSub
140c0 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53  =p->pProgram; pS
140d0 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b  ub; pSub=pNext){
140e0 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75  .    pNext = pSu
140f0 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64  b->pNext;.    vd
14100 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
14110 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75  , pSub->aOp, pSu
14120 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c  b->nOp);.    sql
14130 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
14140 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Sub);.  }.  for(
14150 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e  i=p->nzVar-1; i>
14160 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33  =0; i--) sqlite3
14170 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a  DbFree(db, p->az
14180 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46  Var[i]);.  vdbeF
14190 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70  reeOpArray(db, p
141a0 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a  ->aOp, p->nOp);.
141b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
141c0 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  db, p->aColName)
141d0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
141e0 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a  e(db, p->zSql);.
141f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
14200 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23  db, p->pFree);.#
14210 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
14220 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
14230 50 4c 41 49 4e 29 0a 20 20 73 71 6c 69 74 65 33  PLAIN).  sqlite3
14240 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
14250 78 70 6c 61 69 6e 29 3b 0a 20 20 73 71 6c 69 74  xplain);.  sqlit
14260 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
14270 70 45 78 70 6c 61 69 6e 29 3b 0a 23 65 6e 64 69  pExplain);.#endi
14280 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  f.}../*.** Delet
14290 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45  e an entire VDBE
142a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
142b0 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65  3VdbeDelete(Vdbe
142c0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
142d0 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  *db;..  if( NEVE
142e0 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
142f0 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
14300 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14310 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
14320 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
14330 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a  ite3VdbeClearObj
14340 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69 66  ect(db, p);.  if
14350 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
14360 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
14370 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
14380 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
14390 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20  t( db->pVdbe==p 
143a0 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65  );.    db->pVdbe
143b0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
143c0 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
143d0 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
143e0 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
143f0 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  v;.  }.  p->magi
14400 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44  c = VDBE_MAGIC_D
14410 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30  EAD;.  p->db = 0
14420 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
14430 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
14440 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
14450 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61   cursor p is rea
14460 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  dy to read or wr
14470 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77  ite the row to w
14480 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c  hich it.** was l
14490 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20  ast positioned. 
144a0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
144b0 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20   code if an OOM 
144c0 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72  fault or I/O err
144d0 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75  or.** prevents u
144e0 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69  s from positioni
144f0 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
14500 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73   its correct pos
14510 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
14520 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
14530 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
14540 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
14550 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
14560 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
14570 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65  If no move is pe
14580 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20  nding, check to 
14590 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68  see if the row h
145a0 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74  as been.** delet
145b0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
145c0 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  r the cursor and
145d0 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b   if it has, mark
145e0 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61   the row as.** a
145f0 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a   NULL row..**.**
14600 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
14610 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
14620 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  ng to the correc
14630 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72  t row and that r
14640 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65  ow has.** not be
14650 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
14660 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
14670 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20  rsor, then this 
14680 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
14690 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
146a0 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
146b0 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  to(VdbeCursor *p
146c0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65  ){.  if( p->defe
146d0 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20  rredMoveto ){.  
146e0 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23    int res, rc;.#
146f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
14700 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  T.    extern int
14710 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
14720 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20  count;.#endif.  
14730 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54    assert( p->isT
14740 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d  able );.    rc =
14750 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
14760 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70  etoUnpacked(p->p
14770 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f  Cursor, 0, p->mo
14780 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26  vetoTarget, 0, &
14790 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  res);.    if( rc
147a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
147b0 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d    p->lastRowid =
147c0 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
147d0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 21 3d 30  ;.    if( res!=0
147e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
147f0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
14800 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c     p->rowidIsVal
14810 69 64 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53  id = 1;.#ifdef S
14820 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73  QLITE_TEST.    s
14830 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
14840 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
14850 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
14860 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  eto = 0;.    p->
14870 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
14880 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c  CHE_STALE;.  }el
14890 73 65 20 69 66 28 20 70 2d 3e 70 43 75 72 73 6f  se if( p->pCurso
148a0 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61 73  r ){.    int has
148b0 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74 20 72  Moved;.    int r
148c0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
148d0 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
148e0 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68 61 73 4d  ->pCursor, &hasM
148f0 6f 76 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  oved);.    if( r
14900 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
14910 20 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64 20     if( hasMoved 
14920 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61 63 68  ){.      p->cach
14930 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
14940 53 54 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d 3e  STALE;.      p->
14950 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20  nullRow = 1;.   
14960 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
14970 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
14980 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
14990 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a  g functions:.**.
149a0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
149b0 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71  rialType().** sq
149c0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
149d0 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ypeLen().** sqli
149e0 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e  te3VdbeSerialLen
149f0 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
14a00 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20  eSerialPut().** 
14a10 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
14a20 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63  lGet().**.** enc
14a30 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64  apsulate the cod
14a40 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65  e that serialize
14a50 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f  s values for sto
14a60 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a  rage in SQLite.*
14a70 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78  * data and index
14a80 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73   records. Each s
14a90 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20  erialized value 
14aa0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
14ab0 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61   'serial-type' a
14ac0 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  nd a blob of dat
14ad0 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  a. The serial ty
14ae0 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20  pe is an 8-byte 
14af0 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65  unsigned.** inte
14b00 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ger, stored as a
14b10 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   varint..**.** I
14b20 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65  n an SQLite inde
14b30 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65  x record, the se
14b40 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f  rial type is sto
14b50 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66  red directly bef
14b60 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20  ore.** the blob 
14b70 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20  of data that it 
14b80 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20  corresponds to. 
14b90 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72  In a table recor
14ba0 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a  d, all serial.**
14bb0 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65   types are store
14bc0 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
14bd0 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e  f the record, an
14be0 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64  d the blobs of d
14bf0 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ata at.** the en
14c00 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66  d. Hence these f
14c10 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74  unctions allow t
14c20 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e  he caller to han
14c30 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61  dle the.** seria
14c40 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20  l-type and data 
14c50 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e  blob separately.
14c60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
14c70 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
14c80 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73  ibes the various
14c90 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73   storage classes
14ca0 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a   for data:.**.**
14cb0 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20     serial type  
14cc0 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64        bytes of d
14cd0 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a  ata      type.**
14ce0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
14cf0 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
14d00 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
14d10 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
14d20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
14d30 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
14d40 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20      NULL.**     
14d50 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
14d60 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
14d70 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
14d80 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20  er.**      2    
14d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14da0 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69   2            si
14db0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
14dc0 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
14dd0 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20             3    
14de0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
14df0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34  nteger.**      4
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e10 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
14e20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
14e30 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20  .**      5      
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36                 6
14e50 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
14e60 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
14e70 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
14e80 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
14e90 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
14ea0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20  eger.**      7  
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ec0 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
14ed0 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20  IEEE float.**   
14ee0 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
14ef0 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
14f00 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
14f10 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20  nstant 0.**     
14f20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20   9              
14f30 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
14f40 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
14f50 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30  tant 1.**     10
14f60 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20  ,11             
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f80 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65    reserved for e
14f90 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e  xpansion.**    N
14fa0 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20  >=12 and even   
14fb0 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20      (N-12)/2    
14fc0 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e      BLOB.**    N
14fd0 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20  >=13 and odd    
14fe0 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20      (N-13)/2    
14ff0 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54      text.**.** T
15000 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73  he 8 and 9 types
15010 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33   were added in 3
15020 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61  .3.0, file forma
15030 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73  t 4.  Prior vers
15040 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
15050 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72  e will not under
15060 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69  stand those seri
15070 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a  al types..*/../*
15080 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
15090 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
150a0 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
150b0 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20  in pMem..*/.u32 
150c0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
150d0 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c  lType(Mem *pMem,
150e0 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
150f0 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
15100 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20   pMem->flags;.  
15110 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c  int n;..  if( fl
15120 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
15130 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
15140 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
15150 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  M_Int ){.    /* 
15160 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
15170 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20  er to use 1, 2, 
15180 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e  4, 6 or 8 bytes.
15190 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
151a0 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34  AX_6BYTE ((((i64
151b0 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32  )0x00008000)<<32
151c0 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d  )-1).    i64 i =
151d0 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
151e0 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69  u64 u;.    if( i
151f0 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
15200 69 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29 20 29  i<(-MAX_6BYTE) )
15210 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 20   return 6;.     
15220 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65 73   /* Previous tes
15230 74 20 70 72 65 76 65 6e 74 73 3a 20 20 75 20 3d  t prevents:  u =
15240 20 2d 28 2d 39 32 32 33 33 37 32 30 33 36 38 35   -(-922337203685
15250 34 37 37 35 38 30 38 29 20 2a 2f 0a 20 20 20 20  4775808) */.    
15260 20 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65    u = -i;.    }e
15270 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69  lse{.      u = i
15280 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15290 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20  u<=127 ){.      
152a0 72 65 74 75 72 6e 20 28 28 69 26 31 29 3d 3d 69  return ((i&1)==i
152b0 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e   && file_format>
152c0 3d 34 29 20 3f 20 38 2b 28 75 33 32 29 75 20 3a  =4) ? 8+(u32)u :
152d0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
152e0 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74  ( u<=32767 ) ret
152f0 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75  urn 2;.    if( u
15300 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74 75  <=8388607 ) retu
15310 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 3;.    if( u<
15320 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72 65  =2147483647 ) re
15330 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20  turn 4;.    if( 
15340 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72  u<=MAX_6BYTE ) r
15350 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74  eturn 5;.    ret
15360 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 6;.  }.  if(
15370 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20   flags&MEM_Real 
15380 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b  ){.    return 7;
15390 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
153a0 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  Mem->db->mallocF
153b0 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28  ailed || flags&(
153c0 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
153d0 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d  ) );.  n = pMem-
153e0 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  >n;.  if( flags 
153f0 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
15400 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e    n += pMem->u.n
15410 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Zero;.  }.  asse
15420 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65  rt( n>=0 );.  re
15430 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32  turn ((n*2) + 12
15440 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53   + ((flags&MEM_S
15450 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a  tr)!=0));.}../*.
15460 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  ** Return the le
15470 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61  ngth of the data
15480 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
15490 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73  o the supplied s
154a0 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75  erial-type..*/.u
154b0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
154c0 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20  rialTypeLen(u32 
154d0 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
154e0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
154f0 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =12 ){.    retur
15500 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  n (serial_type-1
15510 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2)/2;.  }else{. 
15520 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
15530 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30  u8 aSize[] = { 0
15540 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c  , 1, 2, 3, 4, 6,
15550 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20   8, 8, 0, 0, 0, 
15560 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 };.    return 
15570 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70  aSize[serial_typ
15580 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e];.  }.}../*.**
15590 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e   If we are on an
155a0 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69   architecture wi
155b0 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  th mixed-endian 
155c0 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69  floating .** poi
155d0 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74  nts (ex: ARM7) t
155e0 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77  hen swap the low
155f0 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20  er 4 bytes with 
15600 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20  the .** upper 4 
15610 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74  bytes.  Return t
15620 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
15630 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74   For most archit
15640 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73  ectures, this is
15650 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
15660 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20  (later):  It is 
15670 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74  reported to me t
15680 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e  hat the mixed-en
15690 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  dian problem.** 
156a0 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73  on ARM7 is an is
156b0 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f  sue with GCC, no
156c0 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20  t with the ARM7 
156d0 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a  chip.  It seems.
156e0 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65  ** that early ve
156f0 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74  rsions of GCC st
15700 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72  ored the two wor
15710 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a  ds of a 64-bit.*
15720 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77  * float in the w
15730 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64  rong order.  And
15740 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20   that error has 
15750 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a  been propagated.
15760 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20  ** ever since.  
15770 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74  The blame is not
15780 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74   necessarily wit
15790 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a  h GCC, though..*
157a0 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65  * GCC might have
157b0 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68   just copying th
157c0 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61  e problem from a
157d0 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e   prior compiler.
157e0 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f  .** I am also to
157f0 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65  ld that newer ve
15800 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68  rsions of GCC th
15810 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66  at follow a diff
15820 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74  erent.** ABI get
15830 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
15840 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76  right..**.** Dev
15850 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51  elopers using SQ
15860 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20  Lite on an ARM7 
15870 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61  should compile a
15880 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20  nd run their.** 
15890 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e  application usin
158a0 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47  g -DSQLITE_DEBUG
158b0 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  =1 at least once
158c0 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a  .  With DEBUG.**
158d0 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61   enabled, some a
158e0 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c  sserts below wil
158f0 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  l ensure that th
15900 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a  e byte order of.
15910 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
15920 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72  t values is corr
15930 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37  ect..**.** (2007
15940 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76  -08-30)  Frank v
15950 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64  an Vugt has stud
15960 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  ied this problem
15970 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20   closely.** and 
15980 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e  has send his fin
15990 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c  dings to the SQL
159a0 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20  ite developers. 
159b0 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73   Frank.** writes
159c0 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78   that some Linux
159d0 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66   kernels offer f
159e0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61  loating point ha
159f0 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74  rdware.** emulat
15a00 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e  ion that uses on
15a10 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73  ly 32-bit mantis
15a20 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61  sas instead of a
15a30 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74   full .** 48-bit
15a40 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79  s as required by
15a50 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61   the IEEE standa
15a60 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68  rd.  (This is th
15a70 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f  e.** CONFIG_FPE_
15a80 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29  FASTFPE option.)
15a90 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d    On such system
15aa0 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  s, floating poin
15ab0 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69  t.** byte swappi
15ac0 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20  ng becomes very 
15ad0 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f  complicated.  To
15ae0 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c   avoid problems,
15af0 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72  .** the necessar
15b00 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  y byte swapping 
15b10 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75  is carried out u
15b20 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e  sing a 64-bit in
15b30 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20  teger.** rather 
15b40 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c  than a 64-bit fl
15b50 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75  oat.  Frank assu
15b60 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20  res us that the 
15b70 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72  code here.** wor
15b80 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c  ks for him.  We,
15b90 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c   the developers,
15ba0 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20   have no way to 
15bb0 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a  independently.**
15bc0 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75   verify this, bu
15bd0 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f  t Frank seems to
15be0 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73   know what he is
15bf0 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a   talking about.*
15c00 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69  * so we trust hi
15c10 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
15c20 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
15c30 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61  _64BIT_FLOAT.sta
15c40 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61  tic u64 floatSwa
15c50 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69  p(u64 in){.  uni
15c60 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a  on {.    u64 r;.
15c70 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20      u32 i[2];.  
15c80 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20  } u;.  u32 t;.. 
15c90 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d   u.r = in;.  t =
15ca0 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30   u.i[0];.  u.i[0
15cb0 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e  ] = u.i[1];.  u.
15cc0 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75  i[1] = t;.  retu
15cd0 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69  rn u.r;.}.# defi
15ce0 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
15cf0 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20  anFloat(X)  X = 
15d00 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c  floatSwap(X).#el
15d10 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  se.# define swap
15d20 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
15d30 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
15d40 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69  * Write the seri
15d50 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62  alized data blob
15d60 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
15d70 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e  tored in pMem in
15d80 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69  to .** buf. It i
15d90 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
15da0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
15db0 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65  located sufficie
15dc0 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74  nt space..** Ret
15dd0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
15de0 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e  f bytes written.
15df0 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74  .**.** nBuf is t
15e00 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61  he amount of spa
15e10 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d  ce left in buf[]
15e20 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  .  The caller is
15e30 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20   responsible.** 
15e40 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65  for allocating e
15e50 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62  nough space to b
15e60 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65  uf[] to hold the
15e70 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65   entire field, e
15e80 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74  xclusive.** of t
15e90 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  he pMem->u.nZero
15ea0 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d   bytes for a MEM
15eb0 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a  _Zero value..**.
15ec0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
15ed0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
15ee0 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  tually written i
15ef0 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20  nto buf[].  The 
15f00 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74  number.** of byt
15f10 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66  es in the zero-f
15f20 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e  illed tail is in
15f30 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
15f40 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a  turn value only.
15f50 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65  ** if those byte
15f60 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e  s were zeroed in
15f70 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20   buf[]..*/ .u32 
15f80 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
15f90 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65  lPut(u8 *buf, Me
15fa0 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72  m *pMem, u32 ser
15fb0 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32  ial_type){.  u32
15fc0 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65   len;..  /* Inte
15fd0 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a  ger and Real */.
15fe0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
15ff0 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=7 && serial_t
16000 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34  ype>0 ){.    u64
16010 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20   v;.    u32 i;. 
16020 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
16030 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61  pe==7 ){.      a
16040 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29  ssert( sizeof(v)
16050 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72  ==sizeof(pMem->r
16060 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
16070 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20  y(&v, &pMem->r, 
16080 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20  sizeof(v));.    
16090 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
160a0 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d  nFloat(v);.    }
160b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20  else{.      v = 
160c0 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  pMem->u.i;.    }
160d0 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73  .    len = i = s
160e0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
160f0 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
16100 79 70 65 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ype);.    while(
16110 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75   i-- ){.      bu
16120 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78  f[i] = (u8)(v&0x
16130 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d  FF);.      v >>=
16140 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   8;.    }.    re
16150 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
16160 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c   /* String or bl
16170 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  ob */.  if( seri
16180 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
16190 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
161a0 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61  >n + ((pMem->fla
161b0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70  gs & MEM_Zero)?p
161c0 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a  Mem->u.nZero:0).
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
161e0 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65  (int)sqlite3Vdbe
161f0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
16200 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20  rial_type) );.  
16210 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
16220 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c  .    memcpy(buf,
16230 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a   pMem->z, len);.
16240 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
16250 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f    }..  /* NULL o
16260 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72  r constants 0 or
16270 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30   1 */.  return 0
16280 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78  ;.}../* Input "x
16290 22 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20  " is a sequence 
162a0 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  of unsigned char
162b0 61 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72  acters that repr
162c0 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65  esent a.** big-e
162d0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  ndian integer.  
162e0 52 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76  Return the equiv
162f0 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74  alent native int
16300 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  eger.*/.#define 
16310 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  ONE_BYTE_INT(x) 
16320 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a     ((i8)(x)[0]).
16330 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45  #define TWO_BYTE
16340 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a  _INT(x)    (256*
16350 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29  (i8)((x)[0])|(x)
16360 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52  [1]).#define THR
16370 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  EE_BYTE_INT(x)  
16380 28 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b  (65536*(i8)((x)[
16390 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c  0])|((x)[1]<<8)|
163a0 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[2]).#define 
163b0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78  FOUR_BYTE_UINT(x
163c0 29 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d  )  (((u32)(x)[0]
163d0 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  <<24)|((x)[1]<<1
163e0 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
163f0 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65  x)[3])../*.** De
16400 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
16410 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
16420 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
16430 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
16440 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
16450 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
16460 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
16470 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
16480 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 75 33 32 20  s read..*/ .u32 
16490 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
164a0 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
164b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
164c0 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
164d0 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
164e0 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
164f0 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
16500 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
16510 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
16520 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
16530 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
16540 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
16550 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
16560 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
16570 0a 20 20 75 36 34 20 78 3b 0a 20 20 75 33 32 20  .  u64 x;.  u32 
16580 79 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  y;.  switch( ser
16590 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
165a0 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65  case 10:   /* Re
165b0 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
165c0 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
165d0 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 11:   /* Reser
165e0 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
165f0 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30  se */.    case 0
16600 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a  : {  /* NULL */.
16610 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
16620 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
16630 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16640 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f  .    case 1: { /
16650 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 1-byte signed 
16660 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
16670 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45   pMem->u.i = ONE
16680 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
16690 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
166a0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
166b0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
166c0 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
166d0 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
166e0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
166f0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54     pMem->u.i = T
16700 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  WO_BYTE_INT(buf)
16710 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
16720 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
16730 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
16740 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
16750 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67   { /* 3-byte sig
16760 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
16770 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
16780 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
16790 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
167a0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
167b0 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
167c0 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  3;.    }.    cas
167d0 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
167e0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
167f0 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55  */.      y = FOU
16800 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29  R_BYTE_UINT(buf)
16810 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
16820 69 20 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a 29  i = (i64)*(int*)
16830 26 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  &y;.      pMem->
16840 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
16850 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
16860 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16870 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
16880 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
16890 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
168a0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
168b0 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36  T(buf+2) + (((i6
168c0 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
168d0 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
168e0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
168f0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
16900 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a  return 6;.    }.
16910 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a      case 6:   /*
16920 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
16930 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61  nteger */.    ca
16940 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20  se 7: { /* IEEE 
16950 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a  floating point *
16960 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  /.#if !defined(N
16970 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
16980 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
16990 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
169a0 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
169b0 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64  hat integers and
169c0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
169d0 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73  values use the s
169e0 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
169f0 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68  e order.  Or, th
16a00 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58  at if SQLITE_MIX
16a10 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
16a20 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a  FLOAT is.      *
16a30 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36  * defined that 6
16a40 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
16a50 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c  oint values real
16a60 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20  ly are mixed.   
16a70 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20     ** endian..  
16a80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61      */.      sta
16a90 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
16aa0 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
16ab0 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20  000)<<32;.      
16ac0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75  static const dou
16ad0 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20  ble r1 = 1.0;.  
16ae0 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b      u64 t2 = t1;
16af0 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
16b00 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b  EndianFloat(t2);
16b10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
16b20 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f  izeof(r1)==sizeo
16b30 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28  f(t2) && memcmp(
16b40 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66  &r1, &t2, sizeof
16b50 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  (r1))==0 );.#end
16b60 69 66 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55  if.      x = FOU
16b70 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29  R_BYTE_UINT(buf)
16b80 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52  ;.      y = FOUR
16b90 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34  _BYTE_UINT(buf+4
16ba0 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  );.      x = (x<
16bb0 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20  <32) | y;.      
16bc0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
16bd0 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =6 ){.        pM
16be0 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
16bf0 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  )&x;.        pMe
16c00 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
16c10 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  nt;.      }else{
16c20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16c30 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26   sizeof(x)==8 &&
16c40 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29   sizeof(pMem->r)
16c50 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==8 );.        s
16c60 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
16c70 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20  oat(x);.        
16c80 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c  memcpy(&pMem->r,
16c90 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
16ca0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
16cb0 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73  lags = sqlite3Is
16cc0 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d  NaN(pMem->r) ? M
16cd0 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65  EM_Null : MEM_Re
16ce0 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  al;.      }.    
16cf0 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20    return 8;.    
16d00 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20  }.    case 8:   
16d10 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f   /* Integer 0 */
16d20 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20  .    case 9: {  
16d30 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a  /* Integer 1 */.
16d40 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
16d50 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b  = serial_type-8;
16d60 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
16d70 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
16d80 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16d90 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
16da0 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20   {.      static 
16db0 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b  const u16 aFlag[
16dc0 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d  ] = { MEM_Blob|M
16dd0 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74  EM_Ephem, MEM_St
16de0 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20  r|MEM_Ephem };. 
16df0 20 20 20 20 20 75 33 32 20 6c 65 6e 20 3d 20 28       u32 len = (
16e00 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
16e10 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  2;.      pMem->z
16e20 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a   = (char *)buf;.
16e30 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
16e40 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  len;.      pMem-
16e50 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >xDel = 0;.     
16e60 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61   pMem->flags = a
16e70 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65  Flag[serial_type
16e80 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72  &1];.      retur
16e90 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  n len;.    }.  }
16ea0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
16eb0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
16ec0 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  ne is used to al
16ed0 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e  locate sufficien
16ee0 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55  t space for an U
16ef0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a  npackedRecord.**
16f00 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65   structure large
16f10 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73   enough to be us
16f20 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56  ed with sqlite3V
16f30 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
16f40 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73  ) if.** the firs
16f50 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
16f60 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e  pointer to KeyIn
16f70 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65  fo structure pKe
16f80 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  yInfo..**.** The
16f90 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72   space is either
16fa0 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
16fb0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
16fc0 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69  Raw() or from wi
16fd0 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c  thin.** the unal
16fe0 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73  igned buffer pas
16ff0 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f  sed via the seco
17000 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67  nd and third arg
17010 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62  uments (presumab
17020 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63  ly.** stack spac
17030 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65  e). If the forme
17040 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20  r, then *ppFree 
17050 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e  is set to a poin
17060 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  ter that should.
17070 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  ** be eventually
17080 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
17090 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ller using sqlit
170a0 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20  e3DbFree(). Or, 
170b0 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63  if the .** alloc
170c0 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d  ation comes from
170d0 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70   the pSpace/szSp
170e0 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46  ace buffer, *ppF
170f0 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ree is set to NU
17100 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74  LL.** before ret
17110 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
17120 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
17130 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
17140 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63  turned..*/.Unpac
17150 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74  kedRecord *sqlit
17160 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
17170 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79  kedRecord(.  Key
17180 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
171a0 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
171b0 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  he record */.  c
171c0 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20 20  har *pSpace,    
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
171e0 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63  * Unaligned spac
171f0 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  e available */. 
17200 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20 20   int szSpace,   
17210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17220 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61   /* Size of pSpa
17230 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f  ce[] in bytes */
17240 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65 65  .  char **ppFree
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17260 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65     /* OUT: Calle
17270 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68  r should free th
17280 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b  is pointer */.){
17290 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
172a0 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  d *p;           
172b0 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72     /* Unpacked r
172c0 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20  ecord to return 
172d0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20  */.  int nOff;  
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172f0 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e       /* Incremen
17300 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66 66  t pSpace by nOff
17310 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a   to align it */.
17320 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
17330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17340 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
17350 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f  ytes required fo
17360 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65  r *p */..  /* We
17370 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74   want to shift t
17380 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63  he pointer pSpac
17390 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20 69  e up such that i
173a0 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67  t is 8-byte alig
173b0 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20  ned..  ** Thus, 
173c0 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75  we need to calcu
173d0 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f  late a value, nO
173e0 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ff, between 0 an
173f0 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20  d 7, to shift . 
17400 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70   ** it by.  If p
17410 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64 79  Space is already
17420 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c   8-byte aligned,
17430 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20   nOff should be 
17440 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66  zero..  */.  nOf
17450 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45  f = (8 - (SQLITE
17460 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61  _PTR_TO_INT(pSpa
17470 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20  ce) & 7)) & 7;. 
17480 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
17490 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52  sizeof(UnpackedR
174a0 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66  ecord)) + sizeof
174b0 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d  (Mem)*(pKeyInfo-
174c0 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66  >nField+1);.  if
174d0 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 2b  ( nByte>szSpace+
174e0 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d 20  nOff ){.    p = 
174f0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
17500 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
17510 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64  cRaw(pKeyInfo->d
17520 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a  b, nByte);.    *
17530 70 70 46 72 65 65 20 3d 20 28 63 68 61 72 20 2a  ppFree = (char *
17540 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29  )p;.    if( !p )
17550 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
17560 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70  se{.    p = (Unp
17570 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70 53  ackedRecord*)&pS
17580 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20  pace[nOff];.    
17590 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  *ppFree = 0;.  }
175a0 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d  ..  p->aMem = (M
175b0 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b  em*)&((char*)p)[
175c0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e  ROUND8(sizeof(Un
175d0 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b  packedRecord))];
175e0 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
175f0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
17600 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49  =0 );.  p->pKeyI
17610 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
17620 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b    p->nField = pK
17630 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
17640 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   1;.  return p;.
17650 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
17660 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63  he nKey-byte enc
17670 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72  oding of a recor
17680 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70  d in pKey[], pop
17690 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e  ulate the .** Un
176a0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
176b0 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
176c0 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61   by the fourth a
176d0 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65  rgument with the
176e0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
176f0 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f  the decoded reco
17700 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  rd..*/ .void sql
17710 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
17720 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20  pack(.  KeyInfo 
17730 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f  *pKeyInfo,     /
17740 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
17750 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66  out the record f
17760 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ormat */.  int n
17770 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
17780 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
17790 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
177a0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
177b0 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
177c0 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
177d0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
177e0 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50  ord *p      /* P
177f0 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72  opulate this str
17800 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65  ucture before re
17810 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20  turning. */.){. 
17820 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
17830 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
17840 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
17850 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20  r *)pKey;.  int 
17860 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20  d; .  u32 idx;  
17870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17880 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
17890 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61  in aKey[] to rea
178a0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20  d from */.  u16 
178b0 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
178c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
178d0 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
178e0 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a  nter */.  u32 sz
178f0 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  Hdr;.  Mem *pMem
17900 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70   = p->aMem;..  p
17910 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30  ->default_rc = 0
17920 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
17930 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
17940 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20  (pMem) );.  idx 
17950 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
17960 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20  ey, szHdr);.  d 
17970 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30  = szHdr;.  u = 0
17980 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
17990 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69  zHdr && u<p->nFi
179a0 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29  eld && d<=nKey )
179b0 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
179c0 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20  _type;..    idx 
179d0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
179e0 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61  aKey[idx], seria
179f0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65  l_type);.    pMe
17a00 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m->enc = pKeyInf
17a10 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d  o->enc;.    pMem
17a20 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ->db = pKeyInfo-
17a30 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d  >db;.    /* pMem
17a40 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20  ->flags = 0; // 
17a50 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17a60 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20  lGet() will set 
17a70 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20  this for us */. 
17a80 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63     pMem->zMalloc
17a90 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73   = 0;.    d += s
17aa0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
17ab0 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65  Get(&aKey[d], se
17ac0 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29  rial_type, pMem)
17ad0 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20  ;.    pMem++;.  
17ae0 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73    u++;.  }.  ass
17af0 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f  ert( u<=pKeyInfo
17b00 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a  ->nField + 1 );.
17b10 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b    p->nField = u;
17b20 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  .}..#if SQLITE_D
17b30 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EBUG./*.** This 
17b40 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
17b50 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74  s two index or t
17b60 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73  able record keys
17b70 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79   in the same way
17b80 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74  .** as the sqlit
17b90 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
17ba0 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55  are() routine. U
17bb0 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64  nlike VdbeRecord
17bc0 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68  Compare(),.** th
17bd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65  is function dese
17be0 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d  rializes and com
17bf0 70 61 72 65 73 20 76 61 6c 75 65 73 20 75 73 69  pares values usi
17c00 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  ng the.** sqlite
17c10 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
17c20 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43   and sqlite3MemC
17c30 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f  ompare() functio
17c40 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a  ns. It is used.*
17c50 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  * in assert() st
17c60 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
17c70 72 65 20 74 68 61 74 20 74 68 65 20 6f 70 74 69  re that the opti
17c80 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a  mized code in.**
17c90 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
17ca0 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75  rdCompare() retu
17cb0 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74 68  rns results with
17cc0 20 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69   these two primi
17cd0 74 69 76 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tives..*/.static
17ce0 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
17cf0 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20 69  ompareDebug(.  i
17d00 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
17d10 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
17d20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f  Left key */.  co
17d30 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  nst UnpackedReco
17d40 72 64 20 2a 70 50 4b 65 79 32 20 20 2f 2a 20 52  rd *pPKey2  /* R
17d50 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
17d60 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20   u32 d1;        
17d70 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
17d80 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
17d90 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
17da0 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
17db0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
17dc0 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
17dd0 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d  next header elem
17de0 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ent */.  u32 szH
17df0 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  dr1;        /* N
17e00 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
17e10 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
17e20 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  t i = 0;.  int r
17e30 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  c = 0;.  const u
17e40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
17e50 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
17e60 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
17e70 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  y1;.  KeyInfo *p
17e80 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d  KeyInfo;.  Mem m
17e90 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f  em1;..  pKeyInfo
17ea0 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
17eb0 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20  nfo;.  mem1.enc 
17ec0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
17ed0 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65  .  mem1.db = pKe
17ee0 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20  yInfo->db;.  /* 
17ef0 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20  mem1.flags = 0; 
17f00 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74   // Will be init
17f10 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74  ialized by sqlit
17f20 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
17f30 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) */.  VVA_ONLY(
17f40 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20   mem1.zMalloc = 
17f50 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  0; ) /* Only nee
17f60 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20  ded by assert() 
17f70 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20  statements */.. 
17f80 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61   /* Compilers ma
17f90 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20  y complain that 
17fa0 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65  mem1.u.i is pote
17fb0 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61  ntially uninitia
17fc0 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63  lized..  ** We c
17fd0 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20  ould initialize 
17fe0 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72  it, as shown her
17ff0 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68  e, to silence th
18000 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a  ose complaints..
18010 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74    ** But in fact
18020 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20  , mem1.u.i will 
18030 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62  never actually b
18040 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c  e used uninitial
18050 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20  ized, and doing 
18060 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65  .  ** the unnece
18070 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61  ssary initializa
18080 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75  tion has a measu
18090 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70  rable negative p
180a0 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20  erformance.  ** 
180b0 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68  impact, since th
180c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
180d0 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72  very high runner
180e0 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68  .  And so, we ch
180f0 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e  oose.  ** to ign
18100 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  ore the compiler
18110 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65   warnings and le
18120 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c  ave this variabl
18130 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  e uninitialized.
18140 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31  .  */.  /*  mem1
18150 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f  .u.i = 0;  // no
18160 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74  t needed, here t
18170 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c  o silence compil
18180 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20  er warning */.  
18190 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72  .  idx1 = getVar
181a0 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48  int32(aKey1, szH
181b0 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48  dr1);.  d1 = szH
181c0 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dr1;.  assert( p
181d0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
181e0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
181f0 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  d>=pPKey2->nFiel
18200 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  d || CORRUPT_DB 
18210 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
18220 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
18230 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
18240 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ( pKeyInfo->nFie
18250 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
18260 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c  ( idx1<=szHdr1 |
18270 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
18280 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65    do{.    u32 se
18290 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20  rial_type1;..   
182a0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72   /* Read the ser
182b0 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68  ial types for th
182c0 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69  e next element i
182d0 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20  n each key. */. 
182e0 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61     idx1 += getVa
182f0 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64  rint32( aKey1+id
18300 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  x1, serial_type1
18310 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69   );..    /* Veri
18320 66 79 20 74 68 61 74 20 74 68 65 72 65 20 69 73  fy that there is
18330 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63   enough key spac
18340 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61  e remaining to a
18350 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75  void.    ** a bu
18360 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20  ffer overread.  
18370 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74  The "d1+serial_t
18380 79 70 65 31 2b 32 22 20 73 75 62 65 78 70 72 65  ype1+2" subexpre
18390 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a  ssion will.    *
183a0 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72 65 61  * always be grea
183b0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
183c0 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20  l to the amount 
183d0 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65 79 20  of required key 
183e0 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73  space..    ** Us
183f0 65 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61  e that approxima
18400 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68  tion to avoid th
18410 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65  e more expensive
18420 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
18430 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
18440 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68  lTypeLen() in th
18450 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20  e common case.. 
18460 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31     */.    if( d1
18470 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e  +serial_type1+2>
18480 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20 20  (u32)nKey1.     
18490 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64 62  && d1+sqlite3Vdb
184a0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
184b0 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 33  erial_type1)>(u3
184c0 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a  2)nKey1 .    ){.
184d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
184e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61   }..    /* Extra
184f0 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f  ct the values to
18500 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20   be compared..  
18510 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73    */.    d1 += s
18520 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
18530 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
18540 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d  serial_type1, &m
18550 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  em1);..    /* Do
18560 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a   the comparison.
18570 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
18580 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
18590 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32  e(&mem1, &pPKey2
185a0 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49  ->aMem[i], pKeyI
185b0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a  nfo->aColl[i]);.
185c0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
185d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
185e0 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  em1.zMalloc==0 )
185f0 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  ;  /* See commen
18600 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  t below */.     
18610 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
18620 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
18630 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63          rc = -rc
18640 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65  ;  /* Invert the
18650 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43   result for DESC
18660 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a   sort order. */.
18670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
18680 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
18690 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65     i++;.  }while
186a0 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26  ( idx1<szHdr1 &&
186b0 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c   i<pPKey2->nFiel
186c0 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  d );..  /* No me
186d0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
186e0 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
186f0 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
18700 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
18710 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
18720 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
18730 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
18740 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
18750 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
18760 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
18770 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
18780 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20  lease(&mem1)..  
18790 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
187a0 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  1.zMalloc==0 );.
187b0 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
187c0 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
187d0 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
187e0 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
187f0 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
18800 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
18810 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
18820 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 74 68  l. Return the th
18830 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a  e default_rc.  *
18840 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72  * value.  */.  r
18850 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65  eturn pPKey2->de
18860 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 23 65 6e 64  fault_rc;.}.#end
18870 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a  if../*.** Both *
18880 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32  pMem1 and *pMem2
18890 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20   contain string 
188a0 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20  values. Compare 
188b0 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  the two values.*
188c0 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  * using the coll
188d0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70  ation sequence p
188e0 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20  Coll. As usual, 
188f0 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  return a negativ
18900 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  e , zero.** or p
18910 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
18920 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20   *pMem1 is less 
18930 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
18940 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a  r greater than .
18950 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65  ** *pMem2, respe
18960 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72  ctively. Similar
18970 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72   in spirit to "r
18980 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28  c = (*pMem1) - (
18990 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74  *pMem2);"..*/.st
189a0 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
189b0 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20  pareMemString(. 
189c0 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
189d0 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  1,.  const Mem *
189e0 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43  pMem2,.  const C
189f0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 0a 29 7b  ollSeq *pColl.){
18a00 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e  .  if( pMem1->en
18a10 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
18a20 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69  .    /* The stri
18a30 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ngs are already 
18a40 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 65  in the correct e
18a50 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74  ncoding.  Call t
18a60 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61  he.     ** compa
18a70 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64  rison function d
18a80 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72  irectly */.    r
18a90 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d  eturn pColl->xCm
18aa0 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70  p(pColl->pUser,p
18ab0 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a  Mem1->n,pMem1->z
18ac0 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d  ,pMem2->n,pMem2-
18ad0 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >z);.  }else{.  
18ae0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f    int rc;.    co
18af0 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76  nst void *v1, *v
18b00 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e  2;.    int n1, n
18b10 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20  2;.    Mem c1;. 
18b20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 6d     Mem c2;.    m
18b30 65 6d 73 65 74 28 26 63 31 2c 20 30 2c 20 73 69  emset(&c1, 0, si
18b40 7a 65 6f 66 28 63 31 29 29 3b 0a 20 20 20 20 6d  zeof(c1));.    m
18b50 65 6d 73 65 74 28 26 63 32 2c 20 30 2c 20 73 69  emset(&c2, 0, si
18b60 7a 65 6f 66 28 63 32 29 29 3b 0a 20 20 20 20 73  zeof(c2));.    s
18b70 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
18b80 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d  llowCopy(&c1, pM
18b90 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  em1, MEM_Ephem);
18ba0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18bb0 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26  MemShallowCopy(&
18bc0 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45  c2, pMem2, MEM_E
18bd0 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20  phem);.    v1 = 
18be0 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
18bf0 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
18c00 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  )&c1, pColl->enc
18c10 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d 3d  );.    n1 = v1==
18c20 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20 20  0 ? 0 : c1.n;.  
18c30 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61    v2 = sqlite3Va
18c40 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
18c50 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f  _value*)&c2, pCo
18c60 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 32  ll->enc);.    n2
18c70 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20 63   = v2==0 ? 0 : c
18c80 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70 43  2.n;.    rc = pC
18c90 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
18ca0 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c 20  >pUser, n1, v1, 
18cb0 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 73 71 6c  n2, v2);.    sql
18cc0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
18cd0 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71 6c  se(&c1);.    sql
18ce0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
18cf0 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72 65 74  se(&c2);.    ret
18d00 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  urn rc;.  }.}../
18d10 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
18d20 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65   values containe
18d30 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d  d by the two mem
18d40 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72  ory cells, retur
18d50 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65  ning.** negative
18d60 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69  , zero or positi
18d70 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c  ve if pMem1 is l
18d80 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
18d90 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a  to, or greater.*
18da0 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f  * than pMem2. So
18db0 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e  rting order is N
18dc0 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c  ULL's first, fol
18dd0 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73  lowed by numbers
18de0 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e   (integers.** an
18df0 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20  d reals) sorted 
18e00 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c  numerically, fol
18e10 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f 72  lowed by text or
18e20 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c  dered by the col
18e30 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
18e40 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e  ce pColl and fin
18e50 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65  ally blob's orde
18e60 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e  red by memcmp().
18e70 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20  .**.** Two NULL 
18e80 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69  values are consi
18e90 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 20 74  dered equal by t
18ea0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
18eb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43  .int sqlite3MemC
18ec0 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d  ompare(const Mem
18ed0 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d   *pMem1, const M
18ee0 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74  em *pMem2, const
18ef0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29   CollSeq *pColl)
18f00 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
18f10 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20  t f1, f2;.  int 
18f20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a  combined_flags;.
18f30 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66  .  f1 = pMem1->f
18f40 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65  lags;.  f2 = pMe
18f50 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d  m2->flags;.  com
18f60 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31  bined_flags = f1
18f70 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20 28  |f2;.  assert( (
18f80 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26  combined_flags &
18f90 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20   MEM_RowSet)==0 
18fa0 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65  );. .  /* If one
18fb0 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20   value is NULL, 
18fc0 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
18fd0 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f  the other. If bo
18fe0 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61  th values.  ** a
18ff0 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  re NULL, return 
19000 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  0..  */.  if( co
19010 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d  mbined_flags&MEM
19020 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
19030 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c  urn (f2&MEM_Null
19040 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c  ) - (f1&MEM_Null
19050 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
19060 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e  one value is a n
19070 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 6f 74  umber and the ot
19080 68 65 72 20 69 73 20 6e 6f 74 2c 20 74 68 65 20  her is not, the 
19090 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 2e 0a  number is less..
190a0 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65    ** If both are
190b0 20 6e 75 6d 62 65 72 73 2c 20 63 6f 6d 70 61 72   numbers, compar
190c0 65 20 61 73 20 72 65 61 6c 73 20 69 66 20 6f 6e  e as reals if on
190d0 65 20 69 73 20 61 20 72 65 61 6c 2c 20 6f 72 20  e is a real, or 
190e0 61 73 20 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a  as integers.  **
190f0 20 69 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20   if both values 
19100 61 72 65 20 69 6e 74 65 67 65 72 73 2e 0a 20 20  are integers..  
19110 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
19120 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74  d_flags&(MEM_Int
19130 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20  |MEM_Real) ){.  
19140 20 20 64 6f 75 62 6c 65 20 72 31 2c 20 72 32 3b    double r1, r2;
19150 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66  .    if( (f1 & f
19160 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  2 & MEM_Int)!=0 
19170 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  ){.      if( pMe
19180 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d  m1->u.i < pMem2-
19190 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31  >u.i ) return -1
191a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
191b0 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e  1->u.i > pMem2->
191c0 75 2e 69 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  u.i ) return 1;.
191d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
191e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
191f0 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29  1&MEM_Real)!=0 )
19200 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 70 4d 65  {.      r1 = pMe
19210 6d 31 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c 73 65  m1->r;.    }else
19220 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74   if( (f1&MEM_Int
19230 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 31  )!=0 ){.      r1
19240 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 31   = (double)pMem1
19250 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65  ->u.i;.    }else
19260 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
19270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19280 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30  (f2&MEM_Real)!=0
19290 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 70   ){.      r2 = p
192a0 4d 65 6d 32 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c  Mem2->r;.    }el
192b0 73 65 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49  se if( (f2&MEM_I
192c0 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
192d0 72 32 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65  r2 = (double)pMe
192e0 6d 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c  m2->u.i;.    }el
192f0 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
19300 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   -1;.    }.    i
19310 66 28 20 72 31 3c 72 32 20 29 20 72 65 74 75 72  f( r1<r2 ) retur
19320 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 72 31  n -1;.    if( r1
19330 3e 72 32 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  >r2 ) return 1;.
19340 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
19350 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76  }..  /* If one v
19360 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
19370 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69   and the other i
19380 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74  s a blob, the st
19390 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20  ring is less..  
193a0 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 73  ** If both are s
193b0 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20  trings, compare 
193c0 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74  using the collat
193d0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20  ing functions.. 
193e0 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
193f0 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72  ed_flags&MEM_Str
19400 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20   ){.    if( (f1 
19410 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b  & MEM_Str)==0 ){
19420 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
19430 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
19440 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30  f2 & MEM_Str)==0
19450 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
19460 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
19470 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
19480 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 29  nc==pMem2->enc )
19490 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
194a0 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
194b0 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20  _UTF8 || .      
194c0 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63        pMem1->enc
194d0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
194e0 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d   || pMem1->enc==
194f0 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
19500 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
19510 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
19520 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64   must be defined
19530 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
19540 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74  even if.    ** t
19550 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 73 20  he user deletes 
19560 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
19570 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 68 65  quence after the
19580 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73   vdbe program is
19590 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64  .    ** compiled
195a0 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61   (this was not a
195b0 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 29 2e  lways the case).
195c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
195d0 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43  rt( !pColl || pC
195e0 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20  oll->xCmp );..  
195f0 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
19600 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
19610 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
19620 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70  (pMem1, pMem2, p
19630 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Coll);.    }.   
19640 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f   /* If a NULL po
19650 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65 64  inter was passed
19660 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20   as the collate 
19670 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74  function, fall t
19680 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f  hrough.    ** to
19690 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61   the blob case a
196a0 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e  nd use memcmp().
196b0 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20    */.  }. .  /* 
196c0 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74  Both values must
196d0 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70   be blobs.  Comp
196e0 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70  are using memcmp
196f0 28 29 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 6d  ().  */.  rc = m
19700 65 6d 63 6d 70 28 70 4d 65 6d 31 2d 3e 7a 2c 20  emcmp(pMem1->z, 
19710 70 4d 65 6d 32 2d 3e 7a 2c 20 28 70 4d 65 6d 31  pMem2->z, (pMem1
19720 2d 3e 6e 3e 70 4d 65 6d 32 2d 3e 6e 29 3f 70 4d  ->n>pMem2->n)?pM
19730 65 6d 32 2d 3e 6e 3a 70 4d 65 6d 31 2d 3e 6e 29  em2->n:pMem1->n)
19740 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
19750 0a 20 20 20 20 72 63 20 3d 20 70 4d 65 6d 31 2d  .    rc = pMem1-
19760 3e 6e 20 2d 20 70 4d 65 6d 32 2d 3e 6e 3b 0a 20  >n - pMem2->n;. 
19770 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19780 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  }.../*.** The fi
19790 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
197a0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
197b0 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c  tion is a serial
197c0 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f  -type that.** co
197d0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
197e0 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61  integer - all va
197f0 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 61  lues between 1 a
19800 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a  nd 9 inclusive .
19810 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68 65  ** except 7. The
19820 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74   second points t
19830 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
19840 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72  ining an integer
19850 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c   value.** serial
19860 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  ized according t
19870 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54  o serial_type. T
19880 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
19890 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64  erializes.** and
198a0 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
198b0 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ue..*/.static i6
198c0 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  4 vdbeRecordDeco
198d0 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c  deInt(u32 serial
198e0 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20  _type, const u8 
198f0 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b  *aKey){.  u32 y;
19900 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
19910 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c  PT_DB || (serial
19920 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69  _type>=1 && seri
19930 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65  al_type<=9 && se
19940 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b  rial_type!=7) );
19950 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
19960 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
19970 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31  se 0:.    case 1
19980 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f  :.      return O
19990 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  NE_BYTE_INT(aKey
199a0 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20  );.    case 2:. 
199b0 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f       return TWO_
199c0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
199d0 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20      case 3:.    
199e0 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42    return THREE_B
199f0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
19a00 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20     case 4: {.   
19a10 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
19a20 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
19a30 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
19a40 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a  (int*)&y;.    }.
19a50 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20      case 5: {.  
19a60 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f      return FOUR_
19a70 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
19a80 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
19a90 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
19aa0 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aKey);.    }.   
19ab0 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20   case 6: {.     
19ac0 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
19ad0 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
19ae0 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
19af0 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
19b00 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
19b10 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
19b20 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20  64*)&x;.    }.  
19b30 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72  }..  return (ser
19b40 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d  ial_type - 8);.}
19b50 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
19b60 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
19b70 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
19b80 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
19b90 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ds.** specified 
19ba0 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  by {nKey1, pKey1
19bb0 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49  } and pPKey2.  I
19bc0 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61  t returns a nega
19bd0 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
19be0 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
19bf0 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73  r if key1 is les
19c00 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
19c10 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
19c20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20  than key2.  The 
19c30 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
19c40 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
19c50 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
19c60 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  th OP_MakeRecord
19c70 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56   opcode of the V
19c80 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32  DBE.  The pPKey2
19c90 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20  .** key must be 
19ca0 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63  a parsed key suc
19cb0 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72  h as obtained fr
19cc0 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
19cd0 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a  eParseRecord..**
19ce0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
19cf0 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  bSkip is non-zer
19d00 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  o, it is assumed
19d10 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
19d20 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
19d30 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
19d40 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  the first fields
19d50 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72 65   of the keys are
19d60 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65   equal..**.** Ke
19d70 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e  y1 and Key2 do n
19d80 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61  ot have to conta
19d90 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  in the same numb
19da0 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66  er of fields. If
19db0 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20   all .** fields 
19dc0 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 62  that appear in b
19dd0 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71 75  oth keys are equ
19de0 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d  al, then pPKey2-
19df0 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a  >default_rc is .
19e00 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ** returned..*/.
19e10 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
19e20 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20  ecordCompare(.  
19e30 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
19e40 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20   void *pKey1,   
19e50 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
19e60 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52   const UnpackedR
19e70 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20  ecord *pPKey2,  
19e80 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
19e90 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20  .  int bSkip    
19ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19eb0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73     /* If true, s
19ec0 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66 69  kip the first fi
19ed0 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  eld */.){.  u32 
19ee0 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d1;             
19ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
19f00 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
19f10 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65  ] of next data e
19f20 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  lement */.  int 
19f30 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
19f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
19f50 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65  ndex of next fie
19f60 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  ld to compare */
19f70 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
19f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f90 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
19fa0 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 62  cord header in b
19fb0 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64  ytes */.  u32 id
19fc0 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  x1;             
19fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
19fe0 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 70  set of first typ
19ff0 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  e in header */. 
1a000 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
1a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a020 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
1a030 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20   */.  Mem *pRhs 
1a040 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20  = pPKey2->aMem; 
1a050 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69        /* Next fi
1a060 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f  eld of pPKey2 to
1a070 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65   compare */.  Ke
1a080 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
1a090 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  = pPKey2->pKeyIn
1a0a0 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  fo;.  const unsi
1a0b0 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
1a0c0 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1a0d0 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
1a0e0 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20  .  Mem mem1;..  
1a0f0 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20 74  /* If bSkip is t
1a100 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61  rue, then the ca
1a110 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1a120 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
1a130 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
1a140 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  two elements in 
1a150 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75  the keys are equ
1a160 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72 69  al. Fix the vari
1a170 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69 61 62  ous stack variab
1a180 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  les so.  ** that
1a190 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
1a1a0 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61  gins comparing a
1a1b0 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65  t the second fie
1a1c0 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b  ld. */.  if( bSk
1a1d0 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31  ip ){.    u32 s1
1a1e0 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b  ;.    idx1 = 1 +
1a1f0 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
1a200 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20  ey1[1], s1);.   
1a210 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b   szHdr1 = aKey1[
1a220 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48  0];.    d1 = szH
1a230 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  dr1 + sqlite3Vdb
1a240 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
1a250 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20  1);.    i = 1;. 
1a260 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c     pRhs++;.  }el
1a270 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67  se{.    idx1 = g
1a280 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
1a290 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64  , szHdr1);.    d
1a2a0 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20  1 = szHdr1;.    
1a2b0 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56  i = 0;.  }..  VV
1a2c0 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61  A_ONLY( mem1.zMa
1a2d0 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
1a2e0 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
1a2f0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1a300 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  s */.  assert( p
1a310 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1a320 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e  >nField+pPKey2->
1a330 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1a340 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  d>=pPKey2->nFiel
1a350 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  d .       || COR
1a360 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
1a370 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1a380 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1a390 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1a3a0 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1a3b0 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a  fo->nField>0 );.
1a3c0 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d    assert( idx1<=
1a3d0 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50  szHdr1 || CORRUP
1a3e0 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  T_DB );.  do{.  
1a3f0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1a400 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69  e;..    /* RHS i
1a410 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a  s an integer */.
1a420 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c      if( pRhs->fl
1a430 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
1a440 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
1a450 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
1a460 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
1a470 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
1a480 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1a490 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1a4a0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29  serial_type==0 )
1a4b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1a4c0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1a4d0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1a4e0 37 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 75  7 ){.        dou
1a4f0 62 6c 65 20 72 68 73 20 3d 20 28 64 6f 75 62 6c  ble rhs = (doubl
1a500 65 29 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20  e)pRhs->u.i;.   
1a510 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a520 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
1a530 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
1a540 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20  e, &mem1);.     
1a550 20 20 20 69 66 28 20 6d 65 6d 31 2e 72 3c 72 68     if( mem1.r<rh
1a560 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
1a570 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
1a580 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e 72  }else if( mem1.r
1a590 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  >rhs ){.        
1a5a0 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1a5b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1a5c0 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c 68  {.        i64 lh
1a5d0 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65  s = vdbeRecordDe
1a5e0 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74  codeInt(serial_t
1a5f0 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29  ype, &aKey1[d1])
1a600 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 72 68  ;.        i64 rh
1a610 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20  s = pRhs->u.i;. 
1a620 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72         if( lhs<r
1a630 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1a640 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  rc = -1;.       
1a650 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72   }else if( lhs>r
1a660 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1a670 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20  rc = +1;.       
1a680 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1a690 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1a6a0 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65  real */.    else
1a6b0 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1a6c0 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
1a6d0 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
1a6e0 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
1a6f0 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1a700 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
1a710 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1a720 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1a730 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a  rial_type==0 ){.
1a740 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1a750 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1a760 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68 73        double rhs
1a770 20 3d 20 70 52 68 73 2d 3e 72 3b 0a 20 20 20 20   = pRhs->r;.    
1a780 20 20 20 20 64 6f 75 62 6c 65 20 6c 68 73 3b 0a      double lhs;.
1a790 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a7a0 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1a7b0 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
1a7c0 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  type, &mem1);.  
1a7d0 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1a7e0 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
1a7f0 20 20 20 20 20 20 6c 68 73 20 3d 20 6d 65 6d 31        lhs = mem1
1a800 2e 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  .r;.        }els
1a810 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 68 73  e{.          lhs
1a820 20 3d 20 28 64 6f 75 62 6c 65 29 6d 65 6d 31 2e   = (double)mem1.
1a830 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  u.i;.        }. 
1a840 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72         if( lhs<r
1a850 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1a860 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  rc = -1;.       
1a870 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72   }else if( lhs>r
1a880 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1a890 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20  rc = +1;.       
1a8a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1a8b0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1a8c0 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  a string */.    
1a8d0 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
1a8e0 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
1a8f0 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e  {.      getVarin
1a900 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d  t32(&aKey1[idx1]
1a910 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1a920 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1a930 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20  _type<12 ){.    
1a940 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1a950 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73     }else if( !(s
1a960 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
1a970 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
1a980 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1a990 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31  se{.        mem1
1a9a0 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  .n = (serial_typ
1a9b0 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20  e - 12) / 2;.   
1a9c0 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d       if( (d1+mem
1a9d0 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64  1.n) > (unsigned
1a9e0 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20  )nKey1 ){.      
1a9f0 20 20 20 20 72 63 20 3d 20 31 3b 20 20 20 20 20      rc = 1;     
1aa00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1aa10 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1aa20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b      }else if( pK
1aa30 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1aa40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1aa50 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
1aa60 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20  o->enc;.        
1aa70 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79    mem1.db = pKey
1aa80 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20  Info->db;.      
1aa90 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d      mem1.flags =
1aaa0 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20   MEM_Str;.      
1aab0 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68      mem1.z = (ch
1aac0 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a  ar*)&aKey1[d1];.
1aad0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76            rc = v
1aae0 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
1aaf0 69 6e 67 28 26 6d 65 6d 31 2c 20 70 52 68 73 2c  ing(&mem1, pRhs,
1ab00 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
1ab10 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
1ab20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1ab30 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65  nt nCmp = MIN(me
1ab40 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a  m1.n, pRhs->n);.
1ab50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
1ab60 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d  emcmp(&aKey1[d1]
1ab70 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29  , pRhs->z, nCmp)
1ab80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1ab90 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d  rc==0 ) rc = mem
1aba0 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a  1.n - pRhs->n; .
1abb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1abc0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1abd0 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  RHS is a blob */
1abe0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1abf0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1ac00 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 67 65  Blob ){.      ge
1ac10 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1ac20 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
1ac30 79 70 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ype);.      if( 
1ac40 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c  serial_type<12 |
1ac50 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26  | (serial_type &
1ac60 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20   0x01) ){.      
1ac70 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1ac80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ac90 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69  int nStr = (seri
1aca0 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20  al_type - 12) / 
1acb0 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  2;.        if( (
1acc0 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69  d1+nStr) > (unsi
1acd0 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20  gned)nKey1 ){.  
1ace0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 20          rc = 1; 
1acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ad00 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
1ad10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ad20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d           int nCm
1ad30 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52  p = MIN(nStr, pR
1ad40 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  hs->n);.        
1ad50 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61    rc = memcmp(&a
1ad60 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e  Key1[d1], pRhs->
1ad70 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20  z, nCmp);.      
1ad80 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20      if( rc==0 ) 
1ad90 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73  rc = nStr - pRhs
1ada0 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ->n;.        }. 
1adb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1adc0 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c    /* RHS is null
1add0 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20   */.    else{.  
1ade0 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
1adf0 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
1ae00 20 20 20 20 20 72 63 20 3d 20 28 73 65 72 69 61       rc = (seria
1ae10 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20  l_type!=0);.    
1ae20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  }..    if( rc!=0
1ae30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4b   ){.      if( pK
1ae40 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1ae50 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[i] ){.       
1ae60 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20   rc = -rc;.     
1ae70 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
1ae80 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20   CORRUPT_DB .   
1ae90 20 20 20 20 20 20 20 7c 7c 20 28 72 63 3c 30 20         || (rc<0 
1aea0 26 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  && vdbeRecordCom
1aeb0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1aec0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3c   pKey1, pPKey2)<
1aed0 30 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0).          || 
1aee0 28 72 63 3e 30 20 26 26 20 76 64 62 65 52 65 63  (rc>0 && vdbeRec
1aef0 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1af00 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1af10 4b 65 79 32 29 3e 30 29 0a 20 20 20 20 20 20 29  Key2)>0).      )
1af20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1af30 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  mem1.zMalloc==0 
1af40 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65  );  /* See comme
1af50 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  nt below */.    
1af60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1af70 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20   }..    i++;.   
1af80 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20   pRhs++;.    d1 
1af90 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
1afa0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
1afb0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64  al_type);.    id
1afc0 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72  x1 += sqlite3Var
1afd0 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  intLen(serial_ty
1afe0 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  pe);.  }while( i
1aff0 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a  dx1<(unsigned)sz
1b000 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32  Hdr1 && i<pPKey2
1b010 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d  ->nField && d1<=
1b020 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1b030 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f  );..  /* No memo
1b040 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
1b050 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
1b060 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
1b070 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
1b080 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
1b090 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
1b0a0 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
1b0b0 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
1b0c0 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
1b0d0 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
1b0e0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1b0f0 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a  ase(&mem1).  */.
1b100 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a    assert( mem1.z
1b110 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20  Malloc==0 );..  
1b120 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65  /* rc==0 here me
1b130 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20  ans that one or 
1b140 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73  both of the keys
1b150 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
1b160 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20  ds and.  ** all 
1b170 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
1b180 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
1b190 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74   equal. Return t
1b1a0 68 65 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72  he the default_r
1b1b0 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a  c.  ** value.  *
1b1c0 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  /.  assert( CORR
1b1d0 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  UPT_DB .       |
1b1e0 7c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  | pPKey2->defaul
1b1f0 74 5f 72 63 3d 3d 76 64 62 65 52 65 63 6f 72 64  t_rc==vdbeRecord
1b200 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
1b210 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1b220 32 29 20 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  2) .  );.  retur
1b230 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
1b240 74 5f 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  t_rc;.}../*.** T
1b250 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1b260 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72  an optimized ver
1b270 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
1b280 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1b290 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20  () .** that (a) 
1b2a0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1b2b0 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20  of pPKey2 is an 
1b2c0 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29  integer, and (b)
1b2d0 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66   the .** size-of
1b2e0 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61  -header varint a
1b2f0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28  t the start of (
1b300 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74  pKey1/nKey1) fit
1b310 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  s in a single.**
1b320 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c   byte (i.e. is l
1b330 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a  ess than 128)..*
1b340 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1b350 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
1b360 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  t(.  int nKey1, 
1b370 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1b380 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
1b390 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b  /.  const Unpack
1b3a0 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1b3b0 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a  , /* Right key *
1b3c0 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20  /.  int bSkip   
1b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3e0 20 20 2f 2a 20 49 67 6e 6f 72 65 64 20 2a 2f 0a    /* Ignored */.
1b3f0 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  ){.  const u8 *a
1b400 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75  Key = &((const u
1b410 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73  8*)pKey1)[*(cons
1b420 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78  t u8*)pKey1 & 0x
1b430 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  3F];.  int seria
1b440 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74  l_type = ((const
1b450 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a   u8*)pKey1)[1];.
1b460 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32    int res;.  u32
1b470 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69   y;.  u64 x;.  i
1b480 36 34 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61  64 v = pPKey2->a
1b490 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 36  Mem[0].u.i;.  i6
1b4a0 34 20 6c 68 73 3b 0a 20 20 55 4e 55 53 45 44 5f  4 lhs;.  UNUSED_
1b4b0 50 41 52 41 4d 45 54 45 52 28 62 53 6b 69 70 29  PARAMETER(bSkip)
1b4c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53 6b  ;..  assert( bSk
1b4d0 69 70 3d 3d 30 20 29 3b 0a 20 20 73 77 69 74 63  ip==0 );.  switc
1b4e0 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
1b4f0 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  {.    case 1: { 
1b500 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
1b510 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1b520 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45    lhs = ONE_BYTE
1b530 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1b540 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1b550 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20     case 2: { /* 
1b560 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  2-byte signed in
1b570 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
1b580 68 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e  hs = TWO_BYTE_IN
1b590 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 62  T(aKey);.      b
1b5a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1b5b0 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
1b5c0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1b5d0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
1b5e0 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  = THREE_BYTE_INT
1b5f0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 62 72  (aKey);.      br
1b600 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1b610 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79  ase 4: { /* 4-by
1b620 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1b630 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46  r */.      y = F
1b640 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1b650 65 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d  ey);.      lhs =
1b660 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b   (i64)*(int*)&y;
1b670 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b680 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
1b690 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
1b6a0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1b6b0 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42      lhs = FOUR_B
1b6c0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29  YTE_UINT(aKey+2)
1b6d0 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
1b6e0 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  )*TWO_BYTE_INT(a
1b6f0 4b 65 79 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Key);.      brea
1b700 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1b710 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65  e 6: { /* 8-byte
1b720 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1b730 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55  */.      x = FOU
1b740 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1b750 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  );.      x = (x<
1b760 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45  <32) | FOUR_BYTE
1b770 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20  _UINT(aKey+4);. 
1b780 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34       lhs = *(i64
1b790 2a 29 26 78 3b 0a 20 20 20 20 20 20 62 72 65 61  *)&x;.      brea
1b7a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1b7b0 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20  e 8: .      lhs 
1b7c0 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1b7d0 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20  ;.    case 9:.  
1b7e0 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20      lhs = 1;.   
1b7f0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f     break;..    /
1b800 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c  * This case coul
1b810 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74  d be removed wit
1b820 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68  hout changing th
1b830 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e  e results of run
1b840 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73  ning.    ** this
1b850 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67   code. Including
1b860 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20 74   it causes gcc t
1b870 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61 73  o generate a fas
1b880 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20 20  ter switch .    
1b890 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69  ** statement (si
1b8a0 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66  nce the range of
1b8b0 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73 20   switch targets 
1b8c0 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a 65  now starts at ze
1b8d0 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73  ro and.    ** is
1b8e0 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74   contiguous) but
1b8f0 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
1b900 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f  any duplicate co
1b910 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  de to be generat
1b920 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63  ed.    ** (as gc
1b930 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75  c is clever enou
1b940 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  gh to combine th
1b950 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73  e two like cases
1b960 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a  ). Other .    **
1b970 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74   compilers might
1b980 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f   be similar.  */
1b990 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63 61   .    case 0: ca
1b9a0 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75  se 7:.      retu
1b9b0 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
1b9c0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
1b9d0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1b9e0 2c 20 30 29 3b 0a 0a 20 20 20 20 64 65 66 61 75  , 0);..    defau
1b9f0 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
1ba00 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1ba10 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
1ba20 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1ba30 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76  0);.  }..  if( v
1ba40 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  >lhs ){.    res 
1ba50 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
1ba60 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20  }else if( v<lhs 
1ba70 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
1ba80 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65  ey2->r2;.  }else
1ba90 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
1baa0 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  eld>1 ){.    /* 
1bab0 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
1bac0 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
1bad0 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70   are equal. Comp
1bae0 61 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67  are the trailing
1baf0 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e   .    ** fields.
1bb00 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73    */.    res = s
1bb10 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1bb20 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70  Compare(nKey1, p
1bb30 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29  Key1, pPKey2, 1)
1bb40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1bb50 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
1bb60 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
1bb70 79 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64  ys are equal and
1bb80 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72   there are no tr
1bb90 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69  ailing.    ** fi
1bba0 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b  elds. Return pPK
1bbb0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
1bbc0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f  in this case. */
1bbd0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
1bbe0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
1bbf0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 72   }..  assert( (r
1bc00 65 73 3d 3d 30 20 26 26 20 76 64 62 65 52 65 63  es==0 && vdbeRec
1bc10 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1bc20 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1bc30 4b 65 79 32 29 3d 3d 30 29 0a 20 20 20 20 20 20  Key2)==0).      
1bc40 20 7c 7c 20 28 72 65 73 3c 30 20 26 26 20 76 64   || (res<0 && vd
1bc50 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1bc60 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
1bc70 31 2c 20 70 50 4b 65 79 32 29 3c 30 29 0a 20 20  1, pPKey2)<0).  
1bc80 20 20 20 20 20 7c 7c 20 28 72 65 73 3e 30 20 26       || (res>0 &
1bc90 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  & vdbeRecordComp
1bca0 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1bcb0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3e 30  pKey1, pPKey2)>0
1bcc0 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52  ).       || CORR
1bcd0 55 50 54 5f 44 42 0a 20 20 29 3b 0a 20 20 72 65  UPT_DB.  );.  re
1bce0 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
1bcf0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1bd00 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
1bd10 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
1bd20 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1bd30 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20  pare() .** that 
1bd40 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69  (a) the first fi
1bd50 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73  eld of pPKey2 is
1bd60 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20   a string, that 
1bd70 28 62 29 20 74 68 65 20 66 69 72 73 74 20 66 69  (b) the first fi
1bd80 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20  eld.** uses the 
1bd90 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1bda0 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63  ce BINARY and (c
1bdb0 29 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d  ) that the size-
1bdc0 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
1bdd0 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72   .** at the star
1bde0 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79  t of (pKey1/nKey
1bdf0 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  1) fits in a sin
1be00 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61  gle byte..*/.sta
1be10 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f  tic int vdbeReco
1be20 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
1be30 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1be40 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1be50 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1be60 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64    const Unpacked
1be70 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20  Record *pPKey2, 
1be80 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1be90 20 20 69 6e 74 20 62 53 6b 69 70 0a 29 7b 0a 20    int bSkip.){. 
1bea0 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31   const u8 *aKey1
1beb0 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b   = (const u8*)pK
1bec0 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  ey1;.  int seria
1bed0 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65  l_type;.  int re
1bee0 73 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  s;.  UNUSED_PARA
1bef0 4d 45 54 45 52 28 62 53 6b 69 70 29 3b 0a 0a 20  METER(bSkip);.. 
1bf00 20 61 73 73 65 72 74 28 20 62 53 6b 69 70 3d 3d   assert( bSkip==
1bf10 30 20 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74  0 );.  getVarint
1bf20 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65  32(&aKey1[1], se
1bf30 72 69 61 6c 5f 74 79 70 65 29 3b 0a 0a 20 20 69  rial_type);..  i
1bf40 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
1bf50 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  2 ){.    res = p
1bf60 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20  PKey2->r1;      
1bf70 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
1bf80 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20   is a number or 
1bf90 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73  a null */.  }els
1bfa0 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
1bfb0 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a  ype & 0x01) ){ .
1bfc0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1bfd0 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70  ->r2;      /* (p
1bfe0 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61  Key1/nKey1) is a
1bff0 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65   blob */.  }else
1c000 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a  {.    int nCmp;.
1c010 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20      int nStr;.  
1c020 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b    int szHdr = aK
1c030 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74  ey1[0];..    nSt
1c040 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
1c050 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66  -12) / 2;.    if
1c060 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29  ( (szHdr + nStr)
1c070 20 3e 20 6e 4b 65 79 31 20 29 20 72 65 74 75 72   > nKey1 ) retur
1c080 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75  n 0;    /* Corru
1c090 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 6e 43 6d  ption */.    nCm
1c0a0 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d  p = MIN( pPKey2-
1c0b0 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72  >aMem[0].n, nStr
1c0c0 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65   );.    res = me
1c0d0 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64  mcmp(&aKey1[szHd
1c0e0 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r], pPKey2->aMem
1c0f0 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20  [0].z, nCmp);.. 
1c100 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
1c110 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74  .      res = nSt
1c120 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r - pPKey2->aMem
1c130 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28  [0].n;.      if(
1c140 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
1c150 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e     if( pPKey2->n
1c160 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20  Field>1 ){.     
1c170 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74       res = sqlit
1c180 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1c190 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  are(nKey1, pKey1
1c1a0 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20  , pPKey2, 1);.  
1c1b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c1c0 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
1c1d0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
1c1e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c1f0 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30   }else if( res>0
1c200 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
1c210 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
1c220 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c230 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1c240 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >r1;.      }.   
1c250 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30   }else if( res>0
1c260 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
1c270 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20  pPKey2->r2;.    
1c280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73  }else{.      res
1c290 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
1c2a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
1c2b0 72 74 28 20 28 72 65 73 3d 3d 30 20 26 26 20 76  rt( (res==0 && v
1c2c0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c2d0 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
1c2e0 79 31 2c 20 70 50 4b 65 79 32 29 3d 3d 30 29 0a  y1, pPKey2)==0).
1c2f0 20 20 20 20 20 20 20 7c 7c 20 28 72 65 73 3c 30         || (res<0
1c300 20 26 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f   && vdbeRecordCo
1c310 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
1c320 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29  , pKey1, pPKey2)
1c330 3c 30 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 72  <0).       || (r
1c340 65 73 3e 30 20 26 26 20 76 64 62 65 52 65 63 6f  es>0 && vdbeReco
1c350 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
1c360 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1c370 65 79 32 29 3e 30 29 0a 20 20 20 20 20 20 20 7c  ey2)>0).       |
1c380 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20 29  | CORRUPT_DB.  )
1c390 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
1c3a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1c3b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
1c3c0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1c3d0 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61  dCompare() compa
1c3e0 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  tible function.*
1c3f0 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63  * suitable for c
1c400 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69  omparing seriali
1c410 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74  zed records to t
1c420 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f  he unpacked reco
1c430 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  rd passed.** as 
1c440 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
1c450 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70  t..*/.RecordComp
1c460 61 72 65 20 73 71 6c 69 74 65 33 56 64 62 65 46  are sqlite3VdbeF
1c470 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63  indCompare(Unpac
1c480 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  kedRecord *p){. 
1c490 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64   /* varintRecord
1c4a0 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64  CompareInt() and
1c4b0 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
1c4c0 70 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74  pareString() bot
1c4d0 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68  h assume.  ** th
1c4e0 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68  at the size-of-h
1c4f0 65 61 64 65 72 20 76 61 72 69 6e 74 20 74 68 61  eader varint tha
1c500 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20  t occurs at the 
1c510 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 72 65  start of each re
1c520 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69  cord.  ** fits i
1c530 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
1c540 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20  (i.e. is 127 or 
1c550 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63  less). varintRec
1c560 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a  ordCompareInt().
1c570 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65    ** also assume
1c580 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66  s that it is saf
1c590 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20  e to overread a 
1c5a0 62 75 66 66 65 72 20 62 79 20 61 74 20 6c 65 61  buffer by at lea
1c5b0 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78  st the .  ** max
1c5c0 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65  imum possible le
1c5d0 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  gal header size 
1c5e0 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42 65  plus 8 bytes. Be
1c5f0 63 61 75 73 65 20 74 68 65 72 65 20 69 73 0a 20  cause there is. 
1c600 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
1c610 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 37 34  o be at least 74
1c620 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62   (but not 136) b
1c630 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
1c640 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20  following each. 
1c650 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65   ** buffer passe
1c660 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72  d to varintRecor
1c670 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68  dCompareInt() th
1c680 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76  is makes it conv
1c690 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c  enient to.  ** l
1c6a0 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66  imit the size of
1c6b0 20 74 68 65 20 68 65 61 64 65 72 20 74 6f 20 36   the header to 6
1c6c0 34 20 62 79 74 65 73 20 69 6e 20 63 61 73 65 73  4 bytes in cases
1c6d0 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
1c6e0 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61   field.  ** is a
1c6f0 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a  n integer..  **.
1c700 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74    ** The easiest
1c710 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20   way to enforce 
1c720 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f  this limit is to
1c730 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72   consider only r
1c740 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a  ecords with.  **
1c750 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65   13 fields or le
1c760 73 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74  ss. If the first
1c770 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74   field is an int
1c780 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75  eger, the maximu
1c790 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61  m legal.  ** hea
1c7a0 64 65 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a  der size is (12*
1c7b0 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73  5 + 1 + 1) bytes
1c7c0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
1c7d0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1c7e0 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e   + p->pKeyInfo->
1c7f0 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b 0a  nXField)<=13 ){.
1c800 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
1c810 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73  p->aMem[0].flags
1c820 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65  ;.    if( p->pKe
1c830 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1c840 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d  r[0] ){.      p-
1c850 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  >r1 = 1;.      p
1c860 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  ->r2 = -1;.    }
1c870 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72  else{.      p->r
1c880 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d  1 = -1;.      p-
1c890 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  >r2 = 1;.    }. 
1c8a0 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
1c8b0 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20  MEM_Int) ){.    
1c8c0 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63    return vdbeRec
1c8d0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20  ordCompareInt;. 
1c8e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c     }.    if( (fl
1c8f0 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d  ags & (MEM_Int|M
1c900 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c  EM_Real|MEM_Null
1c910 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 0a  |MEM_Blob))==0 .
1c920 20 20 20 20 20 20 20 20 26 26 20 70 2d 3e 70 4b          && p->pK
1c930 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
1c940 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
1c950 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63    return vdbeRec
1c960 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
1c970 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
1c980 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1c990 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a  eRecordCompare;.
1c9a0 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f  }../*.** pCur po
1c9b0 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
1c9c0 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
1c9d0 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
1c9e0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
1c9f0 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
1ca00 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
1ca10 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
1ca20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
1ca30 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
1ca40 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
1ca50 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
1ca60 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1ca70 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
1ca80 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65  ** pCur might be
1ca90 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78   pointing to tex
1caa0 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
1cab0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
1cac0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74  se file..** So t
1cad0 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f  he content canno
1cae0 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44  t be trusted.  D
1caf0 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68  o appropriate ch
1cb00 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ecks on the cont
1cb10 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
1cb20 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
1cb30 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43  sqlite3 *db, BtC
1cb40 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
1cb50 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
1cb60 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
1cb70 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
1cb80 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
1cb90 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
1cba0 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
1cbb0 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
1cbc0 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
1cbd0 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
1cbe0 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
1cbf0 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
1cc00 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
1cc10 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1cc20 54 45 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47  TER(db);..  /* G
1cc30 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
1cc40 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20  he index entry. 
1cc50 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e   Only indices en
1cc60 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20  tries of less.  
1cc70 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65  ** than 2GiB are
1cc80 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68   support - anyth
1cc90 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62  ing large must b
1cca0 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  e database corru
1ccb0 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20  ption..  ** Any 
1ccc0 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
1ccd0 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65  tected in sqlite
1cce0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
1ccf0 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f  tr(), though, so
1cd00 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20  .  ** this code 
1cd10 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d  can safely assum
1cd20 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20  e that nCellKey 
1cd30 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a  is 32-bits  .  *
1cd40 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
1cd50 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
1cd60 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
1cd70 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20   VVA_ONLY(rc =) 
1cd80 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
1cd90 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
1cda0 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
1cdb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
1cdc0 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20       /* pCur is 
1cdd0 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
1cde0 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
1cdf0 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ail */.  assert(
1ce00 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c   (nCellKey & SQL
1ce10 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75  ITE_MAX_U32)==(u
1ce20 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a  64)nCellKey );..
1ce30 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
1ce40 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
1ce50 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  t of the index e
1ce60 6e 74 72 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  ntry */.  memset
1ce70 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d  (&m, 0, sizeof(m
1ce80 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
1ce90 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
1cea0 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32  ee(pCur, 0, (u32
1ceb0 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d  )nCellKey, 1, &m
1cec0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1ced0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1cee0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  }..  /* The inde
1cef0 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67  x entry must beg
1cf00 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72  in with a header
1cf10 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64   size */.  (void
1cf20 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
1cf30 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20  *)m.z, szHdr);. 
1cf40 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
1cf50 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
1cf60 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b  e( szHdr==m.n );
1cf70 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
1cf80 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29  szHdr<3 || (int)
1cf90 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20  szHdr>m.n) ){.  
1cfa0 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
1cfb0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
1cfc0 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20  ..  /* The last 
1cfd0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64  field of the ind
1cfe0 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  ex should be an 
1cff0 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f  integer - the RO
1d000 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79  WID..  ** Verify
1d010 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65   that the last e
1d020 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61  ntry really is a
1d030 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  n integer. */.  
1d040 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
1d050 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
1d060 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29  r-1], typeRowid)
1d070 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
1d080 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20  peRowid==1 );.  
1d090 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
1d0a0 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74  wid==2 );.  test
1d0b0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
1d0c0 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
1d0d0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29  ( typeRowid==4 )
1d0e0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
1d0f0 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20  peRowid==5 );.  
1d100 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
1d110 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74  wid==6 );.  test
1d120 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
1d130 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =8 );.  testcase
1d140 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29  ( typeRowid==9 )
1d150 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
1d160 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20  (typeRowid<1 || 
1d170 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74  typeRowid>9 || t
1d180 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a  ypeRowid==7) ){.
1d190 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
1d1a0 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
1d1b0 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20   }.  lenRowid = 
1d1c0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1d1d0 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77  lTypeLen(typeRow
1d1e0 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  id);.  testcase(
1d1f0 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72   (u32)m.n==szHdr
1d200 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69  +lenRowid );.  i
1d210 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32  f( unlikely((u32
1d220 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f  )m.n<szHdr+lenRo
1d230 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  wid) ){.    goto
1d240 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
1d250 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ption;.  }..  /*
1d260 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65 67   Fetch the integ
1d270 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  er off the end o
1d280 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f  f the index reco
1d290 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  rd */.  sqlite3V
1d2a0 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38  dbeSerialGet((u8
1d2b0 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f  *)&m.z[m.n-lenRo
1d2c0 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c  wid], typeRowid,
1d2d0 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d   &v);.  *rowid =
1d2e0 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65   v.u.i;.  sqlite
1d2f0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1d300 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
1d310 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a  LITE_OK;..  /* J
1d320 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74 61  ump here if data
1d330 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
1d340 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74 65  is detected afte
1d350 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a  r m has been.  *
1d360 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72  * allocated.  Fr
1d370 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20  ee the m object 
1d380 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
1d390 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64  E_CORRUPT. */.id
1d3a0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
1d3b0 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20  on:.  testcase( 
1d3c0 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a  m.zMalloc!=0 );.
1d3d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1d3e0 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
1d3f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1d400 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a  RUPT_BKPT;.}../*
1d410 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
1d420 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78  key of the index
1d430 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
1d440 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e  or pC is pointin
1d450 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20  g to against.** 
1d460 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69  the key string i
1d470 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72  n pUnpacked.  Wr
1d480 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61  ite into *pRes a
1d490 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20   number.** that 
1d4a0 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  is negative, zer
1d4b0 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
1d4c0 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61  f pC is less tha
1d4d0 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20  n, equal to,.** 
1d4e0 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
1d4f0 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75  pUnpacked.  Retu
1d500 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
1d510 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70  success..**.** p
1d520 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68  Unpacked is eith
1d530 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f  er created witho
1d540 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73  ut a rowid or is
1d550 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68   truncated so th
1d560 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74  at it.** omits t
1d570 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
1d580 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  end.  The rowid 
1d590 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
1d5a0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a  e index entry.**
1d5b0 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77   is ignored as w
1d5c0 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69  ell.  Hence, thi
1d5d0 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63  s routine only c
1d5e0 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66  ompares the pref
1d5f0 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20  ixes .** of the 
1d600 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68  keys prior to th
1d610 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e  e final rowid, n
1d620 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  ot the entire ke
1d630 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1d640 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
1d650 72 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f 72  re(.  VdbeCursor
1d660 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20   *pC,           
1d670 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
1d680 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20  rsor to compare 
1d690 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 63 6f 6e  against */.  con
1d6a0 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  st UnpackedRecor
1d6b0 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 2f 2a  d *pUnpacked, /*
1d6c0 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f   Unpacked versio
1d6d0 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  n of key */.  in
1d6e0 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20  t *res          
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d700 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70  * Write the comp
1d710 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65  arison result he
1d720 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e  re */.){.  i64 n
1d730 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
1d740 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
1d750 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43  r *pCur = pC->pC
1d760 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a  ursor;.  Mem m;.
1d770 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1d780 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
1d790 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
1d7a0 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73  VVA_ONLY(rc =) s
1d7b0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
1d7c0 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
1d7d0 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
1d7e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
1d7f0 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
1d800 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
1d810 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
1d820 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b  l */.  /* nCellK
1d830 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ey will always b
1d840 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
1d850 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75  0xffffffff becau
1d860 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20  se of the way.  
1d870 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72  ** that btreePar
1d880 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20  seCellPtr() and 
1d890 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
1d8a0 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  32() are impleme
1d8b0 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43  nted */.  if( nC
1d8c0 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65  ellKey<=0 || nCe
1d8d0 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  llKey>0x7fffffff
1d8e0 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
1d8f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1d900 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1d910 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
1d920 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29  m, 0, sizeof(m))
1d930 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1d940 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
1d950 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  (pC->pCursor, 0,
1d960 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20   (u32)nCellKey, 
1d970 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
1d980 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1d990 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20  c;.  }.  *res = 
1d9a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1d9b0 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e  dCompare(m.n, m.
1d9c0 7a 2c 20 70 55 6e 70 61 63 6b 65 64 2c 20 30 29  z, pUnpacked, 0)
1d9d0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
1d9e0 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
1d9f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1da00 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
1da10 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
1da20 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65  e value to be re
1da30 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71  turned by subseq
1da40 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  uent calls to.**
1da50 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
1da60 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  () on the databa
1da70 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20  se handle 'db'. 
1da80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1da90 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73  VdbeSetChanges(s
1daa0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
1dab0 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65  nChange){.  asse
1dac0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1dad0 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
1dae0 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e  ) );.  db->nChan
1daf0 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20  ge = nChange;.  
1db00 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
1db10 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a   += nChange;.}..
1db20 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  /*.** Set a flag
1db30 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20   in the vdbe to 
1db40 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
1db50 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69  e counter when i
1db60 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a  t is finalised.*
1db70 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76  * or reset..*/.v
1db80 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
1db90 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65  ountChanges(Vdbe
1dba0 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67   *v){.  v->chang
1dbb0 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f  eCntOn = 1;.}../
1dbc0 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20  *.** Mark every 
1dbd0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
1dbe0 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
1dbf0 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
1dc00 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65  nnection.** as e
1dc10 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  xpired..**.** An
1dc20 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65   expired stateme
1dc30 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65  nt means that re
1dc40 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
1dc50 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  he statement is.
1dc60 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53  ** recommend.  S
1dc70 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65  tatements expire
1dc80 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70   when things hap
1dc90 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68  pen that make th
1dca0 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20  eir.** programs 
1dcb0 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76  obsolete.  Remov
1dcc0 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ing user-defined
1dcd0 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f   functions or co
1dce0 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
1dcf0 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e  nces, or changin
1dd00 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  g an authorizati
1dd10 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  on function are 
1dd20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20  the types of.** 
1dd30 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65  things that make
1dd40 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
1dd50 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a  ents obsolete..*
1dd60 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1dd70 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
1dd80 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  ements(sqlite3 *
1dd90 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
1dda0 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56    for(p = db->pV
1ddb0 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  dbe; p; p=p->pNe
1ddc0 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69  xt){.    p->expi
1ddd0 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  red = 1;.  }.}..
1dde0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1ddf0 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
1de00 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
1de10 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
1de20 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
1de30 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
1de40 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   v->db;.}../*.**
1de50 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1de60 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
1de70 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20  value structure 
1de80 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
1de90 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61  alue bound.** pa
1dea0 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20  rameter iVar of 
1deb0 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66  VM v. Except, if
1dec0 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e   the value is an
1ded0 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72   SQL NULL, retur
1dee0 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e  n .** 0 instead.
1def0 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55   Unless it is NU
1df00 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69  LL, apply affini
1df10 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74  ty aff (one of t
1df20 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a  he SQLITE_AFF_*.
1df30 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f  ** constants) to
1df40 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72   the value befor
1df50 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a  e returning it..
1df60 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
1df70 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65  ed value must be
1df80 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
1df90 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ller using sqlit
1dfa0 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a  e3ValueFree()..*
1dfb0 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  /.sqlite3_value 
1dfc0 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42  *sqlite3VdbeGetB
1dfd0 6f 75 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a  oundValue(Vdbe *
1dfe0 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20  v, int iVar, u8 
1dff0 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  aff){.  assert( 
1e000 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  iVar>0 );.  if( 
1e010 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  v ){.    Mem *pM
1e020 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56  em = &v->aVar[iV
1e030 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30  ar-1];.    if( 0
1e040 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ==(pMem->flags &
1e050 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20   MEM_Null) ){.  
1e060 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
1e070 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  e *pRet = sqlite
1e080 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29  3ValueNew(v->db)
1e090 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74  ;.      if( pRet
1e0a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1e0b0 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28  te3VdbeMemCopy((
1e0c0 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d  Mem *)pRet, pMem
1e0d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1e0e0 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69  e3ValueApplyAffi
1e0f0 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20  nity(pRet, aff, 
1e100 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
1e110 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e120 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 28 4d  eMemStoreType((M
1e130 65 6d 20 2a 29 70 52 65 74 29 3b 0a 20 20 20 20  em *)pRet);.    
1e140 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1e150 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
1e160 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1e170 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
1e180 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
1e190 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
1e1a0 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
1e1b0 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
1e1c0 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
1e1d0 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
1e1e0 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
1e1f0 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
1e200 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
1e210 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
1e220 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1e230 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
1e240 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
1e250 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
1e260 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32  );.  if( iVar>32
1e270 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
1e280 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  sk = 0xffffffff;
1e290 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
1e2a0 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
1e2b0 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
1e2c0 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
1e2d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1e2e0 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
1e2f0 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
1e300 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
1e310 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
1e320 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
1e330 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
1e340 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
1e350 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
1e360 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
1e370 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
1e380 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
1e390 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
1e3a0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
1e3b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
1e3c0 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
1e3d0 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
1e3e0 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
1e3f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
1e400 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >db;.  sqlite3Db
1e410 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
1e420 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
1e430 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  sg = sqlite3DbSt
1e440 72 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e  rDup(db, pVtab->
1e450 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
1e460 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
1e470 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
1e480 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
1e490 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1e4a0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1e4b0 41 42 4c 45 20 2a 2f 0a                          ABLE */.